diff --git a/src/openrct2-ui/scripting/CustomImages.cpp b/src/openrct2-ui/scripting/CustomImages.cpp index c3839c7cae..93d2854890 100644 --- a/src/openrct2-ui/scripting/CustomImages.cpp +++ b/src/openrct2-ui/scripting/CustomImages.cpp @@ -322,7 +322,8 @@ namespace OpenRCT2::Scripting auto importMode = getImportModeFromPalette(pixelData.Palette); auto pngData = DukGetDataFromBufferLikeObject(pixelData.Data); auto image = Imaging::ReadFromBuffer(pngData, imageFormat); - ImageImportMeta meta = { { 0, 0 }, palette, ImportFlags::RLE, importMode }; + uint8_t flags = EnumToFlag(ImportFlags::RLE); + ImageImportMeta meta = { { 0, 0 }, palette, flags, importMode }; ImageImporter importer; auto importResult = importer.Import(image, meta); diff --git a/src/openrct2/CommandLineSprite.cpp b/src/openrct2/CommandLineSprite.cpp index e9a185fe38..d31c0435a3 100644 --- a/src/openrct2/CommandLineSprite.cpp +++ b/src/openrct2/CommandLineSprite.cpp @@ -498,7 +498,8 @@ int32_t CommandLineForSprite(const char** argv, int32_t argc) } } - ImageImportMeta meta = { { xOffset, yOffset }, Palette::OpenRCT2, ImportFlags::RLE, gSpriteMode }; + uint8_t importFlags = EnumToFlag(ImportFlags::RLE); + ImageImportMeta meta = { { xOffset, yOffset }, Palette::OpenRCT2, importFlags, gSpriteMode }; auto importResult = SpriteImageImport(imagePath, meta); if (!importResult.has_value()) return -1; diff --git a/src/openrct2/drawing/ImageImporter.cpp b/src/openrct2/drawing/ImageImporter.cpp index c5fc730faa..f841535156 100644 --- a/src/openrct2/drawing/ImageImporter.cpp +++ b/src/openrct2/drawing/ImageImporter.cpp @@ -11,6 +11,7 @@ #include "../core/Imaging.h" #include "../core/Json.hpp" +#include "../util/Util.h" #include #include @@ -37,7 +38,7 @@ namespace OpenRCT2::Drawing { throw std::invalid_argument("Image is not paletted, it has bit depth of " + std::to_string(image.Depth)); } - const bool isRLE = meta.importFlags & ImportFlags::RLE; + const bool isRLE = HasFlag(meta.importFlags, ImportFlags::RLE); auto pixels = GetPixels(image, meta); auto buffer = isRLE ? EncodeRLE(pixels.data(), meta.srcSize) : EncodeRaw(pixels.data(), meta.srcSize); @@ -49,6 +50,8 @@ namespace OpenRCT2::Drawing outElement.x_offset = meta.offset.x; outElement.y_offset = meta.offset.y; outElement.zoomed_offset = meta.zoomedOffset; + if (HasFlag(meta.importFlags, ImportFlags::NoDrawOnZoom)) + outElement.flags |= G1_FLAG_NO_ZOOM_DRAW; ImageImporter::ImportResult result; result.Element = outElement; @@ -388,9 +391,14 @@ namespace OpenRCT2::Drawing auto yOffset = Json::GetNumber(input["y"]); auto keepPalette = Json::GetString(input["palette"]) == "keep"; auto palette = keepPalette ? Palette::KeepIndices : Palette::OpenRCT2; + uint8_t flags = 0; auto raw = Json::GetString(input["format"]) == "raw"; - auto flags = raw ? ImportFlags::None : ImportFlags::RLE; + if (!raw) + flags |= EnumToFlag(ImportFlags::RLE); + + if (Json::GetBoolean("noDrawOnZoom")) + flags |= EnumToFlag(ImportFlags::NoDrawOnZoom); auto srcX = Json::GetNumber(input["srcX"]); auto srcY = Json::GetNumber(input["srcY"]); diff --git a/src/openrct2/drawing/ImageImporter.h b/src/openrct2/drawing/ImageImporter.h index e9ec90feb7..20fefbb07c 100644 --- a/src/openrct2/drawing/ImageImporter.h +++ b/src/openrct2/drawing/ImageImporter.h @@ -11,6 +11,7 @@ #include "../core/Imaging.h" #include "../core/JsonFwd.hpp" +#include "../util/Util.h" #include "Drawing.h" #include @@ -27,10 +28,10 @@ namespace OpenRCT2::Drawing Dithering, }; - enum ImportFlags : uint8_t + enum class ImportFlags : uint8_t { - None = 0, - RLE = 1 << 1, + RLE, + NoDrawOnZoom, }; enum class Palette : uint8_t @@ -43,7 +44,7 @@ namespace OpenRCT2::Drawing { ScreenCoordsXY offset{}; Palette palette = Palette::OpenRCT2; - ImportFlags importFlags = ImportFlags::RLE; + uint8_t importFlags = EnumToFlag(ImportFlags::RLE); ImportMode importMode = ImportMode::Default; ScreenCoordsXY srcOffset{}; ScreenSize srcSize{}; diff --git a/src/openrct2/util/Util.h b/src/openrct2/util/Util.h index 17c3f14506..024989b204 100644 --- a/src/openrct2/util/Util.h +++ b/src/openrct2/util/Util.h @@ -127,6 +127,12 @@ template constexpr auto EnumValue(TEnum enumerator) noexcept return static_cast>(enumerator); } +template constexpr bool HasFlag(uint64_t holder, T v) +{ + static_assert(std::is_enum_v); + return (holder & EnumToFlag(v)) != 0; +} + constexpr uint8_t HiByte(uint16_t value) { return static_cast(value >> 8);