summaryrefslogtreecommitdiff
path: root/src/resources/imagehelper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/resources/imagehelper.cpp')
-rw-r--r--src/resources/imagehelper.cpp82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/resources/imagehelper.cpp b/src/resources/imagehelper.cpp
index ff7c196c4..0fbc04776 100644
--- a/src/resources/imagehelper.cpp
+++ b/src/resources/imagehelper.cpp
@@ -25,6 +25,8 @@
#include "logger.h"
#include "main.h"
+#include "resources/dye.h"
+
#include "utils/sdlcheckutils.h"
#include <SDL_image.h>
@@ -52,6 +54,68 @@ Image *ImageHelper::load(SDL_RWops *const rw) const
return image;
}
+Image *ImageHelper::load(SDL_RWops *const rw, Dye const &dye) const
+{
+ SDL_Surface *const tmpImage = loadPng(rw);
+ if (!tmpImage)
+ {
+ logger->log("Error, image load failed: %s", IMG_GetError());
+ return nullptr;
+ }
+
+ SDL_PixelFormat rgba;
+ rgba.palette = nullptr;
+ rgba.BitsPerPixel = 32;
+ rgba.BytesPerPixel = 4;
+
+#if SDL_BYTEORDER == SDL_BIG_ENDIAN
+ rgba.Rmask = 0x000000FF;
+ rgba.Gmask = 0x0000FF00;
+ rgba.Bmask = 0x00FF0000;
+ rgba.Amask = 0xFF000000;
+#else
+ rgba.Rmask = 0xFF000000;
+ rgba.Gmask = 0x00FF0000;
+ rgba.Bmask = 0x0000FF00;
+ rgba.Amask = 0x000000FF;
+#endif
+
+ SDL_Surface *const surf = MSDL_ConvertSurface(
+ tmpImage, &rgba, SDL_SWSURFACE);
+ MSDL_FreeSurface(tmpImage);
+
+ uint32_t *pixels = static_cast<uint32_t *>(surf->pixels);
+ const int type = dye.getType();
+
+ switch (type)
+ {
+ case 1:
+ {
+ const DyePalette *const pal = dye.getSPalete();
+ if (pal)
+ pal->replaceSColor(pixels, surf->w * surf->h);
+ break;
+ }
+ case 2:
+ {
+ const DyePalette *const pal = dye.getAPalete();
+ if (pal)
+ pal->replaceAColor(pixels, surf->w * surf->h);
+ break;
+ }
+ case 0:
+ default:
+ {
+ dye.normalDye(pixels, surf->w * surf->h);
+ break;
+ }
+ }
+
+ Image *const image = load(surf);
+ MSDL_FreeSurface(surf);
+ return image;
+}
+
SDL_Surface* ImageHelper::convertTo32Bit(SDL_Surface *const tmpImage)
{
if (!tmpImage)
@@ -138,3 +202,21 @@ SDL_Surface *ImageHelper::loadPng(SDL_RWops *const rw)
SDL_RWclose(rw);
return nullptr;
}
+
+SDL_Surface *ImageHelper::create32BitSurface(int width, int height) const
+{
+#if SDL_BYTEORDER == SDL_BIG_ENDIAN
+ const int rmask = 0xff000000;
+ const int gmask = 0x00ff0000;
+ const int bmask = 0x0000ff00;
+ const int amask = 0x000000ff;
+#else
+ const int rmask = 0x000000ff;
+ const int gmask = 0x0000ff00;
+ const int bmask = 0x00ff0000;
+ const int amask = 0xff000000;
+#endif
+
+ return MSDL_CreateRGBSurface(SDL_SWSURFACE,
+ width, height, 32, rmask, gmask, bmask, amask);
+}