rnd-20001125-3-src
[rocksndiamonds.git] / src / system.c
index dd329f1cd6a194276f2223268cce99d15cda19b8..08c2eb5d7d8b206d41a1530d81d71d9874b069a8 100644 (file)
 
 #include "main.h"
 #include "misc.h"
-#include "tools.h"
+
+inline void InitEventFilter(EventFilter filter_function)
+{
+#ifdef TARGET_SDL
+  /* set event filter to filter out certain events */
+  SDL_SetEventFilter(filter_function);
+#endif
+}
+
+inline void InitBufferedDisplay(DrawBuffer *backbuffer, DrawWindow *window)
+{
+#ifdef TARGET_SDL
+  SDLInitBufferedDisplay(backbuffer, window);
+#else
+  X11InitBufferedDisplay(backbuffer, window);
+#endif
+}
+
+inline int GetDisplayDepth(void)
+{
+#ifdef TARGET_SDL
+  return SDL_GetVideoSurface()->format->BitsPerPixel;
+#else
+  return XDefaultDepth(display, screen);
+#endif
+}
+
+inline Bitmap CreateBitmap(int width, int height, int depth)
+{
+  int real_depth = (depth == DEFAULT_DEPTH ? GetDisplayDepth() : depth);
+
+#ifdef TARGET_SDL
+  SDL_Surface *surface_tmp, *surface_native;
+
+  if ((surface_tmp = SDL_CreateRGBSurface(SURFACE_FLAGS, width, height,
+                                         real_depth, 0, 0, 0, 0))
+      == NULL)
+    Error(ERR_EXIT, "SDL_CreateRGBSurface() failed: %s", SDL_GetError());
+
+  if ((surface_native = SDL_DisplayFormat(surface_tmp)) == NULL)
+    Error(ERR_EXIT, "SDL_DisplayFormat() failed: %s", SDL_GetError());
+
+  SDL_FreeSurface(surface_tmp);
+
+  return surface_native;
+#else
+  Pixmap pixmap;
+
+  if (!(pixmap = XCreatePixmap(display, window, width, height, real_depth)))
+    Error(ERR_EXIT, "cannot create pixmap");
+
+  return pixmap;
+#endif
+}
+
+inline void FreeBitmap(Bitmap bitmap)
+{
+#ifdef TARGET_SDL
+  SDL_FreeSurface(bitmap);
+#else
+  XFreePixmap(display, bitmap);
+#endif
+}
 
 inline void ClearRectangle(Bitmap bitmap, int x, int y, int width, int height)
 {
-#ifdef USE_SDL_LIBRARY
+#ifdef TARGET_SDL
   SDLFillRectangle(bitmap, x, y, width, height, 0x000000);
 #else
   XFillRectangle(display, bitmap, gc, x, y, width, height);
@@ -30,7 +92,7 @@ inline void BlitBitmap(Bitmap src_bitmap, Bitmap dst_bitmap,
                       int width, int height,
                       int dst_x, int dst_y)
 {
-#ifdef USE_SDL_LIBRARY
+#ifdef TARGET_SDL
   SDLCopyArea(src_bitmap, dst_bitmap,
              src_x, src_y, width, height, dst_x, dst_y);
 #else
@@ -39,13 +101,13 @@ inline void BlitBitmap(Bitmap src_bitmap, Bitmap dst_bitmap,
 #endif
 }
 
-#ifndef USE_SDL_LIBRARY
+#ifndef TARGET_SDL
 static GC last_clip_gc = 0;    /* needed for XCopyArea() through clip mask */
 #endif
 
 inline void SetClipMask(GC clip_gc, Pixmap clip_pixmap)
 {
-#ifndef USE_SDL_LIBRARY
+#ifndef TARGET_SDL
   XSetClipMask(display, clip_gc, clip_pixmap);
   last_clip_gc = clip_gc;
 #endif
@@ -53,7 +115,7 @@ inline void SetClipMask(GC clip_gc, Pixmap clip_pixmap)
 
 inline void SetClipOrigin(GC clip_gc, int clip_x, int clip_y)
 {
-#ifndef USE_SDL_LIBRARY
+#ifndef TARGET_SDL
   XSetClipOrigin(display, clip_gc, clip_x, clip_y);
   last_clip_gc = clip_gc;
 #endif
@@ -64,7 +126,7 @@ inline void BlitBitmapMasked(Bitmap src_bitmap, Bitmap dst_bitmap,
                             int width, int height,
                             int dst_x, int dst_y)
 {
-#ifdef USE_SDL_LIBRARY
+#ifdef TARGET_SDL
   SDLCopyArea(src_bitmap, dst_bitmap,
              src_x, src_y, width, height, dst_x, dst_y);
 #else
@@ -76,7 +138,7 @@ inline void BlitBitmapMasked(Bitmap src_bitmap, Bitmap dst_bitmap,
 inline void DrawSimpleWhiteLine(Bitmap bitmap, int from_x, int from_y,
                                int to_x, int to_y)
 {
-#ifdef USE_SDL_LIBRARY
+#ifdef TARGET_SDL
   SDLDrawSimpleLine(bitmap, from_x, from_y, to_x, to_y, 0xffffff);
 #else
   XSetForeground(display, gc, WhitePixel(display, screen));
@@ -88,7 +150,7 @@ inline void DrawSimpleWhiteLine(Bitmap bitmap, int from_x, int from_y,
 /* execute all pending screen drawing operations */
 inline void FlushDisplay(void)
 {
-#ifndef USE_SDL_LIBRARY
+#ifndef TARGET_SDL
   XFlush(display);
 #endif
 }
@@ -96,14 +158,14 @@ inline void FlushDisplay(void)
 /* execute and wait for all pending screen drawing operations */
 inline void SyncDisplay(void)
 {
-#ifndef USE_SDL_LIBRARY
+#ifndef TARGET_SDL
   XSync(display, FALSE);
 #endif
 }
 
 inline void KeyboardAutoRepeatOn(void)
 {
-#ifdef USE_SDL_LIBRARY
+#ifdef TARGET_SDL
   SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY / 2,
                      SDL_DEFAULT_REPEAT_INTERVAL / 2);
   SDL_EnableUNICODE(1);
@@ -114,7 +176,7 @@ inline void KeyboardAutoRepeatOn(void)
 
 inline void KeyboardAutoRepeatOff(void)
 {
-#ifdef USE_SDL_LIBRARY
+#ifdef TARGET_SDL
   SDL_EnableKeyRepeat(0, SDL_DEFAULT_REPEAT_INTERVAL);
   SDL_EnableUNICODE(0);
 #else
@@ -124,7 +186,7 @@ inline void KeyboardAutoRepeatOff(void)
 
 inline boolean PointerInWindow(DrawWindow window)
 {
-#ifdef USE_SDL_LIBRARY
+#ifdef TARGET_SDL
   return TRUE;
 #else
   DrawWindow root, child;
@@ -141,7 +203,7 @@ inline boolean PointerInWindow(DrawWindow window)
 
 inline boolean PendingEvent(void)
 {
-#ifdef USE_SDL_LIBRARY
+#ifdef TARGET_SDL
   return (SDL_PollEvent(NULL) ? TRUE : FALSE);
 #else
   return (XPending(display) ? TRUE : FALSE);
@@ -150,7 +212,7 @@ inline boolean PendingEvent(void)
 
 inline void NextEvent(Event *event)
 {
-#ifdef USE_SDL_LIBRARY
+#ifdef TARGET_SDL
   SDL_WaitEvent(event);
 #else
   XNextEvent(display, event);
@@ -159,7 +221,7 @@ inline void NextEvent(Event *event)
 
 inline Key GetEventKey(KeyEvent *event, boolean with_modifiers)
 {
-#ifdef USE_SDL_LIBRARY
+#ifdef TARGET_SDL
 #if 0
   printf("unicode == '%d', sym == '%d', mod == '0x%04x'\n",
         (int)event->keysym.unicode,
@@ -187,63 +249,11 @@ inline Key GetEventKey(KeyEvent *event, boolean with_modifiers)
 
 inline boolean SetVideoMode(void)
 {
+#ifdef TARGET_SDL
+  return SDLSetVideoMode(&backbuffer);
+#else
   boolean success = TRUE;
 
-#ifdef USE_SDL_LIBRARY
-  if (setup.fullscreen && !fullscreen_enabled && fullscreen_available)
-  {
-    /* switch display to fullscreen mode, if available */
-    DrawWindow window_old = window;
-    DrawWindow window_new;
-
-    if ((window_new = SDL_SetVideoMode(WIN_XSIZE, WIN_YSIZE, WIN_SDL_DEPTH,
-                                      SDL_HWSURFACE|SDL_FULLSCREEN))
-       == NULL)
-    {
-      /* switching display to fullscreen mode failed */
-      Error(ERR_WARN, "SDL_SetVideoMode() failed: %s", SDL_GetError());
-
-      /* do not try it again */
-      fullscreen_available = FALSE;
-      success = FALSE;
-    }
-    else
-    {
-      if (window_old)
-       SDL_FreeSurface(window_old);
-      window = window_new;
-
-      fullscreen_enabled = TRUE;
-      success = TRUE;
-    }
-  }
-
-  if ((!setup.fullscreen && fullscreen_enabled) || !window)
-  {
-    /* switch display to window mode */
-    DrawWindow window_old = window;
-    DrawWindow window_new;
-
-    if ((window_new = SDL_SetVideoMode(WIN_XSIZE, WIN_YSIZE, WIN_SDL_DEPTH,
-                                      SDL_HWSURFACE))
-       == NULL)
-    {
-      /* switching display to window mode failed -- should not happen */
-      Error(ERR_WARN, "SDL_SetVideoMode() failed: %s", SDL_GetError());
-
-      success = FALSE;
-    }
-    else
-    {
-      if (window_old)
-       SDL_FreeSurface(window_old);
-      window = window_new;
-
-      fullscreen_enabled = FALSE;
-      success = TRUE;
-    }
-  }
-#else
   if (setup.fullscreen && fullscreen_available)
   {
     Error(ERR_WARN, "fullscreen not available in X11 version");
@@ -253,24 +263,32 @@ inline boolean SetVideoMode(void)
 
     success = FALSE;
   }
-#endif
 
   return success;
+#endif
 }
 
 inline void ChangeVideoModeIfNeeded(void)
 {
-#ifdef USE_SDL_LIBRARY
+#ifdef TARGET_SDL
   if ((setup.fullscreen && !fullscreen_enabled && fullscreen_available) ||
       (!setup.fullscreen && fullscreen_enabled))
     SetVideoMode();
-  SetDrawtoField(DRAW_BACKBUFFER);
+#endif
+}
+
+inline boolean InitAudio(void)
+{
+#ifdef TARGET_SDL
+  return SDLInitAudio();
+#else
+  return TRUE;
 #endif
 }
 
 inline void dummy(void)
 {
-#ifdef USE_SDL_LIBRARY
+#ifdef TARGET_SDL
 #else
 #endif
 }