Path: blob/main/RSDKv4/Palette.cpp
817 views
#include "RetroEngine.hpp"12// Palettes (as RGB888 Colors)3PaletteEntry fullPalette32[PALETTE_COUNT][PALETTE_COLOR_COUNT];4PaletteEntry *activePalette32 = fullPalette32[0];56// Palettes (as RGB565 Colors)7ushort fullPalette[PALETTE_COUNT][PALETTE_COLOR_COUNT];8ushort *activePalette = fullPalette[0]; // Ptr to the 256 color set thats active910byte gfxLineBuffer[SCREEN_YSIZE]; // Pointers to active palette11int GFX_LINESIZE;12int GFX_LINESIZE_MINUSONE;13int GFX_LINESIZE_DOUBLE;14int GFX_FRAMEBUFFERSIZE;15int GFX_FBUFFERMINUSONE;1617uint gfxPalette16to32[0x10000];1819int fadeMode = 0;20byte fadeA = 0;21byte fadeR = 0;22byte fadeG = 0;23byte fadeB = 0;2425int paletteMode = 1;2627void LoadPalette(const char *filePath, int paletteID, int startPaletteIndex, int startIndex, int endIndex)28{29FileInfo info;30char fullPath[0x80];3132StrCopy(fullPath, "Data/Palettes/");33StrAdd(fullPath, filePath);3435if (LoadFile(fullPath, &info)) {36SetFilePosition(3 * startIndex);37if (paletteID >= PALETTE_COUNT || paletteID < 0)38paletteID = 0;3940byte color[3];41if (paletteID) {42for (int i = startIndex; i < endIndex; ++i) {43FileRead(&color, 3);44SetPaletteEntry(paletteID, startPaletteIndex++, color[0], color[1], color[2]);45}46}47else {48for (int i = startIndex; i < endIndex; ++i) {49FileRead(&color, 3);50SetPaletteEntry(-1, startPaletteIndex++, color[0], color[1], color[2]);51}52}53CloseFile();54}55}5657#if RETRO_REV0058void SetLimitedFade(byte paletteID, byte R, byte G, byte B, ushort blendAmount, int startIndex, int endIndex)59{60if (paletteID >= PALETTE_COUNT)61return;62paletteMode = 1;63activePalette = fullPalette[paletteID];64activePalette32 = fullPalette32[paletteID];6566if (blendAmount >= 0x100)67blendAmount = 0xFF;6869if (startIndex >= endIndex)70return;7172uint blendA = 0xFF - blendAmount;73for (int i = startIndex; i < endIndex; ++i) {74PACK_RGB888(activePalette[i], (byte)((ushort)(R * blendAmount + blendA * activePalette32[i].r) >> 8),75(byte)((ushort)(G * blendAmount + blendA * activePalette32[i].g) >> 8),76(byte)((ushort)(B * blendAmount + blendA * activePalette32[i].b) >> 8));7778activePalette32[i].r = (byte)((ushort)(R * blendAmount + blendA * activePalette32[i].r) >> 8);79activePalette32[i].g = (byte)((ushort)(G * blendAmount + blendA * activePalette32[i].g) >> 8);80activePalette32[i].b = (byte)((ushort)(B * blendAmount + blendA * activePalette32[i].b) >> 8);81}82}83#else84void SetPaletteFade(byte destPaletteID, byte srcPaletteA, byte srcPaletteB, ushort blendAmount, int startIndex, int endIndex)85{86if (destPaletteID >= PALETTE_COUNT || srcPaletteA >= PALETTE_COUNT || srcPaletteB >= PALETTE_COUNT)87return;8889if (blendAmount >= 0x100)90blendAmount = 0xFF;9192if (startIndex >= endIndex)93return;9495uint blendA = 0xFF - blendAmount;96ushort *dst = &fullPalette[destPaletteID][startIndex];97PaletteEntry *dst32 = &fullPalette32[destPaletteID][startIndex];98for (int l = startIndex; l <= endIndex; ++l) {99*dst = PACK_RGB888((byte)((ushort)(fullPalette32[srcPaletteB][l].r * blendAmount + blendA * fullPalette32[srcPaletteA][l].r) >> 8),100(byte)((ushort)(fullPalette32[srcPaletteB][l].g * blendAmount + blendA * fullPalette32[srcPaletteA][l].g) >> 8),101(byte)((ushort)(fullPalette32[srcPaletteB][l].b * blendAmount + blendA * fullPalette32[srcPaletteA][l].b) >> 8));102dst32->r = (byte)((ushort)(fullPalette32[srcPaletteB][l].r * blendAmount + blendA * fullPalette32[srcPaletteA][l].r) >> 8);103dst32->g = (byte)((ushort)(fullPalette32[srcPaletteB][l].g * blendAmount + blendA * fullPalette32[srcPaletteA][l].g) >> 8);104dst32->b = (byte)((ushort)(fullPalette32[srcPaletteB][l].b * blendAmount + blendA * fullPalette32[srcPaletteA][l].b) >> 8);105106++dst;107++dst32;108}109}110#endif111112