Beta match MxPalette (#968)

* Beta match MxPalette

* Modern compiler fix
This commit is contained in:
MS 2024-05-29 16:52:45 -04:00 committed by GitHub
parent b978787f8f
commit 085bdbe74b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 138 additions and 84 deletions

View File

@ -7,6 +7,7 @@
#include <ddraw.h> #include <ddraw.h>
// VTABLE: LEGO1 0x100dc848 // VTABLE: LEGO1 0x100dc848
// VTABLE: BETA10 0x101c2300
// SIZE 0x414 // SIZE 0x414
class MxPalette : public MxCore { class MxPalette : public MxCore {
public: public:
@ -26,9 +27,13 @@ public:
void Reset(MxBool p_ignoreSkyColor); void Reset(MxBool p_ignoreSkyColor);
LPDIRECTDRAWPALETTE CreateNativePalette(); LPDIRECTDRAWPALETTE CreateNativePalette();
inline void SetOverrideSkyColor(MxBool p_value) { this->m_overrideSkyColor = p_value; } void SetPalette(LPDIRECTDRAWPALETTE p_palette);
// FUNCTION: BETA10 0x100d92c0
inline void SetOverrideSkyColor(MxBool p_value) { m_overrideSkyColor = p_value; }
// SYNTHETIC: LEGO1 0x100beeb0 // SYNTHETIC: LEGO1 0x100beeb0
// SYNTHETIC: BETA10 0x10144640
// MxPalette::`scalar deleting destructor' // MxPalette::`scalar deleting destructor'
private: private:

View File

@ -4,6 +4,7 @@
#include "mxvideomanager.h" #include "mxvideomanager.h"
// GLOBAL: LEGO1 0x10102188 // GLOBAL: LEGO1 0x10102188
// GLOBAL: BETA10 0x10203558
PALETTEENTRY g_defaultPaletteEntries[256] = { PALETTEENTRY g_defaultPaletteEntries[256] = {
{0u, 0u, 0u, 0u}, {128u, 0u, 0u, 0u}, {0u, 128u, 0u, 0u}, {128u, 128u, 0u, 0u}, {0u, 0u, 0u, 0u}, {128u, 0u, 0u, 0u}, {0u, 128u, 0u, 0u}, {128u, 128u, 0u, 0u},
{0u, 0u, 128u, 0u}, {128u, 0u, 128u, 0u}, {0u, 128u, 128u, 0u}, {128u, 128u, 128u, 0u}, {0u, 0u, 128u, 0u}, {128u, 0u, 128u, 0u}, {0u, 128u, 128u, 0u}, {128u, 128u, 128u, 0u},
@ -72,32 +73,35 @@ PALETTEENTRY g_defaultPaletteEntries[256] = {
}; };
// FUNCTION: LEGO1 0x100bee30 // FUNCTION: LEGO1 0x100bee30
// FUNCTION: BETA10 0x10143b50
MxPalette::MxPalette() MxPalette::MxPalette()
{ {
this->m_overrideSkyColor = FALSE; m_overrideSkyColor = FALSE;
this->m_palette = NULL; m_palette = NULL;
GetDefaultPalette(this->m_entries); GetDefaultPalette(m_entries);
this->m_skyColor = this->m_entries[141]; m_skyColor = m_entries[141];
} }
// FUNCTION: LEGO1 0x100beed0 // FUNCTION: LEGO1 0x100beed0
// FUNCTION: BETA10 0x10143bf4
MxPalette::MxPalette(const RGBQUAD* p_colors) MxPalette::MxPalette(const RGBQUAD* p_colors)
{ {
this->m_overrideSkyColor = FALSE; m_overrideSkyColor = FALSE;
this->m_palette = NULL; m_palette = NULL;
ApplySystemEntriesToPalette(this->m_entries); ApplySystemEntriesToPalette(m_entries);
for (MxS32 i = 10; i < 246; i++) { for (MxS32 i = 10; i < 246; i++) {
this->m_entries[i].peRed = p_colors[i].rgbRed; m_entries[i].peRed = p_colors[i].rgbRed;
this->m_entries[i].peGreen = p_colors[i].rgbGreen; m_entries[i].peGreen = p_colors[i].rgbGreen;
this->m_entries[i].peBlue = p_colors[i].rgbBlue; m_entries[i].peBlue = p_colors[i].rgbBlue;
this->m_entries[i].peFlags = 0; m_entries[i].peFlags = 0;
} }
this->m_skyColor = this->m_entries[141]; m_skyColor = m_entries[141];
} }
// FUNCTION: LEGO1 0x100bef90 // FUNCTION: LEGO1 0x100bef90
// FUNCTION: BETA10 0x10143d01
MxPalette::~MxPalette() MxPalette::~MxPalette()
{ {
if (m_palette) { if (m_palette) {
@ -106,97 +110,123 @@ MxPalette::~MxPalette()
} }
// FUNCTION: LEGO1 0x100bf000 // FUNCTION: LEGO1 0x100bf000
// FUNCTION: BETA10 0x10143d88
LPDIRECTDRAWPALETTE MxPalette::CreateNativePalette() LPDIRECTDRAWPALETTE MxPalette::CreateNativePalette()
{ {
MxS32 i; if (m_palette == NULL) {
if (this->m_palette == NULL) { MxS32 i;
for (i = 0; i < 10; i++) { for (i = 0; i < 10; i++) {
this->m_entries[i].peFlags = 0x80; m_entries[i].peFlags = D3DPAL_RESERVED;
}
for (i = 10; i < 136; i++) {
this->m_entries[i].peFlags = 0x44;
}
for (i = 136; i < 140; i++) {
this->m_entries[i].peFlags = 0x84;
}
this->m_entries[140].peFlags = 0x84;
this->m_entries[141].peFlags = 0x44;
for (i = 142; i < 246; i++) {
this->m_entries[i].peFlags = 0x84;
}
for (i = 246; i < 256; i++) {
this->m_entries[i].peFlags = 0x80;
} }
if (MVideoManager() && MVideoManager()->GetDirectDraw()) { for (; i < 136; i++) {
MVideoManager()->GetDirectDraw()->CreatePalette(DDPCAPS_8BIT, this->m_entries, &this->m_palette, NULL); m_entries[i].peFlags = D3DPAL_READONLY | PC_NOCOLLAPSE;
}
for (; i < 140; i++) {
m_entries[i].peFlags = D3DPAL_RESERVED | PC_NOCOLLAPSE;
}
m_entries[i++].peFlags = D3DPAL_RESERVED | PC_NOCOLLAPSE;
m_entries[i++].peFlags = D3DPAL_READONLY | PC_NOCOLLAPSE;
for (; i < 246; i++) {
m_entries[i].peFlags = D3DPAL_RESERVED | PC_NOCOLLAPSE;
}
for (; i < 256; i++) {
m_entries[i].peFlags = D3DPAL_RESERVED;
}
if (!MVideoManager()) {
goto done;
}
if (!MVideoManager()->GetDirectDraw()) {
goto done;
}
if (MVideoManager()->GetDirectDraw()->CreatePalette(DDPCAPS_8BIT, m_entries, &m_palette, NULL)) {
goto done;
} }
} }
return this->m_palette; done:
return m_palette;
} }
// FUNCTION: LEGO1 0x100bf0b0 // FUNCTION: LEGO1 0x100bf0b0
// FUNCTION: BETA10 0x10143f13
MxPalette* MxPalette::Clone() MxPalette* MxPalette::Clone()
{ {
MxPalette* result = new MxPalette; MxPalette* result = new MxPalette;
this->GetEntries(result->m_entries); GetEntries(result->m_entries);
result->m_overrideSkyColor = this->m_overrideSkyColor; result->SetOverrideSkyColor(m_overrideSkyColor);
return result; return result;
} }
// FUNCTION: LEGO1 0x100bf150 // FUNCTION: LEGO1 0x100bf150
// FUNCTION: BETA10 0x10143fc8
MxResult MxPalette::GetEntries(LPPALETTEENTRY p_entries) MxResult MxPalette::GetEntries(LPPALETTEENTRY p_entries)
{ {
memcpy(p_entries, this->m_entries, sizeof(this->m_entries)); memcpy(p_entries, m_entries, sizeof(m_entries));
return SUCCESS; return SUCCESS;
} }
// FUNCTION: LEGO1 0x100bf170 // FUNCTION: LEGO1 0x100bf170
// FUNCTION: BETA10 0x10143ffa
MxResult MxPalette::SetEntries(LPPALETTEENTRY p_entries) MxResult MxPalette::SetEntries(LPPALETTEENTRY p_entries)
{ {
MxS32 i;
MxResult status = SUCCESS; MxResult status = SUCCESS;
if (this->m_palette) { if (m_palette) {
MxS32 i;
for (i = 0; i < 10; i++) { for (i = 0; i < 10; i++) {
this->m_entries[i].peFlags = 0x80; m_entries[i].peFlags = D3DPAL_RESERVED;
}
for (i = 10; i < 136; i++) {
this->m_entries[i].peFlags = 68;
this->m_entries[i].peRed = p_entries[i].peRed;
this->m_entries[i].peGreen = p_entries[i].peGreen;
this->m_entries[i].peBlue = p_entries[i].peBlue;
}
for (i = 136; i < 140; i++) {
this->m_entries[i].peFlags = 132;
this->m_entries[i].peRed = p_entries[i].peRed;
this->m_entries[i].peGreen = p_entries[i].peGreen;
this->m_entries[i].peBlue = p_entries[i].peBlue;
}
if (!this->m_overrideSkyColor) {
this->m_entries[140].peFlags = 0x44;
this->m_entries[140].peRed = p_entries[140].peRed;
this->m_entries[140].peGreen = p_entries[140].peGreen;
this->m_entries[140].peBlue = p_entries[140].peBlue;
this->m_entries[141].peFlags = 0x84;
this->m_entries[141].peRed = p_entries[141].peRed;
this->m_entries[141].peGreen = p_entries[141].peGreen;
this->m_entries[141].peBlue = p_entries[141].peBlue;
} }
for (i = 142; i < 246; i++) { for (; i < 136; i++) {
this->m_entries[i].peFlags = 132; m_entries[i].peFlags = D3DPAL_READONLY | PC_NOCOLLAPSE;
this->m_entries[i].peRed = p_entries[i].peRed; m_entries[i].peRed = p_entries[i].peRed;
this->m_entries[i].peGreen = p_entries[i].peGreen; m_entries[i].peGreen = p_entries[i].peGreen;
this->m_entries[i].peBlue = p_entries[i].peBlue; m_entries[i].peBlue = p_entries[i].peBlue;
} }
for (i = 246; i < 256; i++) { for (; i < 140; i++) {
this->m_entries[i].peFlags = 0x80; m_entries[i].peFlags = D3DPAL_RESERVED | PC_NOCOLLAPSE;
m_entries[i].peRed = p_entries[i].peRed;
m_entries[i].peGreen = p_entries[i].peGreen;
m_entries[i].peBlue = p_entries[i].peBlue;
} }
if (this->m_palette->SetEntries(0, 0, 256, this->m_entries)) { if (!m_overrideSkyColor) {
m_entries[i].peFlags = D3DPAL_READONLY | PC_NOCOLLAPSE;
m_entries[i].peRed = p_entries[i].peRed;
m_entries[i].peGreen = p_entries[i].peGreen;
m_entries[i].peBlue = p_entries[i].peBlue;
i++;
m_entries[i].peFlags = D3DPAL_RESERVED | PC_NOCOLLAPSE;
m_entries[i].peRed = p_entries[i].peRed;
m_entries[i].peGreen = p_entries[i].peGreen;
m_entries[i].peBlue = p_entries[i].peBlue;
i++;
}
else {
i = 142;
}
for (; i < 246; i++) {
m_entries[i].peFlags = D3DPAL_RESERVED | PC_NOCOLLAPSE;
m_entries[i].peRed = p_entries[i].peRed;
m_entries[i].peGreen = p_entries[i].peGreen;
m_entries[i].peBlue = p_entries[i].peBlue;
}
for (; i < 256; i++) {
m_entries[i].peFlags = D3DPAL_RESERVED;
}
if (m_palette->SetEntries(0, 0, 256, m_entries)) {
status = FAILURE; status = FAILURE;
} }
} }
@ -205,38 +235,53 @@ MxResult MxPalette::SetEntries(LPPALETTEENTRY p_entries)
} }
// FUNCTION: LEGO1 0x100bf2d0 // FUNCTION: LEGO1 0x100bf2d0
// FUNCTION: BETA10 0x101442aa
MxResult MxPalette::SetSkyColor(LPPALETTEENTRY p_skyColor) MxResult MxPalette::SetSkyColor(LPPALETTEENTRY p_skyColor)
{ {
MxResult status = 0; MxResult status = 0;
if (this->m_palette != NULL) { if (m_palette != NULL) {
this->m_entries[141].peRed = p_skyColor->peRed; m_entries[141].peRed = p_skyColor->peRed;
this->m_entries[141].peGreen = p_skyColor->peGreen; m_entries[141].peGreen = p_skyColor->peGreen;
this->m_entries[141].peBlue = p_skyColor->peBlue; m_entries[141].peBlue = p_skyColor->peBlue;
this->m_skyColor = this->m_entries[141]; m_skyColor = m_entries[141];
if (this->m_palette->SetEntries(0, 141, 1, &this->m_skyColor)) { if (m_palette->SetEntries(0, 141, 1, &m_skyColor)) {
status = -1; status = -1;
} }
} }
return status; return status;
} }
// FUNCTION: BETA10 0x1014434a
void MxPalette::SetPalette(LPDIRECTDRAWPALETTE p_palette)
{
if (m_palette) {
m_palette->Release();
}
m_palette = p_palette;
}
// FUNCTION: LEGO1 0x100bf330 // FUNCTION: LEGO1 0x100bf330
// FUNCTION: BETA10 0x1014438a
void MxPalette::Detach() void MxPalette::Detach()
{ {
this->m_palette = NULL; m_palette = NULL;
} }
// FUNCTION: LEGO1 0x100bf340 // FUNCTION: LEGO1 0x100bf340
// FUNCTION: BETA10 0x101443aa
MxBool MxPalette::operator==(MxPalette& p_other) MxBool MxPalette::operator==(MxPalette& p_other)
{ {
for (MxS32 i = 0; i < 256; i++) { for (MxS32 i = 0; i < 256; i++) {
if (this->m_entries[i].peRed != p_other.m_entries[i].peRed) { if (m_entries[i].peRed != p_other.m_entries[i].peRed) {
return FALSE; return FALSE;
} }
if (this->m_entries[i].peGreen != p_other.m_entries[i].peGreen) {
if (m_entries[i].peGreen != p_other.m_entries[i].peGreen) {
return FALSE; return FALSE;
} }
if (this->m_entries[i].peBlue != p_other.m_entries[i].peBlue) {
if (m_entries[i].peBlue != p_other.m_entries[i].peBlue) {
return FALSE; return FALSE;
} }
} }
@ -244,6 +289,7 @@ MxBool MxPalette::operator==(MxPalette& p_other)
} }
// FUNCTION: LEGO1 0x100bf390 // FUNCTION: LEGO1 0x100bf390
// FUNCTION: BETA10 0x1014445a
void MxPalette::ApplySystemEntriesToPalette(LPPALETTEENTRY p_entries) void MxPalette::ApplySystemEntriesToPalette(LPPALETTEENTRY p_entries)
{ {
HDC hdc; HDC hdc;
@ -261,6 +307,7 @@ void MxPalette::ApplySystemEntriesToPalette(LPPALETTEENTRY p_entries)
} }
// FUNCTION: LEGO1 0x100bf420 // FUNCTION: LEGO1 0x100bf420
// FUNCTION: BETA10 0x10144517
void MxPalette::GetDefaultPalette(LPPALETTEENTRY p_entries) void MxPalette::GetDefaultPalette(LPPALETTEENTRY p_entries)
{ {
HDC hdc; HDC hdc;
@ -278,14 +325,16 @@ void MxPalette::GetDefaultPalette(LPPALETTEENTRY p_entries)
} }
// FUNCTION: LEGO1 0x100bf490 // FUNCTION: LEGO1 0x100bf490
// FUNCTION: BETA10 0x101445bf
void MxPalette::Reset(MxBool p_ignoreSkyColor) void MxPalette::Reset(MxBool p_ignoreSkyColor)
{ {
if (this->m_palette != NULL) { if (m_palette != NULL) {
GetDefaultPalette(this->m_entries); GetDefaultPalette(m_entries);
if (!p_ignoreSkyColor) { if (!p_ignoreSkyColor) {
this->m_entries[140] = this->m_entries[141] = this->m_skyColor; m_entries[140] = m_entries[141] = m_skyColor;
} }
SetEntries(this->m_entries);
this->m_palette->SetEntries(0, 0, 256, this->m_entries); SetEntries(m_entries);
m_palette->SetEntries(0, 0, 256, m_entries);
} }
} }