Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- TextureWrapper::TextureWrapper(TextureInfo textureInfo, SDL_Renderer &renderer) : mWrappedTexture(nullptr, nullptr), mWidth(0), mHeight(0), mXScaleFactor(1.0f), mYScaleFactor(1.0f)
- {
- switch (textureInfo.index())
- {
- case 0:
- {
- ImageInfo &imgInfo = std::get<ImageInfo>(textureInfo);
- initFromFile(imgInfo, renderer);
- break;
- }
- case 1:
- {
- TextInfo &textInfo = std::get<TextInfo>(textureInfo);
- initFromString(textInfo, renderer);
- break;
- }
- case 2:
- {
- RectangleInfo &rectInfo = std::get<RectangleInfo>(textureInfo);
- initFromRectangle(rectInfo, renderer);
- break;
- }
- default:
- break;
- }
- }
- TextureWrapper::~TextureWrapper()
- {
- freeTexture();
- }
- void TextureWrapper::freeTexture()
- {
- mRenderer = nullptr;
- mWrappedTexture = nullptr;
- mWidth = 0;
- mHeight = 0;
- mXScaleFactor = 0.0f;
- mYScaleFactor = 0.0f;
- }
- void TextureWrapper::initFromFile(ImageInfo imgInfo, SDL_Renderer &renderer)
- {
- std::unique_ptr<SDL_Surface, decltype(&SDL_FreeSurface)> loadedSurface { IMG_Load(imgInfo.path.c_str()), &SDL_FreeSurface };
- if (!loadedSurface)
- {
- logMessage("Failed to load image from " + imgInfo.path + "!", SevereError, __LINE__, __FILE_NAME__);
- logMessage(IMG_GetError(), SDLImageError, __LINE__, __FILE_NAME__);
- assert(false);
- }
- else
- {
- if (imgInfo.isColorKeyed)
- SDL_SetColorKey(loadedSurface.get(), SDL_TRUE, SDL_MapRGB(loadedSurface->format, imgInfo.colorKey.r, imgInfo.colorKey.g, imgInfo.colorKey.b));
- mWrappedTexture = std::unique_ptr<SDL_Texture, decltype(&SDL_DestroyTexture)>(SDL_CreateTextureFromSurface(&renderer, loadedSurface.get()), &SDL_DestroyTexture);
- if (!mWrappedTexture)
- {
- logMessage("Failed to convert " + imgInfo.path + "into a texture!", SevereError, __LINE__, __FILE_NAME__);
- logMessage(SDL_GetError(), SDLError, __LINE__, __FILE_NAME__);
- assert(false);
- }
- else
- {
- mWidth = loadedSurface->w;
- mHeight = loadedSurface->h;
- mXScaleFactor = imgInfo.xScale;
- mYScaleFactor = imgInfo.yScale;
- }
- }
- }
- void TextureWrapper::initFromString(TextInfo textInfo, SDL_Renderer &renderer)
- {
- std::unique_ptr<SDL_Surface, decltype(&SDL_FreeSurface)> loadedSurface { TTF_RenderText_Blended_Wrapped(textInfo.textFont.get(), textInfo.text.c_str(), textInfo.color, 300 * 1.776), &SDL_FreeSurface };
- if (!loadedSurface)
- {
- logMessage("Unable to render text to surface!", SevereError, __LINE__, __FILE_NAME__);
- logMessage(TTF_GetError(), SDLFontError, __LINE__, __FILE_NAME__);
- assert(false);
- }
- else
- {
- mWrappedTexture = std::unique_ptr<SDL_Texture, decltype(&SDL_DestroyTexture)>{ SDL_CreateTextureFromSurface(&renderer, loadedSurface.get()), &SDL_DestroyTexture };
- if (!mWrappedTexture)
- {
- logMessage("Unable to convert rendered text to texture!", SevereError, __LINE__, __FILE_NAME__);
- logMessage(SDL_GetError(), SDLError, __LINE__, __FILE_NAME__);
- assert(false);
- }
- else
- {
- mWidth = loadedSurface->w;
- mHeight = loadedSurface->h;
- }
- }
- }
- void TextureWrapper::initFromRectangle(RectangleInfo rectInfo, SDL_Renderer &renderer)
- {
- mWrappedTexture = std::unique_ptr<SDL_Texture, decltype(&SDL_DestroyTexture)> { SDL_CreateTexture(&renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, rectInfo.rectangle.w, rectInfo.rectangle.h), &SDL_DestroyTexture };
- if (!mWrappedTexture)
- {
- logMessage("Failed to create a targetable texture!", SevereError, __LINE__, __FILE_NAME__);
- logMessage(SDL_GetError(), SDLError, __LINE__, __FILE_NAME__);
- assert(false);
- }
- else
- {
- mWidth = rectInfo.rectangle.w;
- mHeight = rectInfo.rectangle.h;
- // Color the texture
- SDL_SetRenderTarget(&renderer, mWrappedTexture.get());
- SDL_SetRenderDrawColor(&renderer, rectInfo.color.r, rectInfo.color.g, rectInfo.color.b, rectInfo.color.a);
- SDL_RenderClear(&renderer);
- // Reset the clear screen color
- SDL_SetRenderDrawColor(&renderer, 0xFF, 0xFF, 0xFF, 0xFF);
- SDL_SetRenderTarget(&renderer, nullptr);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement