1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-02-09 13:14:02 +02:00

Fixed generation of upscaled spellbook

This commit is contained in:
Ivan Savenko 2024-09-12 14:26:05 +00:00
parent 1e74216040
commit dfd3f0c1a6
6 changed files with 35 additions and 19 deletions

View File

@ -35,9 +35,10 @@ void AssetGenerator::createAdventureOptionsCleanBackground()
return; return;
ResourcePath savePath(filename, EResType::IMAGE); ResourcePath savePath(filename, EResType::IMAGE);
auto res = ImagePath::builtin("ADVOPTBK"); auto locator = ImageLocator(ImagePath::builtin("ADVOPTBK"));
locator.scalingFactor = 1;
std::shared_ptr<IImage> img = GH.renderHandler().loadImage(res, EImageBlitMode::OPAQUE); std::shared_ptr<IImage> img = GH.renderHandler().loadImage(locator, EImageBlitMode::OPAQUE);
Canvas canvas = Canvas(Point(575, 585), CanvasScalingPolicy::IGNORE); Canvas canvas = Canvas(Point(575, 585), CanvasScalingPolicy::IGNORE);
canvas.draw(img, Point(0, 0), Rect(0, 0, 575, 585)); canvas.draw(img, Point(0, 0), Rect(0, 0, 575, 585));
@ -64,9 +65,10 @@ void AssetGenerator::createBigSpellBook()
return; return;
ResourcePath savePath(filename, EResType::IMAGE); ResourcePath savePath(filename, EResType::IMAGE);
auto res = ImagePath::builtin("SpelBack"); auto locator = ImageLocator(ImagePath::builtin("SpelBack"));
locator.scalingFactor = 1;
std::shared_ptr<IImage> img = GH.renderHandler().loadImage(res, EImageBlitMode::OPAQUE); std::shared_ptr<IImage> img = GH.renderHandler().loadImage(locator, EImageBlitMode::OPAQUE);
Canvas canvas = Canvas(Point(800, 600), CanvasScalingPolicy::IGNORE); Canvas canvas = Canvas(Point(800, 600), CanvasScalingPolicy::IGNORE);
// edges // edges
canvas.draw(img, Point(0, 0), Rect(15, 38, 90, 45)); canvas.draw(img, Point(0, 0), Rect(15, 38, 90, 45));

View File

@ -70,6 +70,7 @@ bool ImageLocator::empty() const
ImageLocator ImageLocator::copyFile() const ImageLocator ImageLocator::copyFile() const
{ {
ImageLocator result; ImageLocator result;
result.scalingFactor = 1;
result.image = image; result.image = image;
result.defFile = defFile; result.defFile = defFile;
result.defFrame = defFrame; result.defFrame = defFrame;

View File

@ -32,7 +32,7 @@ struct ImageLocator
bool verticalFlip = false; bool verticalFlip = false;
bool horizontalFlip = false; bool horizontalFlip = false;
int8_t scalingFactor = 1; int8_t scalingFactor = 0; // 0 = auto / use default scaling
EImageLayer layer = EImageLayer::ALL; EImageLayer layer = EImageLayer::ALL;
ImageLocator() = default; ImageLocator() = default;

View File

@ -28,7 +28,6 @@ ImageScaled::ImageScaled(const ImageLocator & inputLocator, const std::shared_pt
, alphaValue(SDL_ALPHA_OPAQUE) , alphaValue(SDL_ALPHA_OPAQUE)
, blitMode(mode) , blitMode(mode)
{ {
locator.scalingFactor = GH.screenHandler().getScalingFactor();
setBodyEnabled(true); setBodyEnabled(true);
if (mode == EImageBlitMode::ALPHA) if (mode == EImageBlitMode::ALPHA)
setShadowEnabled(true); setShadowEnabled(true);

View File

@ -136,14 +136,6 @@ int RenderHandler::getScalingFactor() const
return GH.screenHandler().getScalingFactor(); return GH.screenHandler().getScalingFactor();
} }
std::shared_ptr<IImage> RenderHandler::createImageReference(const ImageLocator & locator, std::shared_ptr<ISharedImage> input, EImageBlitMode mode)
{
if (getScalingFactor() == 1 || locator.scalingFactor != 1 || locator.empty())
return input->createImageReference(mode);
else
return std::make_shared<ImageScaled>(locator, input, mode);
}
ImageLocator RenderHandler::getLocatorForAnimationFrame(const AnimationPath & path, int frame, int group) ImageLocator RenderHandler::getLocatorForAnimationFrame(const AnimationPath & path, int frame, int group)
{ {
const auto & layout = getAnimationLayout(path); const auto & layout = getAnimationLayout(path);
@ -248,23 +240,46 @@ std::shared_ptr<ISharedImage> RenderHandler::scaleImage(const ImageLocator & loc
std::shared_ptr<IImage> RenderHandler::loadImage(const ImageLocator & locator, EImageBlitMode mode) std::shared_ptr<IImage> RenderHandler::loadImage(const ImageLocator & locator, EImageBlitMode mode)
{ {
return createImageReference(locator, loadImageImpl(locator), mode); if (locator.scalingFactor == 0 && getScalingFactor() != 1 )
{
auto unscaledLocator = locator;
auto scaledLocator = locator;
unscaledLocator.scalingFactor = 1;
scaledLocator.scalingFactor = getScalingFactor();
auto unscaledImage = loadImageImpl(unscaledLocator);
return std::make_shared<ImageScaled>(scaledLocator, unscaledImage, mode);
}
if (locator.scalingFactor == 0)
{
auto scaledLocator = locator;
scaledLocator.scalingFactor = getScalingFactor();
return loadImageImpl(scaledLocator)->createImageReference(mode);
}
else
{
return loadImageImpl(locator)->createImageReference(mode);
}
} }
std::shared_ptr<IImage> RenderHandler::loadImage(const AnimationPath & path, int frame, int group, EImageBlitMode mode) std::shared_ptr<IImage> RenderHandler::loadImage(const AnimationPath & path, int frame, int group, EImageBlitMode mode)
{ {
auto locator = getLocatorForAnimationFrame(path, frame, group); ImageLocator locator = getLocatorForAnimationFrame(path, frame, group);
return loadImage(locator, mode); return loadImage(locator, mode);
} }
std::shared_ptr<IImage> RenderHandler::loadImage(const ImagePath & path, EImageBlitMode mode) std::shared_ptr<IImage> RenderHandler::loadImage(const ImagePath & path, EImageBlitMode mode)
{ {
return loadImage(ImageLocator(path), mode); ImageLocator locator(path);
return loadImage(locator, mode);
} }
std::shared_ptr<IImage> RenderHandler::createImage(SDL_Surface * source) std::shared_ptr<IImage> RenderHandler::createImage(SDL_Surface * source)
{ {
return createImageReference(ImageLocator(), std::make_shared<SDLImageShared>(source), EImageBlitMode::ALPHA); return std::make_shared<SDLImageShared>(source)->createImageReference(EImageBlitMode::ALPHA);
} }
std::shared_ptr<CAnimation> RenderHandler::loadAnimation(const AnimationPath & path, EImageBlitMode mode) std::shared_ptr<CAnimation> RenderHandler::loadAnimation(const AnimationPath & path, EImageBlitMode mode)

View File

@ -46,7 +46,6 @@ class RenderHandler : public IRenderHandler
int getScalingFactor() const; int getScalingFactor() const;
std::shared_ptr<IImage> createImageReference(const ImageLocator & locator, std::shared_ptr<ISharedImage> input, EImageBlitMode mode);
public: public:
// IRenderHandler implementation // IRenderHandler implementation