cleanup of unnecessarily convoluted function call
[rocksndiamonds.git] / src / libgame / sdl.c
index 068057657818719405bc43dacc8646b6b435013a..d664eecc01df267ae8a86aff5f04e29cb43abbdc 100644 (file)
@@ -62,14 +62,18 @@ static void FinalizeScreen(int draw_target)
   if (gfx.draw_global_anim_function != NULL)
     gfx.draw_global_anim_function(draw_target, DRAW_GLOBAL_ANIM_STAGE_2);
 
-  // copy tile selection cursor to render target buffer, if defined (above all)
+  // copy tile selection cursor to render target buffer, if defined (part 1)
   if (gfx.draw_tile_cursor_function != NULL)
-    gfx.draw_tile_cursor_function(draw_target);
+    gfx.draw_tile_cursor_function(draw_target, TRUE);
 
   // copy envelope request to render target buffer, if needed (above all)
   if (gfx.draw_envelope_request_function != NULL)
     gfx.draw_envelope_request_function(draw_target);
 
+  // copy tile selection cursor to render target buffer, if defined (part 2)
+  if (gfx.draw_tile_cursor_function != NULL)
+    gfx.draw_tile_cursor_function(draw_target, FALSE);
+
   // copy global animations to render target buffer, if defined (mouse pointer)
   if (gfx.draw_global_anim_function != NULL)
     gfx.draw_global_anim_function(draw_target, DRAW_GLOBAL_ANIM_STAGE_3);
@@ -411,6 +415,25 @@ const char *SDLGetRendererName(void)
   return renderer_info.name;
 }
 
+static SDL_Surface *SDLGetOpaqueSurface(SDL_Surface *surface)
+{
+  SDL_Surface *new_surface;
+
+  if (surface == NULL)
+    return NULL;
+
+  if ((new_surface = SDLGetNativeSurface(surface)) == NULL)
+    Fail("SDLGetNativeSurface() failed");
+
+  // remove alpha channel from native non-transparent surface, if defined
+  SDLSetAlpha(new_surface, FALSE, 0);
+
+  // remove transparent color from native non-transparent surface, if defined
+  SDL_SetColorKey(new_surface, UNSET_TRANSPARENT_PIXEL, 0);
+
+  return new_surface;
+}
+
 SDL_Surface *SDLGetNativeSurface(SDL_Surface *surface)
 {
   SDL_PixelFormat format;
@@ -464,6 +487,51 @@ boolean SDLSetNativeSurface(SDL_Surface **surface)
   return TRUE;
 }
 
+SDL_Surface *SDLCreateNativeSurface(int width, int height, int depth)
+{
+  if (program.headless)
+    return NULL;
+
+  SDL_Surface *surface = SDL_CreateRGBSurface(SURFACE_FLAGS, width, height, depth, 0,0,0, 0);
+
+  if (surface == NULL)
+    Fail("SDL_CreateRGBSurface() failed: %s", SDL_GetError());
+
+  SDLSetNativeSurface(&surface);
+
+  return surface;
+}
+
+Bitmap *SDLGetBitmapFromSurface_WithMaskedColor(SDL_Surface *surface, int r, int g, int b)
+{
+  int width  = surface->w;
+  int height = surface->h;
+  int depth  = video.default_depth;
+  Bitmap *bitmap = CreateBitmap(width, height, depth);
+
+  // free default surface (not needed anymore)
+  SDL_FreeSurface(bitmap->surface);
+
+  // get native, non-transparent surface from original surface
+  bitmap->surface = SDLGetOpaqueSurface(surface);
+
+  // get native, potentially transparent surface from original surface
+  bitmap->surface_masked = SDLGetNativeSurface(surface);
+
+  // set black pixel to transparent if no alpha channel / transparent color
+  if (!SDLHasAlpha(bitmap->surface_masked) &&
+      !SDLHasColorKey(bitmap->surface_masked))
+    SDL_SetColorKey(bitmap->surface_masked, SET_TRANSPARENT_PIXEL,
+                   SDL_MapRGB(bitmap->surface_masked->format, r, g, b));
+
+  return bitmap;
+}
+
+Bitmap *SDLGetBitmapFromSurface(SDL_Surface *surface)
+{
+  return SDLGetBitmapFromSurface_WithMaskedColor(surface, 0x00, 0x00, 0x00);
+}
+
 static SDL_Texture *SDLCreateTextureFromSurface(SDL_Surface *surface)
 {
   if (program.headless)
@@ -976,23 +1044,6 @@ void SDLRedrawWindow(void)
   UpdateScreen_WithoutFrameDelay(NULL);
 }
 
-void SDLCreateBitmapContent(Bitmap *bitmap, int width, int height,
-                           int depth)
-{
-  if (program.headless)
-    return;
-
-  SDL_Surface *surface =
-    SDL_CreateRGBSurface(SURFACE_FLAGS, width, height, depth, 0,0,0, 0);
-
-  if (surface == NULL)
-    Fail("SDL_CreateRGBSurface() failed: %s", SDL_GetError());
-
-  SDLSetNativeSurface(&surface);
-
-  bitmap->surface = surface;
-}
-
 void SDLFreeBitmapPointers(Bitmap *bitmap)
 {
   if (bitmap->surface)
@@ -1459,7 +1510,7 @@ void SDLDrawLines(SDL_Surface *surface, struct XY *points,
          continue;
 
        sge_Line(surface, points[i].x + dx, points[i].y + dy,
-                points[i+1].x + dx, points[i+1].y + dy, color);
+                points[i + 1].x + dx, points[i + 1].y + dy, color);
       }
     }
   }
@@ -2231,7 +2282,7 @@ static int zoomSurfaceY(SDL_Surface * src, SDL_Surface * dst)
 }
 
 // ----------------------------------------------------------------------------
-// zoomSurface()
+// SDLZoomSurface()
 //
 // Zooms a 32bit or 8bit 'src' surface to newly created 'dst' surface.
 // 'zoomx' and 'zoomy' are scaling factors for width and height.
@@ -2239,7 +2290,7 @@ static int zoomSurfaceY(SDL_Surface * src, SDL_Surface * dst)
 // into a 32bit RGBA format on the fly.
 // ----------------------------------------------------------------------------
 
-static SDL_Surface *zoomSurface(SDL_Surface *src, int dst_width, int dst_height)
+SDL_Surface *SDLZoomSurface(SDL_Surface *src, int dst_width, int dst_height)
 {
   SDL_Surface *zoom_src = NULL;
   SDL_Surface *zoom_dst = NULL;
@@ -2318,25 +2369,6 @@ static SDL_Surface *zoomSurface(SDL_Surface *src, int dst_width, int dst_height)
   return zoom_dst;
 }
 
-static SDL_Surface *SDLGetOpaqueSurface(SDL_Surface *surface)
-{
-  SDL_Surface *new_surface;
-
-  if (surface == NULL)
-    return NULL;
-
-  if ((new_surface = SDLGetNativeSurface(surface)) == NULL)
-    Fail("SDLGetNativeSurface() failed");
-
-  // remove alpha channel from native non-transparent surface, if defined
-  SDLSetAlpha(new_surface, FALSE, 0);
-
-  // remove transparent color from native non-transparent surface, if defined
-  SDL_SetColorKey(new_surface, UNSET_TRANSPARENT_PIXEL, 0);
-
-  return new_surface;
-}
-
 Bitmap *SDLZoomBitmap(Bitmap *src_bitmap, int dst_width, int dst_height)
 {
   Bitmap *dst_bitmap = CreateBitmapStruct();
@@ -2350,7 +2382,7 @@ Bitmap *SDLZoomBitmap(Bitmap *src_bitmap, int dst_width, int dst_height)
   dst_bitmap->height = dst_height;
 
   // create zoomed temporary surface from source surface
-  dst_surface = zoomSurface(src_surface, dst_width, dst_height);
+  dst_surface = SDLZoomSurface(src_surface, dst_width, dst_height);
 
   // create native format destination surface from zoomed temporary surface
   SDLSetNativeSurface(&dst_surface);
@@ -2485,8 +2517,10 @@ void SDLOpenAudio(void)
     return;
   }
 
-  if (Mix_OpenAudio(DEFAULT_AUDIO_SAMPLE_RATE, MIX_DEFAULT_FORMAT,
-                   AUDIO_NUM_CHANNELS_STEREO,
+  // set audio sample rate for mixer
+  audio.sample_rate = (setup.audio_sample_rate_44100 ? 44100 : 22050);
+
+  if (Mix_OpenAudio(audio.sample_rate, MIX_DEFAULT_FORMAT, AUDIO_NUM_CHANNELS_STEREO,
                    setup.system.audio_fragment_size) < 0)
   {
     Warn("Mix_OpenAudio() failed: %s", SDL_GetError());
@@ -2516,6 +2550,12 @@ void SDLCloseAudio(void)
   SDL_QuitSubSystem(SDL_INIT_AUDIO);
 }
 
+void SDLReopenAudio(void)
+{
+  SDLCloseAudio();
+  SDLOpenAudio();
+}
+
 
 // ============================================================================
 // event functions