Match MxDisplaySurface::SetPalette (#1438)

* Match `MxDisplaySurface::SetPalette`

* Match
This commit is contained in:
Christian Semmler 2025-05-05 17:19:23 -07:00 committed by GitHub
parent fa6c62f7b3
commit 02c38d55a3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -85,6 +85,7 @@ void MxDisplaySurface::ClearScreen()
} }
// FUNCTION: LEGO1 0x100ba750 // FUNCTION: LEGO1 0x100ba750
// FUNCTION: BETA10 0x1013f6df
MxU8 MxDisplaySurface::CountTotalBitsSetTo1(MxU32 p_param) MxU8 MxDisplaySurface::CountTotalBitsSetTo1(MxU32 p_param)
{ {
MxU8 count = 0; MxU8 count = 0;
@ -97,6 +98,7 @@ MxU8 MxDisplaySurface::CountTotalBitsSetTo1(MxU32 p_param)
} }
// FUNCTION: LEGO1 0x100ba770 // FUNCTION: LEGO1 0x100ba770
// FUNCTION: BETA10 0x1013f724
MxU8 MxDisplaySurface::CountContiguousBitsSetTo1(MxU32 p_param) MxU8 MxDisplaySurface::CountContiguousBitsSetTo1(MxU32 p_param)
{ {
MxU8 count = 0; MxU8 count = 0;
@ -271,24 +273,21 @@ void MxDisplaySurface::Destroy()
} }
// FUNCTION: LEGO1 0x100baae0 // FUNCTION: LEGO1 0x100baae0
// FUNCTION: BETA10 0x1013fe15
void MxDisplaySurface::SetPalette(MxPalette* p_palette) void MxDisplaySurface::SetPalette(MxPalette* p_palette)
{ {
if (m_surfaceDesc.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) { if (m_surfaceDesc.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) {
m_ddSurface1->SetPalette(p_palette->CreateNativePalette()); m_ddSurface1->SetPalette(p_palette->CreateNativePalette());
m_ddSurface2->SetPalette(p_palette->CreateNativePalette()); m_ddSurface2->SetPalette(p_palette->CreateNativePalette());
if ((m_videoParam.Flags().GetFullScreen() & 1) == 0) { if (!m_videoParam.Flags().GetFullScreen()) {
struct { struct {
WORD m_palVersion; WORD m_palVersion;
WORD m_palNumEntries; WORD m_palNumEntries;
PALETTEENTRY m_palPalEntry[256]; PALETTEENTRY m_palPalEntry[256];
} lpal; } lpal = {0x300, 256};
lpal.m_palVersion = 0x300; p_palette->GetEntries((LPPALETTEENTRY) lpal.m_palPalEntry);
lpal.m_palNumEntries = 256;
memset(lpal.m_palPalEntry, 0, sizeof(lpal.m_palPalEntry));
p_palette->GetEntries(lpal.m_palPalEntry);
HPALETTE hpal = CreatePalette((LPLOGPALETTE) &lpal); HPALETTE hpal = CreatePalette((LPLOGPALETTE) &lpal);
HDC hdc = ::GetDC(0); HDC hdc = ::GetDC(0);
@ -299,7 +298,10 @@ void MxDisplaySurface::SetPalette(MxPalette* p_palette)
} }
} }
if (m_surfaceDesc.ddpfPixelFormat.dwRGBBitCount == 16) { switch (m_surfaceDesc.ddpfPixelFormat.dwRGBBitCount) {
case 8:
break;
case 16: {
if (!m_16bitPal) { if (!m_16bitPal) {
m_16bitPal = new MxU16[256]; m_16bitPal = new MxU16[256];
} }
@ -315,10 +317,15 @@ void MxDisplaySurface::SetPalette(MxPalette* p_palette)
MxU8 totalBitsBlue = CountTotalBitsSetTo1(m_surfaceDesc.ddpfPixelFormat.dwBBitMask); MxU8 totalBitsBlue = CountTotalBitsSetTo1(m_surfaceDesc.ddpfPixelFormat.dwBBitMask);
for (MxS32 i = 0; i < 256; i++) { for (MxS32 i = 0; i < 256; i++) {
m_16bitPal[i] = (((palette[i].peRed >> ((8 - totalBitsRed) & 0x1f)) << (contiguousBitsRed & 0x1f))) | m_16bitPal[i] = ((palette[i].peRed >> (8 - totalBitsRed)) << contiguousBitsRed) |
(((palette[i].peGreen >> ((8 - totalBitsGreen) & 0x1f)) << (contiguousBitsGreen & 0x1f))) | ((palette[i].peGreen >> (8 - totalBitsGreen)) << contiguousBitsGreen) |
(((palette[i].peBlue >> ((8 - totalBitsBlue) & 0x1f)) << (contiguousBitsBlue & 0x1f))); ((palette[i].peBlue >> (8 - totalBitsBlue)) << contiguousBitsBlue);
} }
break;
}
default:
break;
} }
} }