diff options
author | Andrei Karas <akaras@inbox.ru> | 2013-08-25 19:36:20 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2013-08-25 23:26:55 +0300 |
commit | d5847d54a527c41006cb4cade15d0b6346490e77 (patch) | |
tree | 5146fc48f6e2d10eb3f41f1b20eac16f66b36f28 /src/resources/image.cpp | |
parent | 5b20a3d95717f75d33801c4dd2b093e106d90541 (diff) | |
download | mv-d5847d54a527c41006cb4cade15d0b6346490e77.tar.gz mv-d5847d54a527c41006cb4cade15d0b6346490e77.tar.bz2 mv-d5847d54a527c41006cb4cade15d0b6346490e77.tar.xz mv-d5847d54a527c41006cb4cade15d0b6346490e77.zip |
add partial support for software mode with SDL2.
Diffstat (limited to 'src/resources/image.cpp')
-rw-r--r-- | src/resources/image.cpp | 71 |
1 files changed, 70 insertions, 1 deletions
diff --git a/src/resources/image.cpp b/src/resources/image.cpp index 49650fef3..759a3a055 100644 --- a/src/resources/image.cpp +++ b/src/resources/image.cpp @@ -46,6 +46,50 @@ #include "debug.h" +#ifdef USE_SDL2 +Image::Image(SDL_Texture *const image, const int width, const int height) : + Resource(), +#ifdef USE_OPENGL + mGLImage(0), + mTexWidth(0), + mTexHeight(0), +#endif + mBounds(), + mAlpha(1.0f), + mSDLSurface(nullptr), + mTexture(image), + mAlphaChannel(nullptr), + mAlphaCache(), + mLoaded(false), + mHasAlphaChannel(false), + mUseAlphaCache(false), + mIsAlphaVisible(true), + mIsAlphaCalculated(false) +{ +#ifdef DEBUG_IMAGES + logger->log("created: %p", this); +#endif + + mBounds.x = 0; + mBounds.y = 0; + + if (mTexture) + { + mBounds.w = static_cast<uint16_t>(width); + mBounds.h = static_cast<uint16_t>(height); + + mLoaded = true; + } + else + { + logger->log("Image::Image(SDL_Texture *const image):" + " Couldn't load invalid Surface!"); + mBounds.w = 0; + mBounds.h = 0; + } +} +#endif + Image::Image(SDL_Surface *const image, const bool hasAlphaChannel0, uint8_t *const alphaChannel) : Resource(), @@ -57,6 +101,9 @@ Image::Image(SDL_Surface *const image, const bool hasAlphaChannel0, mBounds(), mAlpha(1.0f), mSDLSurface(image), +#ifdef USE_SDL2 + mTexture(nullptr), +#endif mAlphaChannel(alphaChannel), mAlphaCache(), mLoaded(false), @@ -98,6 +145,9 @@ Image::Image(const GLuint glimage, const int width, const int height, mBounds(), mAlpha(1.0f), mSDLSurface(nullptr), +#ifdef USE_SDL2 + mTexture(nullptr), +#endif mAlphaChannel(nullptr), mAlphaCache(), mLoaded(false), @@ -164,6 +214,13 @@ void Image::unload() delete [] mAlphaChannel; mAlphaChannel = nullptr; } +#ifdef USE_SDL2 + if (mTexture) + { + SDL_DestroyTexture(mTexture); + mTexture = nullptr; + } +#endif #ifdef USE_OPENGL if (mGLImage) @@ -257,11 +314,11 @@ void Image::setAlpha(const float alpha) if (!mHasAlphaChannel) { - // Set the alpha value this image is drawn at #ifdef USE_SDL2 SDL_SetSurfaceAlphaMod(mSDLSurface, static_cast<unsigned char>(255 * mAlpha)); #else + // Set the alpha value this image is drawn at SDL_SetAlpha(mSDLSurface, SDL_SRCALPHA, static_cast<unsigned char>(255 * mAlpha)); #endif @@ -302,6 +359,14 @@ void Image::setAlpha(const float alpha) SDL_UnlockSurface(mSDLSurface); } } +#ifdef USE_SDL2 + else if (mTexture) + { + mAlpha = alpha; + SDL_SetTextureAlphaMod(mTexture, + static_cast<unsigned char>(255 * mAlpha)); + } +#endif else { mAlpha = alpha; @@ -352,7 +417,11 @@ Image *Image::getSubImage(const int x, const int y, } #endif +#ifdef USE_SDL2 + return new SubImage(this, mTexture, x, y, width, height); +#else return new SubImage(this, mSDLSurface, x, y, width, height); +#endif } void Image::SDLTerminateAlphaCache() |