summaryrefslogtreecommitdiff
path: root/src/libs/graphics/sdl/sdl1_common.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/graphics/sdl/sdl1_common.c')
-rw-r--r--src/libs/graphics/sdl/sdl1_common.c247
1 files changed, 247 insertions, 0 deletions
diff --git a/src/libs/graphics/sdl/sdl1_common.c b/src/libs/graphics/sdl/sdl1_common.c
new file mode 100644
index 0000000..5c675e1
--- /dev/null
+++ b/src/libs/graphics/sdl/sdl1_common.c
@@ -0,0 +1,247 @@
+//Copyright Paul Reiche, Fred Ford. 1992-2002
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "sdl_common.h"
+#include "opengl.h"
+#include "pure.h"
+#include "primitives.h"
+#include "options.h"
+#include "uqmversion.h"
+#include "libs/graphics/drawcmd.h"
+#include "libs/graphics/dcqueue.h"
+#include "libs/graphics/cmap.h"
+#include "libs/input/sdl/input.h"
+ // for ProcessInputEvent()
+#include "libs/graphics/bbox.h"
+#include "port.h"
+#include "libs/uio.h"
+#include "libs/log.h"
+#include "libs/memlib.h"
+#include "libs/vidlib.h"
+
+#if SDL_MAJOR_VERSION == 1
+
+static void TFB_PreQuit (void);
+
+void
+TFB_PreInit (void)
+{
+ log_add (log_Info, "Initializing base SDL functionality.");
+ log_add (log_Info, "Using SDL version %d.%d.%d (compiled with "
+ "%d.%d.%d)", SDL_Linked_Version ()->major,
+ SDL_Linked_Version ()->minor, SDL_Linked_Version ()->patch,
+ SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_PATCHLEVEL);
+#if 0
+ if (SDL_Linked_Version ()->major != SDL_MAJOR_VERSION ||
+ SDL_Linked_Version ()->minor != SDL_MINOR_VERSION ||
+ SDL_Linked_Version ()->patch != SDL_PATCHLEVEL) {
+ log_add (log_Warning, "The used SDL library is not the same version "
+ "as the one used to compile The Ur-Quan Masters with! "
+ "If you experience any crashes, this would be an excellent "
+ "suspect.");
+ }
+#endif
+
+ if ((SDL_Init (SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE) == -1))
+ {
+ log_add (log_Fatal, "Could not initialize SDL: %s.", SDL_GetError ());
+ exit (EXIT_FAILURE);
+ }
+
+ atexit (TFB_PreQuit);
+}
+
+static void
+TFB_PreQuit (void)
+{
+ SDL_Quit ();
+}
+
+int
+TFB_ReInitGraphics (int driver, int flags, int width, int height)
+{
+ int result;
+ int togglefullscreen = 0;
+ char caption[200];
+
+ if (GfxFlags == (flags ^ TFB_GFXFLAGS_FULLSCREEN) &&
+ driver == GraphicsDriver &&
+ width == ScreenWidthActual && height == ScreenHeightActual)
+ {
+ togglefullscreen = 1;
+ }
+
+ GfxFlags = flags;
+
+ if (driver == TFB_GFXDRIVER_SDL_OPENGL)
+ {
+#ifdef HAVE_OPENGL
+ result = TFB_GL_ConfigureVideo (driver, flags, width, height,
+ togglefullscreen);
+#else
+ driver = TFB_GFXDRIVER_SDL_PURE;
+ log_add (log_Warning, "OpenGL support not compiled in,"
+ " so using pure SDL driver");
+ result = TFB_Pure_ConfigureVideo (driver, flags, width, height,
+ togglefullscreen);
+#endif
+ }
+ else
+ {
+ result = TFB_Pure_ConfigureVideo (driver, flags, width, height,
+ togglefullscreen);
+ }
+
+ sprintf (caption, "The Ur-Quan Masters v%d.%d.%d%s",
+ UQM_MAJOR_VERSION, UQM_MINOR_VERSION,
+ UQM_PATCH_VERSION, UQM_EXTRA_VERSION);
+ SDL_WM_SetCaption (caption, NULL);
+
+ if (flags & TFB_GFXFLAGS_FULLSCREEN)
+ SDL_ShowCursor (SDL_DISABLE);
+ else
+ SDL_ShowCursor (SDL_ENABLE);
+
+ return result;
+}
+
+bool
+TFB_SetGamma (float gamma)
+{
+ return (SDL_SetGamma (gamma, gamma, gamma) == 0);
+}
+
+int
+TFB_HasSurfaceAlphaMod (SDL_Surface *surface)
+{
+ if (!surface)
+ {
+ return 0;
+ }
+ return (surface->flags & SDL_SRCALPHA) ? 1 : 0;
+}
+
+int
+TFB_GetSurfaceAlphaMod (SDL_Surface *surface, Uint8 *alpha)
+{
+ if (!surface || !surface->format || !alpha)
+ {
+ return -1;
+ }
+ if (surface->flags & SDL_SRCALPHA)
+ {
+ *alpha = surface->format->alpha;
+ }
+ else
+ {
+ *alpha = 255;
+ }
+ return 0;
+}
+
+int
+TFB_SetSurfaceAlphaMod (SDL_Surface *surface, Uint8 alpha)
+{
+ if (!surface)
+ {
+ return -1;
+ }
+ return SDL_SetAlpha (surface, SDL_SRCALPHA, alpha);
+}
+
+int
+TFB_DisableSurfaceAlphaMod (SDL_Surface *surface)
+{
+ if (!surface)
+ {
+ return -1;
+ }
+ return SDL_SetAlpha (surface, 0, 255);
+}
+
+int
+TFB_GetColorKey (SDL_Surface *surface, Uint32 *key)
+{
+ if (surface && surface->format && key &&
+ (surface->flags & SDL_SRCCOLORKEY))
+ {
+ *key = surface->format->colorkey;
+ return 0;
+ }
+ return -1;
+}
+
+int
+TFB_SetColorKey (SDL_Surface *surface, Uint32 key, int rleaccel)
+{
+ if (!surface)
+ {
+ return -1;
+ }
+ return SDL_SetColorKey (surface, SDL_SRCCOLORKEY | (rleaccel ? SDL_RLEACCEL : 0), key);
+}
+
+int
+TFB_DisableColorKey (SDL_Surface *surface)
+{
+ if (!surface)
+ {
+ return -1;
+ }
+ return SDL_SetColorKey (surface, 0, 0);
+}
+
+int
+TFB_SetColors (SDL_Surface *surface, SDL_Color *colors, int firstcolor, int ncolors)
+{
+ return SDL_SetColors (surface, colors, firstcolor, ncolors);
+}
+
+int
+TFB_SupportsHardwareScaling (void)
+{
+#ifdef HAVE_OPENGL
+ return 1;
+#else
+ return 0;
+#endif
+}
+
+static SDL_Surface *
+Create_Screen (SDL_Surface *templat, int w, int h)
+{
+ SDL_Surface *newsurf = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h,
+ templat->format->BitsPerPixel,
+ templat->format->Rmask, templat->format->Gmask,
+ templat->format->Bmask, 0);
+ if (newsurf == 0) {
+ log_add (log_Error, "Couldn't create screen buffes: %s",
+ SDL_GetError());
+ }
+ return newsurf;
+}
+
+int
+SDL1_ReInit_Screen (SDL_Surface **screen, SDL_Surface *templat, int w, int h)
+{
+ UnInit_Screen (screen);
+ *screen = Create_Screen (templat, w, h);
+
+ return *screen == 0 ? -1 : 0;
+}
+#endif