Advertisement
Ardente

C++ Core Guidelines 2

Sep 2nd, 2020
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.67 KB | None | 0 0
  1. TextureWrapper::TextureWrapper(TextureInfo textureInfo, SDL_Renderer &renderer) : mWrappedTexture(nullptr, nullptr), mWidth(0), mHeight(0), mXScaleFactor(1.0f), mYScaleFactor(1.0f)
  2. {
  3.     switch (textureInfo.index())
  4.     {
  5.         case 0:
  6.         {
  7.             ImageInfo &imgInfo = std::get<ImageInfo>(textureInfo);
  8.             initFromFile(imgInfo, renderer);
  9.             break;
  10.         }
  11.            
  12.         case 1:
  13.         {
  14.             TextInfo &textInfo = std::get<TextInfo>(textureInfo);
  15.             initFromString(textInfo, renderer);
  16.             break;
  17.         }
  18.            
  19.         case 2:
  20.         {
  21.             RectangleInfo &rectInfo = std::get<RectangleInfo>(textureInfo);
  22.             initFromRectangle(rectInfo, renderer);
  23.             break;
  24.         }
  25.            
  26.         default:
  27.             break;
  28.     }
  29. }
  30.  
  31. TextureWrapper::~TextureWrapper()
  32. {
  33.     freeTexture();
  34. }
  35.  
  36. void TextureWrapper::freeTexture()
  37. {
  38.     mRenderer = nullptr;
  39.     mWrappedTexture = nullptr;
  40.    
  41.     mWidth = 0;
  42.     mHeight = 0;
  43.    
  44.     mXScaleFactor = 0.0f;
  45.     mYScaleFactor = 0.0f;
  46. }
  47.  
  48. void TextureWrapper::initFromFile(ImageInfo imgInfo, SDL_Renderer &renderer)
  49. {
  50.     std::unique_ptr<SDL_Surface, decltype(&SDL_FreeSurface)> loadedSurface { IMG_Load(imgInfo.path.c_str()), &SDL_FreeSurface };
  51.    
  52.     if (!loadedSurface)
  53.     {
  54.         logMessage("Failed to load image from " + imgInfo.path + "!", SevereError, __LINE__, __FILE_NAME__);
  55.         logMessage(IMG_GetError(), SDLImageError, __LINE__, __FILE_NAME__);
  56.        
  57.         assert(false);
  58.     }
  59.     else
  60.     {
  61.         if (imgInfo.isColorKeyed)
  62.             SDL_SetColorKey(loadedSurface.get(), SDL_TRUE, SDL_MapRGB(loadedSurface->format, imgInfo.colorKey.r, imgInfo.colorKey.g, imgInfo.colorKey.b));
  63.        
  64.         mWrappedTexture = std::unique_ptr<SDL_Texture, decltype(&SDL_DestroyTexture)>(SDL_CreateTextureFromSurface(&renderer, loadedSurface.get()), &SDL_DestroyTexture);
  65.        
  66.         if (!mWrappedTexture)
  67.         {
  68.             logMessage("Failed to convert " + imgInfo.path + "into a texture!", SevereError, __LINE__, __FILE_NAME__);
  69.             logMessage(SDL_GetError(), SDLError, __LINE__, __FILE_NAME__);
  70.            
  71.             assert(false);
  72.         }
  73.         else
  74.         {
  75.             mWidth = loadedSurface->w;
  76.             mHeight = loadedSurface->h;
  77.            
  78.             mXScaleFactor = imgInfo.xScale;
  79.             mYScaleFactor = imgInfo.yScale;
  80.         }
  81.     }
  82. }
  83.  
  84. void TextureWrapper::initFromString(TextInfo textInfo, SDL_Renderer &renderer)
  85. {
  86.     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 };
  87.    
  88.     if (!loadedSurface)
  89.     {
  90.         logMessage("Unable to render text to surface!", SevereError, __LINE__, __FILE_NAME__);
  91.         logMessage(TTF_GetError(), SDLFontError, __LINE__, __FILE_NAME__);
  92.        
  93.         assert(false);
  94.     }
  95.     else
  96.     {
  97.         mWrappedTexture = std::unique_ptr<SDL_Texture, decltype(&SDL_DestroyTexture)>{ SDL_CreateTextureFromSurface(&renderer, loadedSurface.get()), &SDL_DestroyTexture };
  98.        
  99.         if (!mWrappedTexture)
  100.         {
  101.             logMessage("Unable to convert rendered text to texture!", SevereError, __LINE__, __FILE_NAME__);
  102.             logMessage(SDL_GetError(), SDLError, __LINE__, __FILE_NAME__);
  103.            
  104.             assert(false);
  105.         }
  106.         else
  107.         {
  108.             mWidth = loadedSurface->w;
  109.             mHeight = loadedSurface->h;
  110.         }
  111.     }
  112. }
  113.  
  114. void TextureWrapper::initFromRectangle(RectangleInfo rectInfo, SDL_Renderer &renderer)
  115. {
  116.     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 };
  117.    
  118.     if (!mWrappedTexture)
  119.     {
  120.         logMessage("Failed to create a targetable texture!", SevereError, __LINE__, __FILE_NAME__);
  121.         logMessage(SDL_GetError(), SDLError, __LINE__, __FILE_NAME__);
  122.        
  123.         assert(false);
  124.     }
  125.     else
  126.     {
  127.         mWidth = rectInfo.rectangle.w;
  128.         mHeight = rectInfo.rectangle.h;
  129.        
  130.         // Color the texture
  131.         SDL_SetRenderTarget(&renderer, mWrappedTexture.get());
  132.         SDL_SetRenderDrawColor(&renderer, rectInfo.color.r, rectInfo.color.g, rectInfo.color.b, rectInfo.color.a);
  133.         SDL_RenderClear(&renderer);
  134.        
  135.         // Reset the clear screen color
  136.         SDL_SetRenderDrawColor(&renderer, 0xFF, 0xFF, 0xFF, 0xFF);
  137.         SDL_SetRenderTarget(&renderer, nullptr);
  138.     }
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement