diff --git a/src/openrct2/drawing/Drawing.cpp b/src/openrct2/drawing/Drawing.cpp index 6aea394594..6b5d31ccdc 100644 --- a/src/openrct2/drawing/Drawing.cpp +++ b/src/openrct2/drawing/Drawing.cpp @@ -96,7 +96,7 @@ void PaletteMap::Copy(size_t dstIndex, const PaletteMap& src, size_t srcIndex, s } OpenRCT2::Drawing::GamePalette gPalette; -uint8_t gGamePalette[256 * 4]; +OpenRCT2::Drawing::GamePalette gGamePalette; uint32_t gPaletteEffectFrame; ImageId gPickupPeepImage; @@ -717,16 +717,17 @@ void GfxTransposePalette(int32_t pal, uint8_t product) { int32_t width = g1->width; int32_t x = g1->x_offset; - uint8_t* dest_pointer = &gGamePalette[x * 4]; uint8_t* source_pointer = g1->offset; for (; width > 0; width--) { - dest_pointer[0] = (source_pointer[0] * product) >> 8; - dest_pointer[1] = (source_pointer[1] * product) >> 8; - dest_pointer[2] = (source_pointer[2] * product) >> 8; + auto& dest_pointer = gGamePalette[x]; + dest_pointer.Blue = (source_pointer[0] * product) >> 8; + dest_pointer.Green = (source_pointer[1] * product) >> 8; + dest_pointer.Red = (source_pointer[2] * product) >> 8; source_pointer += 3; - dest_pointer += 4; + + x++; } UpdatePalette(gGamePalette, 10, 236); } @@ -758,14 +759,14 @@ void LoadPalette() int32_t width = g1->width; int32_t x = g1->x_offset; uint8_t* src = g1->offset; - uint8_t* dst = &gGamePalette[x * 4]; for (; width > 0; width--) { - dst[0] = src[0]; - dst[1] = src[1]; - dst[2] = src[2]; + auto& dst = gGamePalette[x]; + dst.Blue = src[0]; + dst.Green = src[1]; + dst.Red = src[2]; src += 3; - dst += 4; + x++; } } UpdatePalette(gGamePalette, 10, 236); @@ -910,15 +911,14 @@ FilterPaletteID GetGlassPaletteId(colour_t c) return GlassPaletteIds[c]; } -void UpdatePalette(const uint8_t* colours, int32_t start_index, int32_t num_colours) +void UpdatePalette(std::span palette, int32_t start_index, int32_t num_colours) { - colours += start_index * 4; - for (int32_t i = start_index; i < num_colours + start_index; i++) { - uint8_t r = colours[2]; - uint8_t g = colours[1]; - uint8_t b = colours[0]; + const auto& colour = palette[i]; + uint8_t b = colour.Blue; + uint8_t g = colour.Green; + uint8_t r = colour.Red; if (LightFXIsAvailable()) { @@ -935,18 +935,17 @@ void UpdatePalette(const uint8_t* colours, int32_t start_index, int32_t num_colo } } - gPalette[i].Red = r; - gPalette[i].Green = g; gPalette[i].Blue = b; + gPalette[i].Green = g; + gPalette[i].Red = r; gPalette[i].Alpha = 0; - colours += 4; } // Fix #1749 and #6535: rainbow path, donut shop and pause button contain black spots that should be white. - gPalette[255].Alpha = 0; - gPalette[255].Red = 255; - gPalette[255].Green = 255; gPalette[255].Blue = 255; + gPalette[255].Green = 255; + gPalette[255].Red = 255; + gPalette[255].Alpha = 0; if (!gOpenRCT2Headless) { @@ -989,14 +988,15 @@ void UpdatePaletteEffects() if (g1 != nullptr) { int32_t xoffset = g1->x_offset; - xoffset = xoffset * 4; - uint8_t* paletteOffset = gGamePalette + xoffset; + for (int32_t i = 0; i < g1->width; i++) { - paletteOffset[(i * 4) + 0] = -((0xFF - g1->offset[(i * 3) + 0]) / 2) - 1; - paletteOffset[(i * 4) + 1] = -((0xFF - g1->offset[(i * 3) + 1]) / 2) - 1; - paletteOffset[(i * 4) + 2] = -((0xFF - g1->offset[(i * 3) + 2]) / 2) - 1; + auto& paletteOffset = gGamePalette[xoffset + i]; + paletteOffset.Blue = -((0xFF - g1->offset[(i * 3) + 0]) / 2) - 1; + paletteOffset.Green = -((0xFF - g1->offset[(i * 3) + 1]) / 2) - 1; + paletteOffset.Red = -((0xFF - g1->offset[(i * 3) + 2]) / 2) - 1; } + UpdatePalette(gGamePalette, kPaletteOffsetDynamic, kPaletteLengthDynamic); } gClimateLightningFlash++; @@ -1017,13 +1017,13 @@ void UpdatePaletteEffects() if (g1 != nullptr) { int32_t xoffset = g1->x_offset; - xoffset = xoffset * 4; - uint8_t* paletteOffset = gGamePalette + xoffset; + for (int32_t i = 0; i < g1->width; i++) { - paletteOffset[(i * 4) + 0] = g1->offset[(i * 3) + 0]; - paletteOffset[(i * 4) + 1] = g1->offset[(i * 3) + 1]; - paletteOffset[(i * 4) + 2] = g1->offset[(i * 3) + 2]; + auto& paletteOffset = gGamePalette[xoffset + i]; + paletteOffset.Blue = g1->offset[(i * 3) + 0]; + paletteOffset.Green = g1->offset[(i * 3) + 1]; + paletteOffset.Red = g1->offset[(i * 3) + 2]; } } } @@ -1053,19 +1053,18 @@ void UpdatePaletteEffects() if (g1 != nullptr) { uint8_t* vs = &g1->offset[j * 3]; - uint8_t* vd = &gGamePalette[kPaletteOffsetWaterWaves * 4]; int32_t n = kPaletteLengthWaterWaves; for (int32_t i = 0; i < n; i++) { - vd[0] = vs[0]; - vd[1] = vs[1]; - vd[2] = vs[2]; + auto& vd = gGamePalette[kPaletteOffsetWaterWaves + i]; + vd.Blue = vs[0]; + vd.Green = vs[1]; + vd.Red = vs[2]; vs += 9; if (vs >= &g1->offset[9 * n]) { vs -= 9 * n; } - vd += 4; } } @@ -1074,23 +1073,23 @@ void UpdatePaletteEffects() { waterId = water_type->palette_index_2; } + g1 = GfxGetG1Element(shade + waterId); if (g1 != nullptr) { uint8_t* vs = &g1->offset[j * 3]; - uint8_t* vd = &gGamePalette[kPaletteOffsetWaterSparkles * 4]; int32_t n = kPaletteLengthWaterSparkles; for (int32_t i = 0; i < n; i++) { - vd[0] = vs[0]; - vd[1] = vs[1]; - vd[2] = vs[2]; + auto& vd = gGamePalette[kPaletteOffsetWaterSparkles]; + vd.Blue = vs[0]; + vd.Green = vs[1]; + vd.Red = vs[2]; vs += 9; if (vs >= &g1->offset[9 * n]) { vs -= 9 * n; } - vd += 4; } } @@ -1100,19 +1099,18 @@ void UpdatePaletteEffects() if (g1 != nullptr) { uint8_t* vs = &g1->offset[j * 3]; - uint8_t* vd = &gGamePalette[PALETTE_INDEX_243 * 4]; int32_t n = 3; for (int32_t i = 0; i < n; i++) { - vd[0] = vs[0]; - vd[1] = vs[1]; - vd[2] = vs[2]; + auto& vd = gGamePalette[PALETTE_INDEX_243 + i]; + vd.Blue = vs[0]; + vd.Green = vs[1]; + vd.Red = vs[2]; vs += 3; if (vs >= &g1->offset[3 * n]) { vs -= 3 * n; } - vd += 4; } } diff --git a/src/openrct2/drawing/Drawing.h b/src/openrct2/drawing/Drawing.h index 530c876520..264888d397 100644 --- a/src/openrct2/drawing/Drawing.h +++ b/src/openrct2/drawing/Drawing.h @@ -23,6 +23,7 @@ #include #include #include +#include #include struct ScreenCoordsXY; @@ -491,7 +492,7 @@ constexpr uint8_t kPaletteTotalOffsets = 192; constexpr int8_t kMaxScrollingTextModes = 38; extern OpenRCT2::Drawing::GamePalette gPalette; -extern uint8_t gGamePalette[256 * 4]; +extern OpenRCT2::Drawing::GamePalette gGamePalette; extern uint32_t gPaletteEffectFrame; extern uint8_t gTextPalette[]; @@ -604,7 +605,7 @@ void MaskFn( std::optional GetPaletteG1Index(colour_t paletteId); std::optional GetPaletteMapForColour(colour_t paletteId); -void UpdatePalette(const uint8_t* colours, int32_t start_index, int32_t num_colours); +void UpdatePalette(std::span palette, int32_t start_index, int32_t num_colours); void UpdatePaletteEffects(); void RefreshVideo();