1
0
mirror of git://projects.qi-hardware.com/gmenu2x.git synced 2024-07-04 20:48:54 +03:00

PNG: Only add alpha channel on surface if loaded image has an alpha channel.

This fixes a bug where a loaded image could have an alpha of 0.
Also it avoids expensive alpha blending where it is unnecessary.
This commit is contained in:
Maarten ter Huurne 2011-06-03 12:47:49 +02:00
parent 8a81837c04
commit 36260e999d

View File

@ -14,6 +14,7 @@ SDL_Surface *loadPNG(const std::string &path) {
SDL_SetAlpha(surface, SDL_SRCALPHA, 255); SDL_SetAlpha(surface, SDL_SRCALPHA, 255);
return surface; return surface;
} else { } else {
bool hasAlphaChannel = surface->format->Amask != 0;
SDL_PixelFormat format32; SDL_PixelFormat format32;
memset(&format32, 0, sizeof(format32)); memset(&format32, 0, sizeof(format32));
format32.BitsPerPixel = 32; format32.BitsPerPixel = 32;
@ -23,13 +24,13 @@ SDL_Surface *loadPNG(const std::string &path) {
format32.Gmask = 0x0000FF00; format32.Gmask = 0x0000FF00;
format32.Bmask = format32.Bmask =
SDL_BYTEORDER == SDL_BIG_ENDIAN ? 0x000000FF : 0x00FF0000; SDL_BYTEORDER == SDL_BIG_ENDIAN ? 0x000000FF : 0x00FF0000;
format32.Amask = 0xFF000000; format32.Amask = hasAlphaChannel ? 0xFF000000 : 0;
format32.Rshift = SDL_BYTEORDER == SDL_BIG_ENDIAN ? 16 : 0; format32.Rshift = SDL_BYTEORDER == SDL_BIG_ENDIAN ? 16 : 0;
format32.Gshift = 8; format32.Gshift = 8;
format32.Bshift = SDL_BYTEORDER == SDL_BIG_ENDIAN ? 0 : 16; format32.Bshift = SDL_BYTEORDER == SDL_BIG_ENDIAN ? 0 : 16;
format32.Ashift = 24; format32.Ashift = hasAlphaChannel ? 24 : 0;
SDL_Surface *surface32 = SDL_Surface *surface32 = SDL_ConvertSurface(
SDL_ConvertSurface(surface, &format32, SDL_SRCALPHA); surface, &format32, hasAlphaChannel ? SDL_SRCALPHA : 0);
SDL_FreeSurface(surface); SDL_FreeSurface(surface);
return surface32; return surface32;
} }