diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-05-17 19:48:30 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-05-17 19:53:48 +0300 |
commit | fbbf87a36f5f27851a2e2d17b95a0f17dd82624b (patch) | |
tree | 12a1e11578822f58ead1808dfe8b5fd69b96802e | |
parent | d9838926bee52d1ada15a59dce89d76813533480 (diff) | |
download | mv-fbbf87a36f5f27851a2e2d17b95a0f17dd82624b.tar.gz mv-fbbf87a36f5f27851a2e2d17b95a0f17dd82624b.tar.bz2 mv-fbbf87a36f5f27851a2e2d17b95a0f17dd82624b.tar.xz mv-fbbf87a36f5f27851a2e2d17b95a0f17dd82624b.zip |
Fix possible issues in texture atlas creation with non power of two image sizes.
-rw-r--r-- | src/resources/openglimagehelper.cpp | 55 | ||||
-rw-r--r-- | src/resources/openglimagehelper.h | 3 |
2 files changed, 55 insertions, 3 deletions
diff --git a/src/resources/openglimagehelper.cpp b/src/resources/openglimagehelper.cpp index 4c7095ec8..ca553a180 100644 --- a/src/resources/openglimagehelper.cpp +++ b/src/resources/openglimagehelper.cpp @@ -134,8 +134,8 @@ int OpenGLImageHelper::powerOfTwo(const int input) return value >= mTextureSize ? mTextureSize : value; } -SDL_Surface *OpenGLImageHelper::convertSurface(SDL_Surface *tmpImage, - int width, int height) +SDL_Surface *OpenGLImageHelper::convertSurfaceNormalize(SDL_Surface *tmpImage, + int width, int height) { if (!tmpImage) return nullptr; @@ -193,6 +193,55 @@ SDL_Surface *OpenGLImageHelper::convertSurface(SDL_Surface *tmpImage, return tmpImage; } +SDL_Surface *OpenGLImageHelper::convertSurface(SDL_Surface *tmpImage, + int width, int height) +{ + if (!tmpImage) + return nullptr; + +#ifdef USE_SDL2 + SDL_SetSurfaceAlphaMod(tmpImage, SDL_ALPHA_OPAQUE); +#else + // Make sure the alpha channel is not used, but copied to destination + SDL_SetAlpha(tmpImage, 0, SDL_ALPHA_OPAQUE); +#endif + + // Determine 32-bit masks based on byte order + uint32_t rmask, gmask, bmask, amask; +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + rmask = 0xff000000; + gmask = 0x00ff0000; + bmask = 0x0000ff00; + amask = 0x000000ff; +#else + rmask = 0x000000ff; + gmask = 0x0000ff00; + bmask = 0x00ff0000; + amask = 0xff000000; +#endif + + if (tmpImage->format->BitsPerPixel != 32 + || rmask != tmpImage->format->Rmask + || gmask != tmpImage->format->Gmask + || amask != tmpImage->format->Amask) + { + SDL_Surface *oldImage = tmpImage; +#ifdef USE_SDL2 + SDL_SetSurfaceBlendMode(oldImage, SDL_BLENDMODE_NONE); +#endif + tmpImage = MSDL_CreateRGBSurface(SDL_SWSURFACE, width, height, + 32, rmask, gmask, bmask, amask); + + if (!tmpImage) + { + logger->log("Error, image convert failed: out of memory"); + return nullptr; + } + SDL_BlitSurface(oldImage, nullptr, tmpImage, nullptr); + } + return tmpImage; +} + void OpenGLImageHelper::bindTexture(const GLuint texture) { switch (mUseOpenGL) @@ -241,7 +290,7 @@ Image *OpenGLImageHelper::glLoad(SDL_Surface *tmpImage, height = tmpImage->h; SDL_Surface *oldImage = tmpImage; - tmpImage = convertSurface(tmpImage, width, height); + tmpImage = convertSurfaceNormalize(tmpImage, width, height); const int realWidth = tmpImage->w; const int realHeight = tmpImage->h; diff --git a/src/resources/openglimagehelper.h b/src/resources/openglimagehelper.h index 1afebb736..758817684 100644 --- a/src/resources/openglimagehelper.h +++ b/src/resources/openglimagehelper.h @@ -135,6 +135,9 @@ class OpenGLImageHelper final : public ImageHelper */ static int powerOfTwo(const int input) A_WARN_UNUSED; + static SDL_Surface *convertSurfaceNormalize(SDL_Surface *tmpImage, + int width, int height); + static SDL_Surface *convertSurface(SDL_Surface *tmpImage, int width, int height); |