From 4b25345d8d2ca4a9d4e48e6d18397df8bc8eee6f Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Tue, 19 May 2020 21:05:56 +0200 Subject: [PATCH] Create GamePalette struct --- src/openrct2/CmdlineSprite.cpp | 12 ++++++------ src/openrct2/core/Imaging.h | 17 +++++++++++++++++ src/openrct2/drawing/ImageImporter.cpp | 8 ++++---- src/openrct2/drawing/ImageImporter.h | 8 ++++---- 4 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/openrct2/CmdlineSprite.cpp b/src/openrct2/CmdlineSprite.cpp index 4fcf3502bd..77f67b7ac6 100644 --- a/src/openrct2/CmdlineSprite.cpp +++ b/src/openrct2/CmdlineSprite.cpp @@ -38,7 +38,7 @@ assert_struct_size(rct_sprite_file_header, 8); #pragma pack(pop) -static PaletteBGRA spriteFilePalette[256]; +static GamePalette spriteFilePalette; static rct_sprite_file_header spriteFileHeader; static rct_g1_element* spriteFileEntries; @@ -215,19 +215,19 @@ static bool sprite_file_export(int32_t spriteIndex, const char* outPath) dpi.pitch = 0; dpi.zoom_level = 0; - std::memcpy(spriteFilePalette, StandardPalette, 256 * sizeof(PaletteBGRA)); + spriteFilePalette = StandardPalette; if (spriteHeader->flags & G1_FLAG_RLE_COMPRESSION) { gfx_rle_sprite_to_buffer( - spriteHeader->offset, pixels, reinterpret_cast(spriteFilePalette), &dpi, ImageId(), 0, - spriteHeader->height, 0, spriteHeader->width); + spriteHeader->offset, pixels, static_cast(spriteFilePalette), &dpi, ImageId(), 0, spriteHeader->height, 0, + spriteHeader->width); } else { gfx_bmp_sprite_to_buffer( - reinterpret_cast(spriteFilePalette), spriteHeader->offset, pixels, spriteHeader, &dpi, - spriteHeader->height, spriteHeader->width, ImageId()); + static_cast(spriteFilePalette), spriteHeader->offset, pixels, spriteHeader, &dpi, spriteHeader->height, + spriteHeader->width, ImageId()); } auto const pixels8 = dpi.bits; diff --git a/src/openrct2/core/Imaging.h b/src/openrct2/core/Imaging.h index 74d58e5b31..5da84a02e5 100644 --- a/src/openrct2/core/Imaging.h +++ b/src/openrct2/core/Imaging.h @@ -29,6 +29,23 @@ struct PaletteBGRA uint8_t Alpha{}; }; +constexpr const auto PALETTE_SIZE = 256; + +struct GamePalette +{ + PaletteBGRA Colour[PALETTE_SIZE]; + + const PaletteBGRA& operator[](uint16_t idx) const + { + return Colour[idx]; + } + + explicit operator uint8_t*() + { + return reinterpret_cast(Colour); + } +}; + enum class IMAGE_FORMAT { UNKNOWN, diff --git a/src/openrct2/drawing/ImageImporter.cpp b/src/openrct2/drawing/ImageImporter.cpp index 5b5ea5c6d2..e180e2b473 100644 --- a/src/openrct2/drawing/ImageImporter.cpp +++ b/src/openrct2/drawing/ImageImporter.cpp @@ -292,11 +292,11 @@ int32_t ImageImporter::CalculatePaletteIndex( return paletteIndex; } -int32_t ImageImporter::GetPaletteIndex(const PaletteBGRA* palette, int16_t* colour) +int32_t ImageImporter::GetPaletteIndex(const GamePalette& palette, int16_t* colour) { if (!IsTransparentPixel(colour)) { - for (int32_t i = 0; i < 256; i++) + for (int32_t i = 0; i < PALETTE_SIZE; i++) { if (static_cast(palette[i].Red) == colour[0] && static_cast(palette[i].Green) == colour[1] && static_cast(palette[i].Blue) == colour[2]) @@ -333,11 +333,11 @@ bool ImageImporter::IsChangablePixel(int32_t paletteIndex) return true; } -int32_t ImageImporter::GetClosestPaletteIndex(const PaletteBGRA* palette, const int16_t* colour) +int32_t ImageImporter::GetClosestPaletteIndex(const GamePalette& palette, const int16_t* colour) { auto smallestError = static_cast(-1); auto bestMatch = PALETTE_TRANSPARENT; - for (int32_t x = 0; x < 256; x++) + for (int32_t x = 0; x < PALETTE_SIZE; x++) { if (IsChangablePixel(x)) { diff --git a/src/openrct2/drawing/ImageImporter.h b/src/openrct2/drawing/ImageImporter.h index 88d67230c4..6c1d108fe6 100644 --- a/src/openrct2/drawing/ImageImporter.h +++ b/src/openrct2/drawing/ImageImporter.h @@ -58,14 +58,14 @@ namespace OpenRCT2::Drawing static int32_t CalculatePaletteIndex( IMPORT_MODE mode, int16_t* rgbaSrc, int32_t x, int32_t y, int32_t width, int32_t height); - static int32_t GetPaletteIndex(const PaletteBGRA* palette, int16_t* colour); + static int32_t GetPaletteIndex(const GamePalette& palette, int16_t* colour); static bool IsTransparentPixel(const int16_t* colour); static bool IsChangablePixel(int32_t paletteIndex); - static int32_t GetClosestPaletteIndex(const PaletteBGRA* palette, const int16_t* colour); + static int32_t GetClosestPaletteIndex(const GamePalette& palette, const int16_t* colour); }; } // namespace OpenRCT2::Drawing -constexpr const PaletteBGRA StandardPalette[256] = { +constexpr const GamePalette StandardPalette = { { // 0 (unused) { 0, 0, 0, 255 }, @@ -348,4 +348,4 @@ constexpr const PaletteBGRA StandardPalette[256] = { // 255 (unused?) { 0, 0, 0, 255 }, -}; +} };