mirror of
https://github.com/isledecomp/isle.git
synced 2024-11-30 03:26:12 -05:00
Refactor MxBitmap inline functions, match ImportBitmap
This commit is contained in:
parent
c507454dd1
commit
17522b98d4
2 changed files with 23 additions and 26 deletions
|
@ -10,22 +10,6 @@ DECOMP_SIZE_ASSERT(MxBITMAPINFO, 0x428);
|
||||||
// (1998) GLOBAL: LEGO1 0x10102184
|
// (1998) GLOBAL: LEGO1 0x10102184
|
||||||
MxU16 g_bitmapSignature = TWOCC('B', 'M');
|
MxU16 g_bitmapSignature = TWOCC('B', 'M');
|
||||||
|
|
||||||
// Bit mask trick to round up to the nearest multiple of four.
|
|
||||||
// Pixel data may be stored with padding.
|
|
||||||
// https://learn.microsoft.com/en-us/windows/win32/medfound/image-stride
|
|
||||||
inline MxLong AlignToFourByte(MxLong p_value)
|
|
||||||
{
|
|
||||||
return (p_value + 3) & -4;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Same as the one from legoutil.h, but flipped the other way
|
|
||||||
// TODO: While it's not outside the realm of possibility that they
|
|
||||||
// reimplemented Abs for only this file, that seems odd, right?
|
|
||||||
inline MxLong AbsFlipped(MxLong p_value)
|
|
||||||
{
|
|
||||||
return p_value > 0 ? p_value : -p_value;
|
|
||||||
}
|
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x1004e0d0
|
// FUNCTION: LEGO1 0x1004e0d0
|
||||||
int MxBitmap::VTable0x28(int)
|
int MxBitmap::VTable0x28(int)
|
||||||
{
|
{
|
||||||
|
@ -140,16 +124,14 @@ MxResult MxBitmap::ImportBitmap(MxBitmap* p_bitmap)
|
||||||
|
|
||||||
this->m_info = new MxBITMAPINFO;
|
this->m_info = new MxBITMAPINFO;
|
||||||
if (this->m_info) {
|
if (this->m_info) {
|
||||||
MxLong height = AbsFlipped(p_bitmap->m_bmiHeader->biHeight);
|
this->m_data = new MxU8[p_bitmap->GetDataSize()];
|
||||||
this->m_data = new MxU8[AlignToFourByte(p_bitmap->m_bmiHeader->biWidth) * height];
|
|
||||||
if (this->m_data) {
|
if (this->m_data) {
|
||||||
memcpy(this->m_info, p_bitmap->m_info, sizeof(*this->m_info));
|
memcpy(this->m_info, p_bitmap->GetBitmapInfo(), MxBITMAPINFO::Size());
|
||||||
height = AbsFlipped(p_bitmap->m_bmiHeader->biHeight);
|
memcpy(this->m_data, p_bitmap->GetBitmapData(), p_bitmap->GetDataSize());
|
||||||
memcpy(this->m_data, p_bitmap->m_data, AlignToFourByte(p_bitmap->m_bmiHeader->biWidth) * height);
|
|
||||||
|
|
||||||
result = SUCCESS;
|
|
||||||
this->m_bmiHeader = &this->m_info->m_bmiHeader;
|
this->m_bmiHeader = &this->m_info->m_bmiHeader;
|
||||||
this->m_paletteData = this->m_info->m_bmiColors;
|
this->m_paletteData = this->m_info->m_bmiColors;
|
||||||
|
result = SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,8 @@
|
||||||
struct MxBITMAPINFO {
|
struct MxBITMAPINFO {
|
||||||
BITMAPINFOHEADER m_bmiHeader;
|
BITMAPINFOHEADER m_bmiHeader;
|
||||||
RGBQUAD m_bmiColors[256];
|
RGBQUAD m_bmiColors[256];
|
||||||
|
|
||||||
|
static MxU32 Size() { return sizeof(MxBITMAPINFO); }
|
||||||
};
|
};
|
||||||
|
|
||||||
// Non-standard value for biCompression in the BITMAPINFOHEADER struct.
|
// Non-standard value for biCompression in the BITMAPINFOHEADER struct.
|
||||||
|
@ -56,16 +58,29 @@ class MxBitmap : public MxCore {
|
||||||
MxS32 p_destHeight
|
MxS32 p_destHeight
|
||||||
); // vtable+40
|
); // vtable+40
|
||||||
|
|
||||||
|
// Bit mask trick to round up to the nearest multiple of four.
|
||||||
|
// Pixel data may be stored with padding.
|
||||||
|
// https://learn.microsoft.com/en-us/windows/win32/medfound/image-stride
|
||||||
|
inline MxLong AlignToFourByte(MxLong p_value) const { return (p_value + 3) & -4; }
|
||||||
|
|
||||||
|
// Same as the one from legoutil.h, but flipped the other way
|
||||||
|
// TODO: While it's not outside the realm of possibility that they
|
||||||
|
// reimplemented Abs for only this file, that seems odd, right?
|
||||||
|
inline MxLong AbsFlipped(MxLong p_value) const { return p_value > 0 ? p_value : -p_value; }
|
||||||
|
|
||||||
inline BITMAPINFOHEADER* GetBmiHeader() const { return m_bmiHeader; }
|
inline BITMAPINFOHEADER* GetBmiHeader() const { return m_bmiHeader; }
|
||||||
inline MxLong GetBmiWidth() const { return m_bmiHeader->biWidth; }
|
inline MxLong GetBmiWidth() const { return m_bmiHeader->biWidth; }
|
||||||
inline MxLong GetBmiStride() const { return ((m_bmiHeader->biWidth + 3) & -4); }
|
inline MxLong GetBmiStride() const { return ((m_bmiHeader->biWidth + 3) & -4); }
|
||||||
inline MxLong GetBmiHeight() const { return m_bmiHeader->biHeight; }
|
inline MxLong GetBmiHeight() const { return m_bmiHeader->biHeight; }
|
||||||
inline MxLong GetBmiHeightAbs() const
|
inline MxLong GetBmiHeightAbs() const { return AbsFlipped(m_bmiHeader->biHeight); }
|
||||||
{
|
|
||||||
return m_bmiHeader->biHeight > 0 ? m_bmiHeader->biHeight : -m_bmiHeader->biHeight;
|
|
||||||
}
|
|
||||||
inline MxU8* GetBitmapData() const { return m_data; }
|
inline MxU8* GetBitmapData() const { return m_data; }
|
||||||
inline MxBITMAPINFO* GetBitmapInfo() const { return m_info; }
|
inline MxBITMAPINFO* GetBitmapInfo() const { return m_info; }
|
||||||
|
inline MxLong GetDataSize() const
|
||||||
|
{
|
||||||
|
MxLong absHeight = GetBmiHeightAbs();
|
||||||
|
MxLong alignedWidth = AlignToFourByte(m_bmiHeader->biWidth);
|
||||||
|
return alignedWidth * absHeight;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MxResult ImportColorsToPalette(RGBQUAD*, MxPalette*);
|
MxResult ImportColorsToPalette(RGBQUAD*, MxPalette*);
|
||||||
|
|
Loading…
Reference in a new issue