# HG changeset patch # User Sam Lantinga # Date 1230944438 0 # Node ID 1ee69e7e7cea5708a614b5f6cde0d94241beaed7 # Parent efe4d0ce2e97c045ae12d0d9b715128475aec399 Added support for saving 32-bit BMP with alpha channel (disabled by default) diff -r efe4d0ce2e97 -r 1ee69e7e7cea src/video/SDL_bmp.c --- a/src/video/SDL_bmp.c Fri Jan 02 23:47:16 2009 +0000 +++ b/src/video/SDL_bmp.c Sat Jan 03 01:00:38 2009 +0000 @@ -377,7 +377,16 @@ /* 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 @@ } 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); } } }