mirror of
git://projects.qi-hardware.com/gmenu2x.git
synced 2024-11-22 17:51:34 +02:00
Fix issues with loading images with alpha disabled.
These issues are fixed: * loadPNG gave RGBA surfaces unconditionally. Now it gives RGB surfaces if its second parameter, defaulting to true, is false. This fixes adding per- surface alpha values, because an RGBA surface ignores its per-surface value. * Surface::loadImage is updated to receive a third parameter, defaulting to true, to determine whether alpha is loaded. * SurfaceCollection::defaultAlpha was never used. * SurfaceCollection::defaultAlpha defaulted to false, so even if it were used, it would have loaded images without alpha.
This commit is contained in:
parent
bb7a30d697
commit
7284104fd1
@ -24,7 +24,7 @@ static void __readFromOpk(png_structp png_ptr, png_bytep ptr, png_size_t length)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SDL_Surface *loadPNG(const std::string &path) {
|
SDL_Surface *loadPNG(const std::string &path, bool loadAlpha) {
|
||||||
// Declare these with function scope and initialize them to NULL,
|
// Declare these with function scope and initialize them to NULL,
|
||||||
// so we can use a single cleanup block at the end of the function.
|
// so we can use a single cleanup block at the end of the function.
|
||||||
SDL_Surface *surface = NULL;
|
SDL_Surface *surface = NULL;
|
||||||
@ -134,10 +134,10 @@ SDL_Surface *loadPNG(const std::string &path) {
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allocate ARGB surface to hold the image.
|
// Allocate [A]RGB surface to hold the image.
|
||||||
surface = SDL_CreateRGBSurface(
|
surface = SDL_CreateRGBSurface(
|
||||||
SDL_SWSURFACE | SDL_SRCALPHA, width, height, 32,
|
SDL_SWSURFACE | SDL_SRCALPHA, width, height, 32,
|
||||||
0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000
|
0x00FF0000, 0x0000FF00, 0x000000FF, loadAlpha ? 0xFF000000 : 0x00000000
|
||||||
);
|
);
|
||||||
if (!surface) {
|
if (!surface) {
|
||||||
// Failed to create surface, probably out of memory.
|
// Failed to create surface, probably out of memory.
|
||||||
|
@ -7,6 +7,6 @@ struct SDL_Surface;
|
|||||||
|
|
||||||
/** Loads an image from a PNG file into a newly allocated 32bpp RGBA surface.
|
/** Loads an image from a PNG file into a newly allocated 32bpp RGBA surface.
|
||||||
*/
|
*/
|
||||||
SDL_Surface *loadPNG(const std::string &path);
|
SDL_Surface *loadPNG(const std::string &path, bool loadAlpha = true);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -55,14 +55,14 @@ Surface *Surface::emptySurface(int width, int height) {
|
|||||||
return new Surface(raw, true);
|
return new Surface(raw, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
Surface *Surface::loadImage(const string &img, const string &skin) {
|
Surface *Surface::loadImage(const string &img, const string &skin, bool loadAlpha) {
|
||||||
string skinpath;
|
string skinpath;
|
||||||
if (!skin.empty() && !img.empty() && img[0]!='/')
|
if (!skin.empty() && !img.empty() && img[0]!='/')
|
||||||
skinpath = SurfaceCollection::getSkinFilePath(skin, img);
|
skinpath = SurfaceCollection::getSkinFilePath(skin, img);
|
||||||
else
|
else
|
||||||
skinpath = img;
|
skinpath = img;
|
||||||
|
|
||||||
SDL_Surface *raw = loadPNG(skinpath);
|
SDL_Surface *raw = loadPNG(skinpath, loadAlpha);
|
||||||
if (!raw) {
|
if (!raw) {
|
||||||
ERROR("Couldn't load surface '%s'\n", img.c_str());
|
ERROR("Couldn't load surface '%s'\n", img.c_str());
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -41,7 +41,7 @@ public:
|
|||||||
static Surface *openOutputSurface(int width, int height, int bitsperpixel);
|
static Surface *openOutputSurface(int width, int height, int bitsperpixel);
|
||||||
static Surface *emptySurface(int width, int height);
|
static Surface *emptySurface(int width, int height);
|
||||||
static Surface *loadImage(const std::string &img,
|
static Surface *loadImage(const std::string &img,
|
||||||
const std::string &skin="");
|
const std::string &skin="", bool loadAlpha=true);
|
||||||
|
|
||||||
Surface(Surface *s);
|
Surface(Surface *s);
|
||||||
~Surface();
|
~Surface();
|
||||||
|
@ -119,7 +119,7 @@ Surface *SurfaceCollection::add(const string &path) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
DEBUG("Adding surface: '%s'\n", path.c_str());
|
DEBUG("Adding surface: '%s'\n", path.c_str());
|
||||||
Surface *s = Surface::loadImage(filePath);
|
Surface *s = Surface::loadImage(filePath, "", defaultAlpha);
|
||||||
if (s != NULL) {
|
if (s != NULL) {
|
||||||
surfaces[path] = s;
|
surfaces[path] = s;
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,7 @@ public:
|
|||||||
static std::string getSkinFilePath(const std::string &skin, const std::string &file, bool useDefault = true);
|
static std::string getSkinFilePath(const std::string &skin, const std::string &file, bool useDefault = true);
|
||||||
static std::string getSkinPath(const std::string &skin);
|
static std::string getSkinPath(const std::string &skin);
|
||||||
|
|
||||||
bool defaultAlpha;
|
bool defaultAlpha = true;
|
||||||
void debug();
|
void debug();
|
||||||
|
|
||||||
Surface *add(Surface *s, const std::string &path);
|
Surface *add(Surface *s, const std::string &path);
|
||||||
|
Loading…
Reference in New Issue
Block a user