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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user