1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 19:13:07 +01:00

Use GamePalette instead of raw byte array

This commit is contained in:
ζeh Matt
2024-12-05 23:38:00 +02:00
parent 6cb6e0a621
commit c23071f67f
2 changed files with 49 additions and 50 deletions

View File

@@ -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<const OpenRCT2::Drawing::PaletteBGRA> 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;
}
}

View File

@@ -23,6 +23,7 @@
#include <cassert>
#include <memory>
#include <optional>
#include <span>
#include <vector>
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<uint32_t> GetPaletteG1Index(colour_t paletteId);
std::optional<PaletteMap> GetPaletteMapForColour(colour_t paletteId);
void UpdatePalette(const uint8_t* colours, int32_t start_index, int32_t num_colours);
void UpdatePalette(std::span<const OpenRCT2::Drawing::PaletteBGRA> palette, int32_t start_index, int32_t num_colours);
void UpdatePaletteEffects();
void RefreshVideo();