X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsdl.c;h=76c70cc4a66e6b2d3d8ee27c9b1261b5330197da;hb=a9e2c4e384951f6c0d91370655ac80ee570a383d;hp=e60d760d6265eab0a93499945ef319ee5735ef50;hpb=7c117e147cc14c25b7e4d8e93fb7e2bc16499a0f;p=rocksndiamonds.git diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index e60d760d..76c70cc4 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -415,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; @@ -483,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) @@ -2233,7 +2277,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. @@ -2241,7 +2285,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; @@ -2320,25 +2364,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(); @@ -2352,7 +2377,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);