fbneo/src/burn/burn_pal.cpp

305 lines
6.9 KiB
C++

#include "burnint.h"
#include "burn_pal.h"
UINT32 *BurnPalette = NULL;
UINT8 *BurnPalRAM = NULL;
UINT8 BurnRecalc;
//-------------------------------------------------------------------------------------
static inline UINT32 PaletteWrite4Bit(INT32 offset, INT32 rshift, INT32 gshift, INT32 bshift)
{
if (BurnPalRAM == NULL) return 0;
UINT16 *pal = (UINT16*)BurnPalRAM;
UINT16 p = BURN_ENDIAN_SWAP_INT16(pal[offset]);
UINT8 r = (p >> rshift) & 0xf;
UINT8 g = (p >> gshift) & 0xf;
UINT8 b = (p >> bshift) & 0xf;
return BurnHighCol(r+(r*16), g+(g*16), b+(b*16), 0);
}
static inline void PaletteUpdate4Bit(INT32 rshift, INT32 gshift, INT32 bshift)
{
if (BurnPalette == NULL) return;
for (INT32 i = 0; i < BurnDrvGetPaletteEntries(); i++)
{
BurnPalette[i] = PaletteWrite4Bit(i, rshift, gshift, bshift);
}
}
void BurnPaletteUpdate_xxxxBBBBGGGGRRRR()
{
PaletteUpdate4Bit(0, 4, 8);
}
void BurnPaletteUpdate_xxxxBBBBRRRRGGGG()
{
PaletteUpdate4Bit(4, 0, 8);
}
void BurnPaletteUpdate_xxxxRRRRGGGGBBBB()
{
PaletteUpdate4Bit(8, 4, 0);
}
void BurnPaletteWrite_xxxxBBBBGGGGRRRR(INT32 offset)
{
offset /= 2;
BurnPalette[offset] = PaletteWrite4Bit(offset, 0, 4, 8);
}
void BurnPaletteWrite_xxxxBBBBRRRRGGGG(INT32 offset)
{
offset /= 2;
BurnPalette[offset] = PaletteWrite4Bit(offset, 4, 0, 8);
}
void BurnPaletteWrite_xxxxRRRRGGGGBBBB(INT32 offset)
{
offset /= 2;
BurnPalette[offset] = PaletteWrite4Bit(offset, 8, 4, 0);
}
//-------------------------------------------------------------------------------------
static inline UINT32 PaletteWrite5Bit(INT32 offset, INT32 rshift, INT32 gshift, INT32 bshift)
{
if (BurnPalRAM == NULL) return 0;
UINT16 *pal = (UINT16*)BurnPalRAM;
UINT16 p = BURN_ENDIAN_SWAP_INT16(pal[offset]);
UINT8 r = (p >> rshift) & 0x1f;
UINT8 g = (p >> gshift) & 0x1f;
UINT8 b = (p >> bshift) & 0x1f;
r = (r * 8) + (r / 4);
g = (g * 8) + (g / 4);
b = (b * 8) + (b / 4);
return BurnHighCol(r, g, b, 0);
}
static inline void PaletteUpdate5Bit(INT32 rshift, INT32 gshift, INT32 bshift)
{
if (BurnPalette == NULL) return;
for (INT32 i = 0; i < BurnDrvGetPaletteEntries(); i++)
{
BurnPalette[i] = PaletteWrite5Bit(i, rshift, gshift, bshift);
}
}
void BurnPaletteUpdate_xRRRRRGGGGGBBBBB()
{
PaletteUpdate5Bit(10, 5, 0);
}
void BurnPaletteUpdate_xBBBBBGGGGGRRRRR()
{
PaletteUpdate5Bit(0, 5, 10);
}
void BurnPaletteUpdate_xGGGGGBBBBBRRRRR()
{
PaletteUpdate5Bit(0, 10, 5);
}
void BurnPaletteUpdate_xGGGGGRRRRRBBBBB()
{
PaletteUpdate5Bit(5, 10, 0);
}
void BurnPaletteUpdate_GGGGGRRRRRBBBBBx()
{
PaletteUpdate5Bit(6, 11, 1);
}
void BurnPaletteWrite_xRRRRRGGGGGBBBBB(INT32 offset)
{
offset /= 2;
if (BurnPalette) {
BurnPalette[offset] = PaletteWrite5Bit(offset, 10, 5, 0);
}
}
void BurnPaletteWrite_xBBBBBGGGGGRRRRR(INT32 offset)
{
offset /= 2;
if (BurnPalette) {
BurnPalette[offset] = PaletteWrite5Bit(offset, 0, 5, 10);
}
}
void BurnPaletteWrite_xGGGGGBBBBBRRRRR(INT32 offset)
{
offset /= 2;
if (BurnPalette) {
BurnPalette[offset] = PaletteWrite5Bit(offset, 0, 10, 5);
}
}
void BurnPaletteWrite_xGGGGGRRRRRBBBBB(INT32 offset)
{
offset /= 2;
if (BurnPalette) {
BurnPalette[offset] = PaletteWrite5Bit(offset, 5, 10, 0);
}
}
void BurnPaletteWrite_GGGGGRRRRRBBBBBx(INT32 offset)
{
offset /= 2;
if (BurnPalette) {
BurnPalette[offset] = PaletteWrite5Bit(offset, 6, 11, 1);
}
}
//-------------------------------------------------------------------------------------
void BurnPaletteUpdate_RRRRGGGGBBBBRGBx()
{
if (BurnPalRAM == NULL || BurnPalette == NULL) return;
UINT16 *pal = (UINT16*)BurnPalRAM;
for (INT32 i = 0; i < BurnDrvGetPaletteEntries(); i++)
{
UINT16 p = BURN_ENDIAN_SWAP_INT16(pal[i]);
UINT8 r = ((p >> 11) & 0x1e) | ((p >> 3) & 0x01);
UINT8 g = ((p >> 7) & 0x1e) | ((p >> 2) & 0x01);
UINT8 b = ((p >> 3) & 0x1e) | ((p >> 1) & 0x01);
r = (r * 8) + (r / 4);
g = (g * 8) + (g / 4);
b = (b * 8) + (b / 4);
BurnPalette[i] = BurnHighCol(r, g, b, 0);
}
}
void BurnPaletteWrite_RRRRGGGGBBBBRGBx(INT32 offset)
{
if (BurnPalRAM == NULL || BurnPalette == NULL) return;
offset /= 2;
UINT16 *pal = (UINT16*)BurnPalRAM;
UINT16 p = BURN_ENDIAN_SWAP_INT16(pal[offset]);
UINT8 r = ((p >> 11) & 0x1e) | ((p >> 3) & 0x01);
UINT8 g = ((p >> 7) & 0x1e) | ((p >> 2) & 0x01);
UINT8 b = ((p >> 3) & 0x1e) | ((p >> 1) & 0x01);
r = (r * 8) + (r / 4);
g = (g * 8) + (g / 4);
b = (b * 8) + (b / 4);
BurnPalette[offset] = BurnHighCol(r, g, b, 0);
}
//-------------------------------------------------------------------------------------
static inline void palette_update_8bit(INT32 r_mask, INT32 g_mask, INT32 b_mask, INT32 r_shift, INT32 g_shift, INT32 b_shift, INT32 invert)
{
if (BurnPalRAM == NULL || BurnPalette == NULL) return;
r_mask = (1 << r_mask) - 1;
g_mask = (1 << g_mask) - 1;
b_mask = (1 << b_mask) - 1;
invert = (invert) ? 0xff : 0;
for (INT32 i = 0; i < BurnDrvGetPaletteEntries(); i++)
{
UINT8 p = BurnPalRAM[i] ^ invert;
UINT8 r = (p >> r_shift) & r_mask;
UINT8 g = (p >> g_shift) & g_mask;
UINT8 b = (p >> b_shift) & b_mask;
if (r_mask == 3) r = pal2bit(r);
if (r_mask == 7) r = pal3bit(r);
if (g_mask == 3) g = pal2bit(r);
if (g_mask == 7) g = pal3bit(r);
if (b_mask == 3) b = pal2bit(r);
if (b_mask == 7) b = pal3bit(r);
BurnPalette[i] = BurnHighCol(r,g,b,0);
}
}
void BurnPaletteUpdate_BBGGGRRR()
{
palette_update_8bit(3, 3, 2, 0, 3, 6, 0);
}
void BurnPaletteUpdate_RRRGGGBB()
{
palette_update_8bit(3, 3, 2, 5, 2, 0, 0);
}
void BurnPaletteUpdate_BBGGGRRR_inverted()
{
palette_update_8bit(3, 3, 2, 0, 3, 6, 1);
}
void BurnPaletteUpdate_RRRGGGBB_inverted()
{
palette_update_8bit(3, 3, 2, 5, 2, 0, 1);
}
static inline void palette_write_8bit(INT32 offset, INT32 r_shift, INT32 g_shift, INT32 b_shift, INT32 r_mask, INT32 g_mask, INT32 b_mask, INT32 invert)
{
if (BurnPalRAM == NULL || BurnPalette == NULL) return;
UINT8 p = BurnPalRAM[offset] ^ invert;
UINT8 r = (p >> r_shift) & r_mask;
UINT8 g = (p >> g_shift) & g_mask;
UINT8 b = (p >> b_shift) & b_mask;
if (r_mask == 3) r = pal2bit(r);
if (r_mask == 7) r = pal3bit(r);
if (g_mask == 3) g = pal2bit(r);
if (g_mask == 7) g = pal3bit(r);
if (b_mask == 3) b = pal2bit(r);
if (b_mask == 7) b = pal3bit(r);
BurnPalette[offset] = BurnHighCol(r,g,b,0);
}
void BurnPaletteWrite_BBGGGRRR(INT32 offset)
{
palette_write_8bit(offset, 3, 3, 2, 0, 3, 6, 0);
}
void BurnPaletteWrite_RRRGGGBB(INT32 offset)
{
palette_write_8bit(offset, 3, 3, 2, 5, 2, 0, 0);
}
void BurnPaletteWrite_BBGGGRRR_inverted(INT32 offset)
{
palette_write_8bit(offset, 3, 3, 2, 0, 3, 6, 1);
}
void BurnPaletteWrite_RRRGGGBB_inverted(INT32 offset)
{
palette_write_8bit(offset, 3, 3, 2, 5, 2, 0, 1);
}