rnd-20030403-3-src
[rocksndiamonds.git] / src / libgame / sdl.c
index c6f4da020f4defcf35b43eb20f2bdd331ddcb9d1..635816c7a0796be538506859fb57c5a4e0806804 100644 (file)
@@ -40,6 +40,8 @@ static int video_yoffset;
 
 inline void SDLInitVideoDisplay(void)
 {
+  putenv("SDL_VIDEO_CENTERED=1");
+
   /* initialize SDL video */
   if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0)
     Error(ERR_EXIT, "SDL_InitSubSystem() failed: %s", SDL_GetError());
@@ -173,7 +175,7 @@ inline boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen)
 inline void SDLCopyArea(Bitmap *src_bitmap, Bitmap *dst_bitmap,
                        int src_x, int src_y,
                        int width, int height,
-                       int dst_x, int dst_y, int copy_mode)
+                       int dst_x, int dst_y, int mask_mode)
 {
   Bitmap *real_dst_bitmap = (dst_bitmap == window ? backbuffer : dst_bitmap);
   SDL_Rect src_rect, dst_rect;
@@ -205,7 +207,7 @@ inline void SDLCopyArea(Bitmap *src_bitmap, Bitmap *dst_bitmap,
   dst_rect.h = height;
 
   if (src_bitmap != backbuffer || dst_bitmap != window)
-    SDL_BlitSurface((copy_mode == SDLCOPYAREA_MASKED ?
+    SDL_BlitSurface((mask_mode == BLIT_MASKED ?
                     src_bitmap->surface_masked : src_bitmap->surface),
                    &src_rect, real_dst_bitmap->surface, &dst_rect);
 
@@ -214,13 +216,15 @@ inline void SDLCopyArea(Bitmap *src_bitmap, Bitmap *dst_bitmap,
 }
 
 inline void SDLFillRectangle(Bitmap *dst_bitmap, int x, int y,
-                            int width, int height, unsigned int color)
+                            int width, int height, Uint32 color)
 {
   Bitmap *real_dst_bitmap = (dst_bitmap == window ? backbuffer : dst_bitmap);
   SDL_Rect rect;
-  unsigned int color_r = (color >> 16) && 0xff;
-  unsigned int color_g = (color >>  8) && 0xff;
-  unsigned int color_b = (color >>  0) && 0xff;
+#if 0
+  unsigned int color_r = (color >> 16) & 0xff;
+  unsigned int color_g = (color >>  8) & 0xff;
+  unsigned int color_b = (color >>  0) & 0xff;
+#endif
 
 #ifdef FULLSCREEN_BUG
   if (dst_bitmap == backbuffer || dst_bitmap == window)
@@ -235,22 +239,28 @@ inline void SDLFillRectangle(Bitmap *dst_bitmap, int x, int y,
   rect.w = width;
   rect.h = height;
 
+#if 1
+  SDL_FillRect(real_dst_bitmap->surface, &rect, color);
+#else
   SDL_FillRect(real_dst_bitmap->surface, &rect,
               SDL_MapRGB(real_dst_bitmap->surface->format,
                          color_r, color_g, color_b));
+#endif
 
   if (dst_bitmap == window)
     SDL_UpdateRect(backbuffer->surface, x, y, width, height);
 }
 
 inline void SDLDrawSimpleLine(Bitmap *dst_bitmap, int from_x, int from_y,
-                             int to_x, int to_y, unsigned int color)
+                             int to_x, int to_y, Uint32 color)
 {
   SDL_Surface *surface = dst_bitmap->surface;
   SDL_Rect rect;
+#if 0
   unsigned int color_r = (color >> 16) & 0xff;
   unsigned int color_g = (color >>  8) & 0xff;
   unsigned int color_b = (color >>  0) & 0xff;
+#endif
 
   if (from_x > to_x)
     swap_numbers(&from_x, &to_x);
@@ -271,8 +281,12 @@ inline void SDLDrawSimpleLine(Bitmap *dst_bitmap, int from_x, int from_y,
   }
 #endif
 
+#if 1
+  SDL_FillRect(surface, &rect, color);
+#else
   SDL_FillRect(surface, &rect,
                SDL_MapRGB(surface->format, color_r, color_g, color_b));
+#endif
 }
 
 inline void SDLDrawLine(Bitmap *dst_bitmap, int from_x, int from_y,
@@ -829,14 +843,6 @@ void sge_LineRGB(SDL_Surface *Surface, Sint16 x1, Sint16 y1, Sint16 x2,
 /* http://www.ferzkopp.net/Software/SDL_gfx-2.0/index.html                   */
 /* ========================================================================= */
 
-typedef struct
-{
-  Uint8 r;
-  Uint8 g;
-  Uint8 b;
-  Uint8 a;
-} tColorRGBA;
-
 /*
   -----------------------------------------------------------------------------
   32 bit zoomer
@@ -845,6 +851,14 @@ typedef struct
   -----------------------------------------------------------------------------
 */
 
+typedef struct
+{
+  Uint8 r;
+  Uint8 g;
+  Uint8 b;
+  Uint8 a;
+} tColorRGBA;
+
 int zoomSurfaceRGBA(SDL_Surface *src, SDL_Surface *dst)
 {
   int x, y, sx, sy, *sax, *say, *csax, *csay, csx, csy;
@@ -1028,32 +1042,10 @@ int zoomSurfaceY(SDL_Surface * src, SDL_Surface * dst)
   -----------------------------------------------------------------------------
 */
 
-void zoomSurfaceSize(int width, int height, float zoom_x, float zoom_y,
-                    int *dst_width, int *dst_height)
-{
-  const float value_limit = 0.001;
-
-  /* sanity check zoom factors */
-  if (zoom_x < value_limit)
-    zoom_x = value_limit;
-  if (zoom_y < value_limit)
-    zoom_y = value_limit;
-
-  /* calculate target size */
-  *dst_width  = (int) ((float) width  * zoom_x);
-  *dst_height = (int) ((float) height * zoom_y);
-
-  if (*dst_width < 1)
-    *dst_width = 1;
-  if (*dst_height < 1)
-    *dst_height = 1;
-}
-
-SDL_Surface *zoomSurface(SDL_Surface *src, float zoom_x, float zoom_y)
+SDL_Surface *zoomSurface(SDL_Surface *src, int dst_width, int dst_height)
 {
   SDL_Surface *zoom_src = NULL;
   SDL_Surface *zoom_dst = NULL;
-  int dst_width, dst_height;
   boolean is_converted = FALSE;
   boolean is_32bit;
   int i;
@@ -1079,10 +1071,6 @@ SDL_Surface *zoomSurface(SDL_Surface *src, float zoom_x, float zoom_y)
     is_converted = TRUE;
   }
 
-  /* get size of destination surface */
-  zoomSurfaceSize(zoom_src->w, zoom_src->h, zoom_x, zoom_y,
-                 &dst_width, &dst_height);
-
   /* allocate surface to completely contain the zoomed surface */
   if (is_32bit)
   {
@@ -1131,9 +1119,23 @@ SDL_Surface *zoomSurface(SDL_Surface *src, float zoom_x, float zoom_y)
   return zoom_dst;
 }
 
-SDL_Surface *SDLZoomSurface(SDL_Surface *src, float zoom_x, float zoom_y)
+void SDLZoomBitmap(Bitmap *src_bitmap, Bitmap *dst_bitmap)
 {
-  return zoomSurface(src, zoom_x, zoom_y);
+  SDL_Surface *sdl_surface_tmp;
+  int dst_width = dst_bitmap->width;
+  int dst_height = dst_bitmap->height;
+
+  /* throw away old destination surface */
+  SDL_FreeSurface(dst_bitmap->surface);
+
+  /* create zoomed temporary surface from source surface */
+  sdl_surface_tmp = zoomSurface(src_bitmap->surface, dst_width, dst_height);
+
+  /* create native format destination surface from zoomed temporary surface */
+  dst_bitmap->surface = SDL_DisplayFormat(sdl_surface_tmp);
+
+  /* free temporary surface */
+  SDL_FreeSurface(sdl_surface_tmp);
 }
 
 
@@ -1185,6 +1187,9 @@ Bitmap *SDLLoadImage(char *filename)
 
 inline void SDLOpenAudio(void)
 {
+  if (strcmp(setup.system.sdl_audiodriver, ARG_DEFAULT) != 0)
+    putenv(getStringCat2("SDL_AUDIODRIVER=", setup.system.sdl_audiodriver));
+
   if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0)
   {
     Error(ERR_WARN, "SDL_InitSubSystem() failed: %s", SDL_GetError());
@@ -1193,7 +1198,7 @@ inline void SDLOpenAudio(void)
 
   if (Mix_OpenAudio(DEFAULT_AUDIO_SAMPLE_RATE, MIX_DEFAULT_FORMAT,
                    AUDIO_NUM_CHANNELS_STEREO,
-                   DEFAULT_AUDIO_FRAGMENT_SIZE) < 0)
+                   setup.system.audio_fragment_size) < 0)
   {
     Error(ERR_WARN, "Mix_OpenAudio() failed: %s", SDL_GetError());
     return;