From 1ba6e5602cdde45b79aaa3d3638e7a67c0589fb4 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 3 Jan 2009 01:00:38 +0000 Subject: [PATCH] Added support for saving 32-bit BMP with alpha channel (disabled by default) --HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%403431 --- src/video/SDL_bmp.c | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/video/SDL_bmp.c b/src/video/SDL_bmp.c index 49e6089d3..2420f730c 100644 --- a/src/video/SDL_bmp.c +++ b/src/video/SDL_bmp.c @@ -377,7 +377,16 @@ SDL_SaveBMP_RW(SDL_Surface * saveme, SDL_RWops * dst, int freedst) /* Make sure we have somewhere to save */ surface = NULL; if (dst) { - if (saveme->format->palette) { + SDL_bool save32bit = SDL_FALSE; +#ifdef SAVE_32BIT_BMP + /* We can save alpha information in a 32-bit BMP */ + if (saveme->map->info.flags & SDL_COPY_COLORKEY || + saveme->format->Amask) { + save32bit = SDL_TRUE; + } +#endif /* SAVE_32BIT_BMP */ + + if (saveme->format->palette && !save32bit) { if (saveme->format->BitsPerPixel == 8) { surface = saveme; } else { @@ -399,17 +408,23 @@ SDL_SaveBMP_RW(SDL_Surface * saveme, SDL_RWops * dst, int freedst) } else { SDL_PixelFormat format; - /* Convert to 24 bits per pixel */ - SDL_InitFormat(&format, 24, + /* If the surface has a colorkey or alpha channel we'll save a + 32-bit BMP with alpha channel, otherwise save a 24-bit BMP. */ + if (save32bit) { + SDL_InitFormat(&format, 32, + 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000); + } else { + SDL_InitFormat(&format, 24, #if SDL_BYTEORDER == SDL_LIL_ENDIAN - 0x00FF0000, 0x0000FF00, 0x000000FF, + 0x00FF0000, 0x0000FF00, 0x000000FF, #else - 0x000000FF, 0x0000FF00, 0x00FF0000, + 0x000000FF, 0x0000FF00, 0x00FF0000, #endif - 0); + 0); + } surface = SDL_ConvertSurface(saveme, &format, 0); if (!surface) { - SDL_SetError("Couldn't convert image to 24 bpp"); + SDL_SetError("Couldn't convert image to %d bpp", format.BitsPerPixel); } } }