added function to create bitmap from SDL surface
authorHolger Schemel <info@artsoft.org>
Wed, 6 Mar 2024 08:57:30 +0000 (09:57 +0100)
committerHolger Schemel <info@artsoft.org>
Wed, 6 Mar 2024 08:57:30 +0000 (09:57 +0100)
src/libgame/sdl.c
src/libgame/sdl.h

index 045b70575b1139632e72087708434e5ccedf5924..76c70cc4a66e6b2d3d8ee27c9b1261b5330197da 100644 (file)
@@ -502,6 +502,31 @@ SDL_Surface *SDLCreateNativeSurface(int width, int height, int depth)
   return surface;
 }
 
+Bitmap *SDLGetBitmapFromSurface(SDL_Surface *surface)
+{
+  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, 0x00, 0x00, 0x00));
+
+  return bitmap;
+}
+
 static SDL_Texture *SDLCreateTextureFromSurface(SDL_Surface *surface)
 {
   if (program.headless)
index ee0759d3b162c81b03ceb57d8a9cb04716fdabf5..2caf6af0277cf4bd224da5d484b8761c76e62d71 100644 (file)
@@ -400,6 +400,7 @@ const char *SDLGetRendererName(void);
 boolean SDLSetNativeSurface(SDL_Surface **);
 SDL_Surface *SDLGetNativeSurface(SDL_Surface *);
 SDL_Surface *SDLCreateNativeSurface(int, int, int);
+Bitmap *SDLGetBitmapFromSurface(SDL_Surface *);
 void SDLCreateBitmapTextures(Bitmap *);
 void SDLFreeBitmapTextures(Bitmap *);