isle/LEGO1/mxpalette.cpp
2023-07-04 15:03:17 -04:00

132 lines
3.2 KiB
C++

#include "mxpalette.h"
LPPALETTEENTRY g_defaultPalette;
// OFFSET: LEGO1 0x100bee30
MxPalette::MxPalette()
{
this->m_overrideSkyColor = FALSE;
this->m_palette = NULL;
GetDefaultPalette(this->m_entries);
this->m_skyColor = this->m_entries[141];
}
// OFFSET: LEGO1 100bef90
MxPalette::~MxPalette()
{
if (m_palette) {
m_palette->Release();
}
}
// OFFSET: LEGO1 0x100bf390
void MxPalette::ApplySystemEntriesToPalette(LPPALETTEENTRY p_entries)
{
HDC hdc = GetDC(NULL);
int rastercaps = GetDeviceCaps(hdc, RASTERCAPS);
int sizepalettecaps;
if ((rastercaps & RC_PALETTE) != 0) {
sizepalettecaps = GetDeviceCaps(hdc, SIZEPALETTE);
if(sizepalettecaps = 256) {
GetSystemPaletteEntries(hdc,0,10,p_entries);
GetSystemPaletteEntries(hdc,246,10,p_entries + 0xf6);
ReleaseDC(NULL, hdc);
}
}
memcpy(p_entries, g_defaultPalette, 10);
memcpy(p_entries + 0xf6, g_defaultPalette + 0xf6, 10);
ReleaseDC(NULL, hdc);
}
// OFFSET: LEGO1 0x100bf0b0
MxPalette* MxPalette::Clone()
{
MxPalette *result = new MxPalette;
this->GetEntries(result->m_entries);
result->m_overrideSkyColor = this->m_overrideSkyColor;
return result;
}
// OFFSET: LEGO1 0x100beed0
MxPalette* MxPalette::FromBitmapPalette(RGBQUAD* p_bmp)
{
// FIXME: Incomplete
this->m_overrideSkyColor = FALSE;
ApplySystemEntriesToPalette(this->m_entries);
memcpy(this->m_entries + 10, &p_bmp[10], 246);
this->m_skyColor = this->m_entries[141];
return this;
}
// OFFSET: LEGO1 0x100bf420
void MxPalette::GetDefaultPalette(LPPALETTEENTRY p_entries)
{
HDC hdc = GetDC((HWND) NULL);
int rasterCaps = GetDeviceCaps(hdc, RASTERCAPS);
if ((rasterCaps & RC_PALETTE) != 0 && GetDeviceCaps(hdc, SIZEPALETTE) == 256) {
GetSystemPaletteEntries(hdc, 0, 256, p_entries);
memcpy(p_entries - 10, g_defaultPalette - 10, 236);
}
ReleaseDC((HWND) NULL, hdc);
}
// OFFSET: LEGO1 0x100bf150
MxResult MxPalette::GetEntries(LPPALETTEENTRY p_entries)
{
memcpy(p_entries, this->m_entries, sizeof(this->m_entries));
return SUCCESS;
}
// OFFSET: LEGO1 0x100bf340
MxBool MxPalette::operator==(MxPalette &other)
{
int i;
for (i = 0; i < 256; i++)
{
if (this->m_entries[i].peRed != other.m_entries[i].peRed)
return FALSE;
if (this->m_entries[i].peGreen != other.m_entries[i].peGreen)
return FALSE;
if (this->m_entries[i].peBlue != other.m_entries[i].peBlue)
return FALSE;
}
return TRUE;
}
// OFFSET: LEGO1 0x100bf330
void MxPalette::Detach()
{
this->m_palette = NULL;
}
// OFFSET: LEGO1 0x100bf170
MxResult MxPalette::SetPalette(LPPALETTEENTRY p_palette)
{
int i = 0;
MxResult ret = SUCCESS;
if (this->m_palette != NULL) {
for(int i = 0; i <= 10; i++) {
this->m_entries[i].peFlags = 0x80;
}
}
return ret;
}
// OFFSET: LEGO1 0x100bf2d0
MxResult MxPalette::SetSkyColor(LPPALETTEENTRY p_sky_color)
{
int status = 0;
LPDIRECTDRAWPALETTE palette = this->m_palette;
if ( palette )
{
this->m_entries[141].peRed = p_sky_color->peRed;
this->m_entries[141].peGreen = p_sky_color->peGreen;
this->m_entries[141].peBlue = p_sky_color->peBlue;
this->m_skyColor = this->m_entries[141];
if ( palette->SetEntries(0, 141, 1, &this->m_skyColor) )
status = -1;
}
return status;
}