123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- /*
- * ImageScaled.cpp, part of VCMI engine
- *
- * Authors: listed in file AUTHORS in main folder
- *
- * License: GNU General Public License v2.0 or later
- * Full text of license available in license.txt file, in main folder
- *
- */
- #include "StdInc.h"
- #include "ImageScaled.h"
- #include "SDLImage.h"
- #include "SDL_Extensions.h"
- #include "../gui/CGuiHandler.h"
- #include "../render/IScreenHandler.h"
- #include "../render/Colors.h"
- #include "../../lib/constants/EntityIdentifiers.h"
- #include <SDL_surface.h>
- ImageScaled::ImageScaled(const ImageLocator & inputLocator, const std::shared_ptr<const ISharedImage> & source, EImageBlitMode mode)
- : source(source)
- , locator(inputLocator)
- , colorMultiplier(Colors::WHITE_TRUE)
- , alphaValue(SDL_ALPHA_OPAQUE)
- , blitMode(mode)
- {
- prepareImages();
- }
- std::shared_ptr<const ISharedImage> ImageScaled::getSharedImage() const
- {
- return body;
- }
- void ImageScaled::scaleInteger(int factor)
- {
- assert(0);
- }
- void ImageScaled::scaleTo(const Point & size)
- {
- if (source)
- source = source->scaleTo(size, nullptr);
- if (body)
- body = body->scaleTo(size * GH.screenHandler().getScalingFactor(), nullptr);
- }
- void ImageScaled::exportBitmap(const boost::filesystem::path &path) const
- {
- source->exportBitmap(path, nullptr);
- }
- bool ImageScaled::isTransparent(const Point &coords) const
- {
- return source->isTransparent(coords);
- }
- Rect ImageScaled::contentRect() const
- {
- return source->contentRect();
- }
- Point ImageScaled::dimensions() const
- {
- return source->dimensions();
- }
- void ImageScaled::setAlpha(uint8_t value)
- {
- alphaValue = value;
- }
- void ImageScaled::setBlitMode(EImageBlitMode mode)
- {
- blitMode = mode;
- }
- void ImageScaled::draw(SDL_Surface *where, const Point &pos, const Rect *src) const
- {
- if (shadow)
- shadow->draw(where, nullptr, pos, src, Colors::WHITE_TRUE, alphaValue, blitMode);
- if (body)
- body->draw(where, nullptr, pos, src, Colors::WHITE_TRUE, alphaValue, blitMode);
- if (overlay)
- overlay->draw(where, nullptr, pos, src, colorMultiplier, colorMultiplier.a * alphaValue / 255, blitMode);
- }
- void ImageScaled::setOverlayColor(const ColorRGBA & color)
- {
- colorMultiplier = color;
- }
- void ImageScaled::playerColored(PlayerColor player)
- {
- playerColor = player;
- prepareImages();
- }
- void ImageScaled::shiftPalette(uint32_t firstColorID, uint32_t colorsToMove, uint32_t distanceToMove)
- {
- // TODO: implement
- }
- void ImageScaled::adjustPalette(const ColorFilter &shifter, uint32_t colorsToSkipMask)
- {
- // TODO: implement
- }
- void ImageScaled::prepareImages()
- {
- switch(blitMode)
- {
- case EImageBlitMode::OPAQUE:
- case EImageBlitMode::COLORKEY:
- case EImageBlitMode::SIMPLE:
- locator.layer = blitMode;
- locator.playerColored = playerColor;
- body = GH.renderHandler().loadImage(locator, blitMode)->getSharedImage();
- break;
- case EImageBlitMode::WITH_SHADOW_AND_OVERLAY:
- case EImageBlitMode::ONLY_BODY:
- locator.layer = EImageBlitMode::ONLY_BODY;
- locator.playerColored = playerColor;
- body = GH.renderHandler().loadImage(locator, blitMode)->getSharedImage();
- break;
- case EImageBlitMode::WITH_SHADOW:
- case EImageBlitMode::ONLY_BODY_IGNORE_OVERLAY:
- locator.layer = EImageBlitMode::ONLY_BODY_IGNORE_OVERLAY;
- locator.playerColored = playerColor;
- body = GH.renderHandler().loadImage(locator, blitMode)->getSharedImage();
- break;
- case EImageBlitMode::ONLY_SHADOW:
- case EImageBlitMode::ONLY_OVERLAY:
- body = nullptr;
- break;
- }
- switch(blitMode)
- {
- case EImageBlitMode::WITH_SHADOW:
- case EImageBlitMode::ONLY_SHADOW:
- case EImageBlitMode::WITH_SHADOW_AND_OVERLAY:
- locator.layer = EImageBlitMode::ONLY_SHADOW;
- locator.playerColored = PlayerColor::CANNOT_DETERMINE;
- shadow = GH.renderHandler().loadImage(locator, blitMode)->getSharedImage();
- break;
- default:
- shadow = nullptr;
- break;
- }
- switch(blitMode)
- {
- case EImageBlitMode::ONLY_OVERLAY:
- case EImageBlitMode::WITH_SHADOW_AND_OVERLAY:
- locator.layer = EImageBlitMode::ONLY_OVERLAY;
- locator.playerColored = PlayerColor::CANNOT_DETERMINE;
- overlay = GH.renderHandler().loadImage(locator, blitMode)->getSharedImage();
- break;
- default:
- overlay = nullptr;
- break;
- }
- }
|