Fixes/improvements

This commit is contained in:
Christian Semmler 2023-12-30 16:37:36 -05:00
parent 4d3af00c86
commit 19c328026b
2 changed files with 54 additions and 67 deletions

View File

@ -73,33 +73,25 @@ void MxDisplaySurface::FUN_100ba640()
} }
} }
// OFFSET: LEGO1 0x100ba750 // FUNCTION: LEGO1 0x100ba750
byte CountTotalBitsSetTo1(MxU32 p_param) MxU8 MxDisplaySurface::CountTotalBitsSetTo1(MxU32 p_param)
{ {
MxU32 a; MxU8 count = 0;
byte i = 0;
if (p_param) { for (; p_param; p_param >>= 1)
do { count += ((MxU8) p_param & 1);
a = i >> 1;
i += ((byte) p_param & 1); return count;
p_param = a;
} while (a != 0);
}
return i;
} }
// OFFSET: LEGO1 0x100ba770 // FUNCTION: LEGO1 0x100ba770
byte CountContiguousBitsSetTo1(MxU32 p_param) MxU8 MxDisplaySurface::CountContiguousBitsSetTo1(MxU32 p_param)
{ {
MxU32 u; MxU8 count = 0;
byte count = 0;
u = p_param & 1; for (; (p_param & 1) == 0; p_param >>= 1)
while (u == 0) {
p_param >>= 1;
count++; count++;
u = p_param & 1;
}
return count; return count;
} }
@ -251,59 +243,51 @@ void MxDisplaySurface::Clear()
// FUNCTION: LEGO1 0x100baae0 // FUNCTION: LEGO1 0x100baae0
void MxDisplaySurface::SetPalette(MxPalette* p_palette) void MxDisplaySurface::SetPalette(MxPalette* p_palette)
{ {
HDC hdc; if (m_surfaceDesc.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) {
MxS32 j; m_ddSurface1->SetPalette(p_palette->CreateNativePalette());
HPALETTE hpal; m_ddSurface2->SetPalette(p_palette->CreateNativePalette());
LOGPALETTE lpal;
byte bVar2;
byte bVar3;
byte bVar4;
byte bVar5;
byte bVar6;
byte bVar7;
if (((this->m_surfaceDesc).ddpfPixelFormat.dwFlags & 0x20) != 0) {
this->m_ddSurface1->SetPalette(p_palette->CreateNativePalette());
this->m_ddSurface2->SetPalette(p_palette->CreateNativePalette());
if (((this->m_videoParam).Flags().GetFullScreen() & 1) == 0) {
lpal.palVersion = 0x300;
// lpal.palNumEntries = 256;
// FIXME: this loop may be incorrect
memcpy(lpal.palPalEntry, NULL, sizeof(lpal.palNumEntries));
if ((m_videoParam.Flags().GetFullScreen() & 1) == 0) {
struct {
WORD palVersion;
WORD palNumEntries;
PALETTEENTRY palPalEntry[256];
} lpal;
lpal.palVersion = 0x300;
lpal.palNumEntries = 256;
memset(lpal.palPalEntry, 0, sizeof(lpal.palPalEntry));
p_palette->GetEntries(lpal.palPalEntry); p_palette->GetEntries(lpal.palPalEntry);
hpal = CreatePalette(&lpal);
hdc = ::GetDC(0); HPALETTE hpal = CreatePalette((LPLOGPALETTE) &lpal);
SelectPalette(hdc, hpal, 0); HDC hdc = ::GetDC(0);
SelectPalette(hdc, hpal, FALSE);
RealizePalette(hdc); RealizePalette(hdc);
::ReleaseDC(0, hdc); ::ReleaseDC(NULL, hdc);
DeleteObject(hpal); DeleteObject(hpal);
} }
} }
if ((this->m_surfaceDesc).ddpfPixelFormat.dwRGBBitCount == 16) {
if (this->m_16bitPal == NULL) { if (m_surfaceDesc.ddpfPixelFormat.dwRGBBitCount == 16) {
this->m_16bitPal = new (MxU16); // FIXME: malloc size 512; if (!m_16bitPal)
m_16bitPal = new MxU16[256];
PALETTEENTRY palette[256];
p_palette->GetEntries(palette);
MxU8 contiguousBitsRed = CountContiguousBitsSetTo1(m_surfaceDesc.ddpfPixelFormat.dwRBitMask);
MxU8 totalBitsRed = CountTotalBitsSetTo1(m_surfaceDesc.ddpfPixelFormat.dwRBitMask);
MxU8 contiguousBitsGreen = CountContiguousBitsSetTo1(m_surfaceDesc.ddpfPixelFormat.dwGBitMask);
MxU8 totalBitsGreen = CountTotalBitsSetTo1(m_surfaceDesc.ddpfPixelFormat.dwGBitMask);
MxU8 contiguousBitsBlue = CountContiguousBitsSetTo1(m_surfaceDesc.ddpfPixelFormat.dwBBitMask);
MxU8 totalBitsBlue = CountTotalBitsSetTo1(m_surfaceDesc.ddpfPixelFormat.dwBBitMask);
for (MxS32 i = 0; i < 256; i++) {
m_16bitPal[i] = (((palette[i].peRed >> (8 - totalBitsRed & 0x1f)) << (contiguousBitsRed & 0x1f))) |
(((palette[i].peGreen >> (8 - totalBitsGreen & 0x1f)) << (contiguousBitsGreen & 0x1f))) |
(((palette[i].peBlue >> (8 - totalBitsBlue & 0x1f)) << (contiguousBitsBlue & 0x1f)));
} }
p_palette->GetEntries((PALETTEENTRY*) &lpal); // ?
// It looks like the arguments are correct - the offsets match but the registers are swapped
bVar2 = CountContiguousBitsSetTo1((this->m_surfaceDesc).ddpfPixelFormat.dwRBitMask);
bVar3 = CountTotalBitsSetTo1((this->m_surfaceDesc).ddpfPixelFormat.dwRBitMask);
bVar4 = CountContiguousBitsSetTo1((this->m_surfaceDesc).ddpfPixelFormat.dwGBitMask);
bVar5 = CountTotalBitsSetTo1((this->m_surfaceDesc).ddpfPixelFormat.dwGBitMask);
bVar6 = CountContiguousBitsSetTo1((this->m_surfaceDesc).ddpfPixelFormat.dwBBitMask);
bVar7 = CountTotalBitsSetTo1((this->m_surfaceDesc).ddpfPixelFormat.dwBBitMask);
MxS32 i = 0;
WORD e = lpal.palNumEntries;
do {
j = i + 2;
// this line is probably very incorrect
*this->m_16bitPal = e >> (8 - bVar3 & 0x1f) << (bVar2 & 0x1f) | e >> (8 - bVar5 & 0x1f) << (bVar4 & 0x1f) |
e >> (8 - bVar7 & 0x1f) << (bVar6 & 0x1f);
i = j;
e += 2;
} while (j < 512);
} }
} }

View File

@ -72,6 +72,9 @@ class MxDisplaySurface : public MxCore {
inline MxVideoParam& GetVideoParam() { return this->m_videoParam; } inline MxVideoParam& GetVideoParam() { return this->m_videoParam; }
private: private:
MxU8 CountTotalBitsSetTo1(MxU32 p_param);
MxU8 CountContiguousBitsSetTo1(MxU32 p_param);
MxVideoParam m_videoParam; MxVideoParam m_videoParam;
LPDIRECTDRAWSURFACE m_ddSurface1; LPDIRECTDRAWSURFACE m_ddSurface1;
LPDIRECTDRAWSURFACE m_ddSurface2; LPDIRECTDRAWSURFACE m_ddSurface2;