rnd-20020315-1-src
authorHolger Schemel <info@artsoft.org>
Fri, 15 Mar 2002 03:58:42 +0000 (04:58 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:36:11 +0000 (10:36 +0200)
CHANGES
src/libgame/sdl.c
src/libgame/sdl.h
src/libgame/sound.h
src/libgame/system.c

diff --git a/CHANGES b/CHANGES
index 794fcea718f9ac7787cf82599c331fd159fd8479..519011619b80cdadc8bc9515f85928438948179b 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -6,8 +6,9 @@ Release Version 2.0.1 [?? ??? 2002]
          + infotrons kill electrons and snik snaks and trigger orange disks
          + explosion chain reactions are now a bit slower than murphy
        - behaviour of robots adjusted to make them less aggressive
-        - icon for Windows executable added
-        - bug when selecting default level series fixed
+       - icon for Windows executable added
+       - bug when selecting default level series fixed
+       - Windows fullscreen bug fixed (workaround for bug in SDL)
 
 Release Version 2.0.0 [01 JAN 2001]
 -----------------------------------
index 8c0eff67376821d860115f1ee2be9ece494347f9..2441ede36ab217a67d3b8a760c9133fd7c91fcaf 100644 (file)
 /* video functions                                                           */
 /* ========================================================================= */
 
+/* functions from SGE library */
+inline void sge_Line(SDL_Surface *, Sint16, Sint16, Sint16, Sint16, Uint32);
+
+#ifdef PLATFORM_WIN32
+#define FULLSCREEN_BUG
+#endif
+
+/* stuff needed to work around SDL/Windows fullscreen drawing bug */
+static int fullscreen_width;
+static int fullscreen_height;
+static int fullscreen_xoffset;
+static int fullscreen_yoffset;
+static int video_xoffset;
+static int video_yoffset;
+
 inline void SDLInitVideoDisplay(void)
 {
   /* initialize SDL video */
@@ -35,6 +50,38 @@ inline void SDLInitVideoDisplay(void)
 inline void SDLInitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window,
                               boolean fullscreen)
 {
+#ifdef FULLSCREEN_BUG
+  int i;
+  static int screen_xy[][2] =
+  {
+    {  640, 480 },
+    {  800, 600 },
+    { 1024, 768 },
+    {   -1,  -1 }
+  };
+#endif
+
+  /* default: normal game window size */
+  fullscreen_width = video.width;
+  fullscreen_height = video.height;
+  fullscreen_xoffset = 0;
+  fullscreen_yoffset = 0;
+
+#ifdef FULLSCREEN_BUG
+  for (i=0; screen_xy[i][0] != -1; i++)
+  {
+    if (video.width <= screen_xy[i][0] && video.height <= screen_xy[i][1])
+    {
+      fullscreen_width = screen_xy[i][0];
+      fullscreen_height = screen_xy[i][1];
+      break;
+    }
+  }
+
+  fullscreen_xoffset = (fullscreen_width - video.width) / 2;
+  fullscreen_yoffset = (fullscreen_height - video.height) / 2;
+#endif
+
   /* open SDL video output device (window or fullscreen mode) */
   if (!SDLSetVideoMode(backbuffer, fullscreen))
     Error(ERR_EXIT, "setting video mode failed");
@@ -71,8 +118,11 @@ inline boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen)
 
   if (fullscreen && !video.fullscreen_enabled && video.fullscreen_available)
   {
+    video_xoffset = fullscreen_xoffset;
+    video_yoffset = fullscreen_yoffset;
+
     /* switch display to fullscreen mode, if available */
-    if ((new_surface = SDL_SetVideoMode(video.width, video.height,
+    if ((new_surface = SDL_SetVideoMode(fullscreen_width, fullscreen_height,
                                        video.depth, surface_flags_fullscreen))
        == NULL)
     {
@@ -94,6 +144,9 @@ inline boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen)
 
   if ((!fullscreen && video.fullscreen_enabled) || new_surface == NULL)
   {
+    video_xoffset = 0;
+    video_yoffset = 0;
+
     /* switch display to window mode */
     if ((new_surface = SDL_SetVideoMode(video.width, video.height,
                                        video.depth, surface_flags_window))
@@ -124,11 +177,27 @@ inline void SDLCopyArea(Bitmap *src_bitmap, Bitmap *dst_bitmap,
   Bitmap *real_dst_bitmap = (dst_bitmap == window ? backbuffer : dst_bitmap);
   SDL_Rect src_rect, dst_rect;
 
+#ifdef FULLSCREEN_BUG
+  if (src_bitmap == backbuffer)
+  {
+    src_x += video_xoffset;
+    src_y += video_yoffset;
+  }
+#endif
+
   src_rect.x = src_x;
   src_rect.y = src_y;
   src_rect.w = width;
   src_rect.h = height;
 
+#ifdef FULLSCREEN_BUG
+  if (dst_bitmap == backbuffer || dst_bitmap == window)
+  {
+    dst_x += video_xoffset;
+    dst_y += video_yoffset;
+  }
+#endif
+
   dst_rect.x = dst_x;
   dst_rect.y = dst_y;
   dst_rect.w = width;
@@ -152,6 +221,14 @@ inline void SDLFillRectangle(Bitmap *dst_bitmap, int x, int y,
   unsigned int color_g = (color >>  8) && 0xff;
   unsigned int color_b = (color >>  0) && 0xff;
 
+#ifdef FULLSCREEN_BUG
+  if (dst_bitmap == backbuffer || dst_bitmap == window)
+  {
+    x += video_xoffset;
+    y += video_yoffset;
+  }
+#endif
+
   rect.x = x;
   rect.y = y;
   rect.w = width;
@@ -165,9 +242,10 @@ inline void SDLFillRectangle(Bitmap *dst_bitmap, int x, int y,
     SDL_UpdateRect(backbuffer->surface, x, y, width, height);
 }
 
-inline void SDLDrawSimpleLine(SDL_Surface *surface, int from_x, int from_y,
+inline void SDLDrawSimpleLine(Bitmap *dst_bitmap, int from_x, int from_y,
                              int to_x, int to_y, unsigned int color)
 {
+  SDL_Surface *surface = dst_bitmap->surface;
   SDL_Rect rect;
   unsigned int color_r = (color >> 16) & 0xff;
   unsigned int color_g = (color >>  8) & 0xff;
@@ -184,14 +262,32 @@ inline void SDLDrawSimpleLine(SDL_Surface *surface, int from_x, int from_y,
   rect.w = (to_x - from_x + 1);
   rect.h = (to_y - from_y + 1);
 
+#ifdef FULLSCREEN_BUG
+  if (dst_bitmap == backbuffer || dst_bitmap == window)
+  {
+    rect.x += video_xoffset;
+    rect.y += video_yoffset;
+  }
+#endif
+
   SDL_FillRect(surface, &rect,
                SDL_MapRGB(surface->format, color_r, color_g, color_b));
 }
 
-inline void SDLDrawLine(SDL_Surface *surface, int from_x, int from_y,
+inline void SDLDrawLine(Bitmap *dst_bitmap, int from_x, int from_y,
                        int to_x, int to_y, Uint32 color)
 {
-  sge_Line(surface, from_x, from_y, to_x, to_y, color);
+#ifdef FULLSCREEN_BUG
+  if (dst_bitmap == backbuffer || dst_bitmap == window)
+  {
+    from_x += video_xoffset;
+    from_y += video_yoffset;
+    to_x += video_xoffset;
+    to_y += video_yoffset;
+  }
+#endif
+
+  sge_Line(dst_bitmap->surface, from_x, from_y, to_x, to_y, color);
 }
 
 #if 0
@@ -746,4 +842,40 @@ inline void SDLCloseAudio(void)
   SDL_QuitSubSystem(SDL_INIT_AUDIO);
 }
 
+
+/* ========================================================================= */
+/* event functions                                                           */
+/* ========================================================================= */
+
+inline void SDLNextEvent(Event *event)
+{
+  SDL_WaitEvent(event);
+
+#ifdef FULLSCREEN_BUG
+  if (event->type == EVENT_BUTTONPRESS ||
+      event->type == EVENT_BUTTONRELEASE)
+  {
+    if (((ButtonEvent *)event)->x > video_xoffset)
+      ((ButtonEvent *)event)->x -= video_xoffset;
+    else
+      ((ButtonEvent *)event)->x = 0;
+    if (((ButtonEvent *)event)->y > video_yoffset)
+      ((ButtonEvent *)event)->y -= video_yoffset;
+    else
+      ((ButtonEvent *)event)->y = 0;
+  }
+  else if (event->type == EVENT_MOTIONNOTIFY)
+  {
+    if (((ButtonEvent *)event)->x > video_xoffset)
+      ((ButtonEvent *)event)->x -= video_xoffset;
+    else
+      ((ButtonEvent *)event)->x = 0;
+    if (((ButtonEvent *)event)->y > video_yoffset)
+      ((ButtonEvent *)event)->y -= video_yoffset;
+    else
+      ((ButtonEvent *)event)->y = 0;
+  }
+#endif
+}
+
 #endif /* TARGET_SDL */
index cc14ea056ac5fea328b5d77b6a33b4ec621c8e00..7db0dc2c38ca30a3853009d0b96feca4cd03a40e 100644 (file)
@@ -319,14 +319,14 @@ inline void SDLInitVideoBuffer(DrawBuffer **, DrawWindow **, boolean);
 inline boolean SDLSetVideoMode(DrawBuffer **, boolean);
 inline void SDLCopyArea(Bitmap *, Bitmap *, int, int, int, int, int, int, int);
 inline void SDLFillRectangle(Bitmap *, int, int, int, int, unsigned int);
-inline void SDLDrawSimpleLine(SDL_Surface *, int, int, int, int, unsigned int);
-inline void SDLDrawLine(SDL_Surface *, int, int, int, int, Uint32);
-/* functions from SGE library */
-void sge_Line(SDL_Surface *, Sint16, Sint16, Sint16, Sint16, Uint32);
+inline void SDLDrawSimpleLine(Bitmap *, int, int, int, int, unsigned int);
+inline void SDLDrawLine(Bitmap *, int, int, int, int, Uint32);
 
 Bitmap *SDLLoadImage(char *);
 
 inline void SDLOpenAudio(void);
 inline void SDLCloseAudio(void);
 
+inline void SDLNextEvent(Event *);
+
 #endif /* SDL_H */
index 0c4f141a67a3da8c87ab6479f161122b4a2b976d..939e5a0045bfc718bdeb2ff9b99f90bc350db22f 100644 (file)
@@ -51,7 +51,7 @@
 #if defined(TARGET_SDL)
 /* one second fading interval == 1000 ticks (milliseconds) */
 #define SOUND_FADING_INTERVAL                  1000
-#define SOUND_MAX_VOLUME                       (SDL_MIX_MAXVOLUME / 4)
+#define SOUND_MAX_VOLUME                       SDL_MIX_MAXVOLUME
 #endif
 
 #if defined(AUDIO_STREAMING_DSP)
index 51b38c16862237ef181c707aacdc6e1a4eb19785..bd9fc229206806112c19f051eb9e02d0615018bc 100644 (file)
@@ -375,7 +375,7 @@ inline void DrawSimpleWhiteLine(Bitmap *bitmap, int from_x, int from_y,
                                int to_x, int to_y)
 {
 #ifdef TARGET_SDL
-  SDLDrawSimpleLine(bitmap->surface, from_x, from_y, to_x, to_y, 0xffffff);
+  SDLDrawSimpleLine(bitmap, from_x, from_y, to_x, to_y, 0xffffff);
 #else
   XSetForeground(display, bitmap->gc, WhitePixel(display, screen));
   XDrawLine(display, bitmap->drawable, bitmap->gc, from_x, from_y, to_x, to_y);
@@ -403,8 +403,8 @@ inline void DrawLine(Bitmap *bitmap, int from_x, int from_y,
        continue;
 
 #if defined(TARGET_SDL)
-      sge_Line(bitmap->surface,
-              from_x + dx, from_y + dy, to_x + dx, to_y + dy, pixel);
+      SDLDrawLine(bitmap,
+                 from_x + dx, from_y + dy, to_x + dx, to_y + dy, pixel);
 #elif defined(TARGET_ALLEGRO)
       AllegroDrawLine(bitmap->drawable, from_x + dx, from_y + dy,
                      to_x + dx, to_y + dy, pixel);
@@ -653,7 +653,7 @@ inline boolean PendingEvent(void)
 inline void NextEvent(Event *event)
 {
 #ifdef TARGET_SDL
-  SDL_WaitEvent(event);
+  SDLNextEvent(event);
 #else
   XNextEvent(display, event);
 #endif