|
|
@@ -26,12 +26,12 @@ class SDLImageLoader;
|
|
|
|
|
|
std::shared_ptr<IImage> IImage::createFromFile( const std::string & path )
|
|
|
{
|
|
|
- return std::shared_ptr<IImage>(new SDLImage(path));
|
|
|
+ return std::shared_ptr<IImage>(new SDLImage(path, EImageBlitMode::ALPHA));
|
|
|
}
|
|
|
|
|
|
std::shared_ptr<IImage> IImage::createFromSurface( SDL_Surface * source )
|
|
|
{
|
|
|
- return std::shared_ptr<IImage>(new SDLImage(source, true));
|
|
|
+ return std::shared_ptr<IImage>(new SDLImage(source, EImageBlitMode::ALPHA));
|
|
|
}
|
|
|
|
|
|
IImage::IImage() = default;
|
|
|
@@ -57,9 +57,10 @@ SDLImage::SDLImage(CDefFile * data, size_t frame, size_t group)
|
|
|
data->loadFrame(frame, group, loader);
|
|
|
|
|
|
savePalette();
|
|
|
+ setBlitMode(EImageBlitMode::ALPHA);
|
|
|
}
|
|
|
|
|
|
-SDLImage::SDLImage(SDL_Surface * from, bool extraRef)
|
|
|
+SDLImage::SDLImage(SDL_Surface * from, EImageBlitMode mode)
|
|
|
: surf(nullptr),
|
|
|
margins(0, 0),
|
|
|
fullSize(0, 0),
|
|
|
@@ -70,14 +71,14 @@ SDLImage::SDLImage(SDL_Surface * from, bool extraRef)
|
|
|
return;
|
|
|
|
|
|
savePalette();
|
|
|
+ setBlitMode(mode);
|
|
|
|
|
|
- if (extraRef)
|
|
|
- surf->refcount++;
|
|
|
+ surf->refcount++;
|
|
|
fullSize.x = surf->w;
|
|
|
fullSize.y = surf->h;
|
|
|
}
|
|
|
|
|
|
-SDLImage::SDLImage(const JsonNode & conf)
|
|
|
+SDLImage::SDLImage(const JsonNode & conf, EImageBlitMode mode)
|
|
|
: surf(nullptr),
|
|
|
margins(0, 0),
|
|
|
fullSize(0, 0),
|
|
|
@@ -91,6 +92,7 @@ SDLImage::SDLImage(const JsonNode & conf)
|
|
|
return;
|
|
|
|
|
|
savePalette();
|
|
|
+ setBlitMode(mode);
|
|
|
|
|
|
const JsonNode & jsonMargins = conf["margins"];
|
|
|
|
|
|
@@ -111,7 +113,7 @@ SDLImage::SDLImage(const JsonNode & conf)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-SDLImage::SDLImage(std::string filename)
|
|
|
+SDLImage::SDLImage(std::string filename, EImageBlitMode mode)
|
|
|
: surf(nullptr),
|
|
|
margins(0, 0),
|
|
|
fullSize(0, 0),
|
|
|
@@ -127,6 +129,7 @@ SDLImage::SDLImage(std::string filename)
|
|
|
else
|
|
|
{
|
|
|
savePalette();
|
|
|
+ setBlitMode(mode);
|
|
|
fullSize.x = surf->w;
|
|
|
fullSize.y = surf->h;
|
|
|
}
|
|
|
@@ -172,7 +175,7 @@ void SDLImage::draw(SDL_Surface* where, const Rect * dest, const Rect* src) cons
|
|
|
if (SDL_GetSurfaceAlphaMod(surf, &perSurfaceAlpha) != 0)
|
|
|
logGlobal->error("SDL_GetSurfaceAlphaMod faied! %s", SDL_GetError());
|
|
|
|
|
|
- if(surf->format->BitsPerPixel == 8 && perSurfaceAlpha == SDL_ALPHA_OPAQUE)
|
|
|
+ if(surf->format->BitsPerPixel == 8 && perSurfaceAlpha == SDL_ALPHA_OPAQUE && blitMode == EImageBlitMode::ALPHA)
|
|
|
{
|
|
|
CSDL_Ext::blit8bppAlphaTo24bpp(surf, sourceRect, where, destShift);
|
|
|
}
|
|
|
@@ -196,7 +199,7 @@ std::shared_ptr<IImage> SDLImage::scaleFast(const Point & size) const
|
|
|
else
|
|
|
CSDL_Ext::setDefaultColorKey(scaled);//just in case
|
|
|
|
|
|
- SDLImage * ret = new SDLImage(scaled, false);
|
|
|
+ SDLImage * ret = new SDLImage(scaled, EImageBlitMode::ALPHA);
|
|
|
|
|
|
ret->fullSize.x = (int) round((float)fullSize.x * scaleX);
|
|
|
ret->fullSize.y = (int) round((float)fullSize.y * scaleY);
|
|
|
@@ -204,6 +207,9 @@ std::shared_ptr<IImage> SDLImage::scaleFast(const Point & size) const
|
|
|
ret->margins.x = (int) round((float)margins.x * scaleX);
|
|
|
ret->margins.y = (int) round((float)margins.y * scaleY);
|
|
|
|
|
|
+ // erase our own reference
|
|
|
+ SDL_FreeSurface(scaled);
|
|
|
+
|
|
|
return std::shared_ptr<IImage>(ret);
|
|
|
}
|
|
|
|
|
|
@@ -220,7 +226,18 @@ void SDLImage::playerColored(PlayerColor player)
|
|
|
void SDLImage::setAlpha(uint8_t value)
|
|
|
{
|
|
|
CSDL_Ext::setAlpha (surf, value);
|
|
|
- SDL_SetSurfaceBlendMode(surf, SDL_BLENDMODE_BLEND);
|
|
|
+ if (value != 255)
|
|
|
+ SDL_SetSurfaceBlendMode(surf, SDL_BLENDMODE_BLEND);
|
|
|
+}
|
|
|
+
|
|
|
+void SDLImage::setBlitMode(EImageBlitMode mode)
|
|
|
+{
|
|
|
+ blitMode = mode;
|
|
|
+
|
|
|
+ if (blitMode != EImageBlitMode::OPAQUE && surf->format->Amask != 0)
|
|
|
+ SDL_SetSurfaceBlendMode(surf, SDL_BLENDMODE_BLEND);
|
|
|
+ else
|
|
|
+ SDL_SetSurfaceBlendMode(surf, SDL_BLENDMODE_NONE);
|
|
|
}
|
|
|
|
|
|
void SDLImage::setFlagColor(PlayerColor player)
|