Path: blob/main/RSDKv4/Palette.hpp
817 views
#ifndef PALETTE_H1#define PALETTE_H23#define PALETTE_COUNT (0x8)4#define PALETTE_COLOR_COUNT (0x100)56struct Color {7byte r;8byte g;9byte b;10byte a;11};1213struct PaletteEntry {14byte r;15byte g;16byte b;17};1819// Palettes (as RGB565 Colors)20extern PaletteEntry fullPalette32[PALETTE_COUNT][PALETTE_COLOR_COUNT];21extern ushort fullPalette[PALETTE_COUNT][PALETTE_COLOR_COUNT];22extern ushort *activePalette; // Pointers to the 256 color set thats active23extern PaletteEntry *activePalette32;2425extern byte gfxLineBuffer[SCREEN_YSIZE]; // Pointers to active palette26extern int GFX_LINESIZE;27extern int GFX_LINESIZE_MINUSONE;28extern int GFX_LINESIZE_DOUBLE;29extern int GFX_FRAMEBUFFERSIZE;30extern int GFX_FBUFFERMINUSONE;3132extern uint gfxPalette16to32[0x10000];3334extern int fadeMode;35extern byte fadeA;36extern byte fadeR;37extern byte fadeG;38extern byte fadeB;3940extern int paletteMode;4142#define RGB888_TO_RGB5551(r, g, b) (2 * ((b) >> 3) | ((g) >> 3 << 6) | ((r) >> 3 << 11) | 0) // used in mobile vers43#define RGB888_TO_RGB565(r, g, b) ((b) >> 3) | (((g) >> 2) << 5) | (((r) >> 3) << 11) // used in pc vers4445#if RETRO_SOFTWARE_RENDER46#define PACK_RGB888(r, g, b) RGB888_TO_RGB565(r, g, b)47#elif RETRO_USING_OPENGL48#define PACK_RGB888(r, g, b) RGB888_TO_RGB5551(r, g, b)49#endif5051void LoadPalette(const char *filePath, int paletteID, int startPaletteIndex, int startIndex, int endIndex);5253inline void SetActivePalette(byte newActivePal, int startLine, int endLine)54{55#if RETRO_SOFTWARE_RENDER56if (newActivePal < PALETTE_COUNT)57for (int l = startLine; l < endLine && l < SCREEN_YSIZE; l++) gfxLineBuffer[l] = newActivePal;5859activePalette = fullPalette[gfxLineBuffer[0]];60activePalette32 = fullPalette32[gfxLineBuffer[0]];61#endif62}6364inline void SetPaletteEntry(byte paletteIndex, byte index, byte r, byte g, byte b)65{66if (paletteIndex != 0xFF) {67fullPalette[paletteIndex][index] = PACK_RGB888(r, g, b);68fullPalette32[paletteIndex][index].r = r;69fullPalette32[paletteIndex][index].g = g;70fullPalette32[paletteIndex][index].b = b;71}72else {73activePalette[index] = PACK_RGB888(r, g, b);74activePalette32[index].r = r;75activePalette32[index].g = g;76activePalette32[index].b = b;77}78}7980inline void SetPaletteEntryPacked(byte paletteIndex, byte index, uint color)81{82fullPalette[paletteIndex][index] = PACK_RGB888((byte)(color >> 16), (byte)(color >> 8), (byte)(color >> 0));8384fullPalette32[paletteIndex][index].r = (byte)(color >> 16);85fullPalette32[paletteIndex][index].g = (byte)(color >> 8);86fullPalette32[paletteIndex][index].b = (byte)(color >> 0);87}8889inline uint GetPaletteEntryPacked(byte paletteIndex, byte index)90{91PaletteEntry clr = fullPalette32[paletteIndex][index];92return (clr.r << 16) | (clr.g << 8) | (clr.b);93}9495inline void CopyPalette(byte sourcePalette, byte srcPaletteStart, byte destinationPalette, byte destPaletteStart, byte count)96{97if (sourcePalette < PALETTE_COUNT && destinationPalette < PALETTE_COUNT) {98for (int i = 0; i < count; ++i) {99fullPalette[destinationPalette][destPaletteStart + i] = fullPalette[sourcePalette][srcPaletteStart + i];100fullPalette32[destinationPalette][destPaletteStart + i] = fullPalette32[sourcePalette][srcPaletteStart + i];101}102}103}104105inline void RotatePalette(int palID, byte startIndex, byte endIndex, bool right)106{107if (right) {108ushort startClr = fullPalette[palID][endIndex];109PaletteEntry startClr32 = fullPalette32[palID][endIndex];110for (int i = endIndex; i > startIndex; --i) {111fullPalette[palID][i] = fullPalette[palID][i - 1];112fullPalette32[palID][i] = fullPalette32[palID][i - 1];113}114fullPalette[palID][startIndex] = startClr;115fullPalette32[palID][startIndex] = startClr32;116}117else {118ushort startClr = fullPalette[palID][startIndex];119PaletteEntry startClr32 = fullPalette32[palID][startIndex];120for (int i = startIndex; i < endIndex; ++i) {121fullPalette[palID][i] = fullPalette[palID][i + 1];122fullPalette32[palID][i] = fullPalette32[palID][i + 1];123}124fullPalette[palID][endIndex] = startClr;125fullPalette32[palID][endIndex] = startClr32;126}127}128129inline void SetFade(byte R, byte G, byte B, ushort A)130{131fadeMode = 1;132fadeR = R;133fadeG = G;134fadeB = B;135fadeA = A > 0xFF ? 0xFF : A;136}137138#if RETRO_REV00139void SetLimitedFade(byte paletteID, byte R, byte G, byte B, ushort blendAmount, int startIndex, int endIndex);140#else141void SetPaletteFade(byte destPaletteID, byte srcPaletteA, byte srcPaletteB, ushort blendAmount, int startIndex, int endIndex);142#endif143144#endif // !PALETTE_H145146