From 4abd96dba46cfc3653763f5dbee1488ce6e878c1 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Fri, 13 Sep 2024 12:26:31 +0000 Subject: [PATCH] Add debug code to save every loaded image to a file --- client/render/ImageLocator.cpp | 6 +++++- client/renderSDL/RenderHandler.cpp | 20 +++++++++++++++++--- client/renderSDL/RenderHandler.h | 1 + client/renderSDL/SDLImage.cpp | 3 +++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/client/render/ImageLocator.cpp b/client/render/ImageLocator.cpp index 1db17f309..a9f732923 100644 --- a/client/render/ImageLocator.cpp +++ b/client/render/ImageLocator.cpp @@ -98,11 +98,15 @@ std::string ImageLocator::toString() const return "invalid"; if (image) + { result += image->getOriginalName(); + assert(!result.empty()); + } if (defFile) { result += defFile->getOriginalName(); + assert(!result.empty()); result += "-" + std::to_string(defGroup); result += "-" + std::to_string(defFrame); } @@ -120,7 +124,7 @@ std::string ImageLocator::toString() const result += "-player" + playerColored.toString(); if (layer != EImageLayer::ALL) - result =+ "-layer" + std::to_string(static_cast(layer)); + result += "-layer" + std::to_string(static_cast(layer)); return result; } diff --git a/client/renderSDL/RenderHandler.cpp b/client/renderSDL/RenderHandler.cpp index 3b4cbc40f..25a15d3af 100644 --- a/client/renderSDL/RenderHandler.cpp +++ b/client/renderSDL/RenderHandler.cpp @@ -23,6 +23,7 @@ #include "../../lib/json/JsonUtils.h" #include "../../lib/filesystem/Filesystem.h" +#include "../../lib/VCMIDirs.h" #include #include @@ -188,13 +189,26 @@ std::shared_ptr RenderHandler::loadImageFromFileUncached(const Ima throw std::runtime_error("Invalid image locator received!"); } +void RenderHandler::storeCachedImage(const ImageLocator & locator, std::shared_ptr image) +{ + imageFiles[locator] = image; + +#if 0 + const boost::filesystem::path outPath = VCMIDirs::get().userExtractedPath() / "imageCache" / (locator.toString() + ".png"); + boost::filesystem::path outDir = outPath; + outDir.remove_filename(); + boost::filesystem::create_directories(outDir); + image->exportBitmap(outPath , nullptr); +#endif +} + std::shared_ptr RenderHandler::loadImageFromFile(const ImageLocator & locator) { if (imageFiles.count(locator)) return imageFiles.at(locator); auto result = loadImageFromFileUncached(locator); - imageFiles[locator] = result; + storeCachedImage(locator, result); return result; } @@ -211,7 +225,7 @@ std::shared_ptr RenderHandler::transformImage(const ImageLocator & if (locator.horizontalFlip) result = result->horizontalFlip(); - imageFiles[locator] = result; + storeCachedImage(locator, result); return result; } @@ -234,7 +248,7 @@ std::shared_ptr RenderHandler::scaleImage(const ImageLocator & loc // TODO: try to optimize image size (possibly even before scaling?) - trim image borders if they are completely transparent auto result = handle->getSharedImage(); - imageFiles[locator] = result; + storeCachedImage(locator, result); return result; } diff --git a/client/renderSDL/RenderHandler.h b/client/renderSDL/RenderHandler.h index 0ab336e65..ee874c0dd 100644 --- a/client/renderSDL/RenderHandler.h +++ b/client/renderSDL/RenderHandler.h @@ -33,6 +33,7 @@ class RenderHandler : public IRenderHandler void addImageListEntry(size_t index, size_t group, const std::string & listName, const std::string & imageName); void addImageListEntries(const EntityService * service); + void storeCachedImage(const ImageLocator & locator, std::shared_ptr image); std::shared_ptr loadImageImpl(const ImageLocator & config); diff --git a/client/renderSDL/SDLImage.cpp b/client/renderSDL/SDLImage.cpp index 9ebb3abd2..e75d04a87 100644 --- a/client/renderSDL/SDLImage.cpp +++ b/client/renderSDL/SDLImage.cpp @@ -330,6 +330,9 @@ std::shared_ptr SDLImageShared::scaleTo(const Point & size, SDL_Pa void SDLImageShared::exportBitmap(const boost::filesystem::path& path, SDL_Palette * palette) const { + if (!surf) + return; + if (palette && surf->format->palette) SDL_SetSurfacePalette(surf, palette); IMG_SavePNG(surf, path.string().c_str());