mirror of
https://github.com/isledecomp/isle.git
synced 2026-01-20 23:01:16 +00:00
- reordered the functions in order of where they are in the hex because recmp.py sometimes kept saying it couldn't find the symbol (??) - clone returns a pointer, not a ref - worked a bit on setpalette/applysysentriestopalette
141 lines
3.4 KiB
C++
141 lines
3.4 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)
|
|
{
|
|
// FIXME: incomplete
|
|
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, p_entries + 0xf6, 10);
|
|
}
|
|
|
|
// 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);
|
|
LPPALETTEENTRY src;
|
|
MxS32 count;
|
|
|
|
if ((rasterCaps & RC_PALETTE) != 0 && GetDeviceCaps(hdc, SIZEPALETTE) == 256) {
|
|
GetSystemPaletteEntries(hdc, 0, 256, p_entries);
|
|
count = 256 - 2 * 10;
|
|
src = (LPPALETTEENTRY) &m_palette[10];
|
|
p_entries += 10;
|
|
} else {
|
|
src = (LPPALETTEENTRY) m_palette;
|
|
count = 256;
|
|
}
|
|
void* dest;
|
|
memcpy(dest, p_entries, count * sizeof(PALETTEENTRY));
|
|
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;
|
|
} |