From 9f5b344a4638f105e717212ed34a0a53fdc107a7 Mon Sep 17 00:00:00 2001 From: Spacek531 Date: Thu, 9 May 2024 19:21:44 -0700 Subject: [PATCH 1/2] =?UTF-8?q?Allow=20setting=20=E2=80=9Cno=20draw=20on?= =?UTF-8?q?=20zoom=20flag=E2=80=9D=20in=20image=20JSON?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/openrct2/drawing/ImageImporter.cpp | 17 ++++++++++++++--- src/openrct2/drawing/ImageImporter.h | 1 + 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/openrct2/drawing/ImageImporter.cpp b/src/openrct2/drawing/ImageImporter.cpp index c5fc730faa..73f4d7a06c 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 @@ -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 (meta.importFlags & ImportFlags::NoDrawOnZoom) + outElement.flags |= G1_FLAG_NO_ZOOM_DRAW; ImageImporter::ImportResult result; result.Element = outElement; @@ -388,17 +391,25 @@ namespace OpenRCT2::Drawing auto yOffset = Json::GetNumber(input["y"]); auto keepPalette = Json::GetString(input["palette"]) == "keep"; auto palette = keepPalette ? Palette::KeepIndices : Palette::OpenRCT2; + auto flags = EnumValue(ImportFlags::None); auto raw = Json::GetString(input["format"]) == "raw"; - auto flags = raw ? ImportFlags::None : ImportFlags::RLE; + if (!raw) + flags |= EnumValue(ImportFlags::RLE); + flags |= Json::GetFlags( + input, + { + { "noDrawOnZoom", ImportFlags::NoDrawOnZoom }, + }); auto srcX = Json::GetNumber(input["srcX"]); auto srcY = Json::GetNumber(input["srcY"]); auto srcWidth = Json::GetNumber(input["srcWidth"]); auto srcHeight = Json::GetNumber(input["srcHeight"]); auto zoomedOffset = Json::GetNumber(input["zoom"]); - return ImageImportMeta{ { xOffset, yOffset }, palette, flags, ImportMode::Default, { srcX, srcY }, - { srcWidth, srcHeight }, zoomedOffset }; + return ImageImportMeta{ { xOffset, yOffset }, palette, static_cast(flags), + ImportMode::Default, { srcX, srcY }, { srcWidth, srcHeight }, + zoomedOffset }; }; } // namespace OpenRCT2::Drawing diff --git a/src/openrct2/drawing/ImageImporter.h b/src/openrct2/drawing/ImageImporter.h index e9ec90feb7..0bf6ab054a 100644 --- a/src/openrct2/drawing/ImageImporter.h +++ b/src/openrct2/drawing/ImageImporter.h @@ -31,6 +31,7 @@ namespace OpenRCT2::Drawing { None = 0, RLE = 1 << 1, + NoDrawOnZoom = 1 << 2, }; enum class Palette : uint8_t From d90897fbeee6d9137395ecb78f642fd2ae22f3dd Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 7 Aug 2024 18:42:09 +0200 Subject: [PATCH 2/2] Refactor import flags --- src/openrct2-ui/scripting/CustomImages.cpp | 3 ++- src/openrct2/CommandLineSprite.cpp | 3 ++- src/openrct2/drawing/ImageImporter.cpp | 21 +++++++++------------ src/openrct2/drawing/ImageImporter.h | 10 +++++----- src/openrct2/util/Util.h | 6 ++++++ 5 files changed, 24 insertions(+), 19 deletions(-) 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 73f4d7a06c..f841535156 100644 --- a/src/openrct2/drawing/ImageImporter.cpp +++ b/src/openrct2/drawing/ImageImporter.cpp @@ -38,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); @@ -50,7 +50,7 @@ namespace OpenRCT2::Drawing outElement.x_offset = meta.offset.x; outElement.y_offset = meta.offset.y; outElement.zoomed_offset = meta.zoomedOffset; - if (meta.importFlags & ImportFlags::NoDrawOnZoom) + if (HasFlag(meta.importFlags, ImportFlags::NoDrawOnZoom)) outElement.flags |= G1_FLAG_NO_ZOOM_DRAW; ImageImporter::ImportResult result; @@ -391,25 +391,22 @@ namespace OpenRCT2::Drawing auto yOffset = Json::GetNumber(input["y"]); auto keepPalette = Json::GetString(input["palette"]) == "keep"; auto palette = keepPalette ? Palette::KeepIndices : Palette::OpenRCT2; - auto flags = EnumValue(ImportFlags::None); + uint8_t flags = 0; auto raw = Json::GetString(input["format"]) == "raw"; if (!raw) - flags |= EnumValue(ImportFlags::RLE); + flags |= EnumToFlag(ImportFlags::RLE); + + if (Json::GetBoolean("noDrawOnZoom")) + flags |= EnumToFlag(ImportFlags::NoDrawOnZoom); - flags |= Json::GetFlags( - input, - { - { "noDrawOnZoom", ImportFlags::NoDrawOnZoom }, - }); auto srcX = Json::GetNumber(input["srcX"]); auto srcY = Json::GetNumber(input["srcY"]); auto srcWidth = Json::GetNumber(input["srcWidth"]); auto srcHeight = Json::GetNumber(input["srcHeight"]); auto zoomedOffset = Json::GetNumber(input["zoom"]); - return ImageImportMeta{ { xOffset, yOffset }, palette, static_cast(flags), - ImportMode::Default, { srcX, srcY }, { srcWidth, srcHeight }, - zoomedOffset }; + return ImageImportMeta{ { xOffset, yOffset }, palette, flags, ImportMode::Default, { srcX, srcY }, + { srcWidth, srcHeight }, zoomedOffset }; }; } // namespace OpenRCT2::Drawing diff --git a/src/openrct2/drawing/ImageImporter.h b/src/openrct2/drawing/ImageImporter.h index 0bf6ab054a..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,11 +28,10 @@ namespace OpenRCT2::Drawing Dithering, }; - enum ImportFlags : uint8_t + enum class ImportFlags : uint8_t { - None = 0, - RLE = 1 << 1, - NoDrawOnZoom = 1 << 2, + RLE, + NoDrawOnZoom, }; enum class Palette : uint8_t @@ -44,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);