isle-portable/LEGO1/omni/src/video/mxsmack.cpp
2024-05-23 12:28:03 -04:00

82 lines
1.9 KiB
C++

#include "mxsmack.h"
#include "mxbitmap.h"
#include <string.h>
DECOMP_SIZE_ASSERT(SmackTag, 0x390);
DECOMP_SIZE_ASSERT(MxSmack, 0x6b8);
// FUNCTION: LEGO1 0x100c5a90
MxResult MxSmack::LoadHeader(MxU8* p_data, MxU32 p_length, MxSmack* p_mxSmack)
{
p_mxSmack->m_smk = smk_open_memory_stream(p_data, p_length);
if (p_mxSmack->m_smk == NULL) {
return FAILURE;
}
smk_enable_video(p_mxSmack->m_smk, TRUE);
return SUCCESS;
}
// FUNCTION: LEGO1 0x100c5d40
void MxSmack::Destroy(MxSmack* p_mxSmack)
{
if (p_mxSmack->m_smk != NULL) {
smk_close(p_mxSmack->m_smk);
}
}
// This should be refactored to somewhere else
inline MxLong AbsFlipped(MxLong p_value)
{
return p_value > 0 ? p_value : -p_value;
}
// FUNCTION: LEGO1 0x100c5db0
MxResult MxSmack::LoadFrame(
MxBITMAPINFO* p_bitmapInfo,
MxU8* p_bitmapData,
MxSmack* p_mxSmack,
MxU8* p_chunkData,
MxBool& p_paletteChanged,
MxU32 p_currentFrame,
MxRectList* p_list
)
{
p_bitmapInfo->m_bmiHeader.biHeight = -AbsFlipped(p_bitmapInfo->m_bmiHeader.biHeight);
unsigned long w, h;
smk_info_video(p_mxSmack->m_smk, &w, &h, NULL);
smk_set_chunk(p_mxSmack->m_smk, p_currentFrame, p_chunkData);
if (p_currentFrame == 0) {
smk_first(p_mxSmack->m_smk);
}
else {
smk_next(p_mxSmack->m_smk);
}
memcpy(p_bitmapData, smk_get_video(p_mxSmack->m_smk), w * h);
unsigned char frameType;
smk_info_all(p_mxSmack->m_smk, NULL, NULL, &frameType, NULL);
p_paletteChanged = frameType & 1;
if (p_paletteChanged) {
const unsigned char* palette = smk_get_palette(p_mxSmack->m_smk);
for (MxU32 i = 0; i < 256; i++) {
p_bitmapInfo->m_bmiColors[i].rgbBlue = palette[i * 3 + 2];
p_bitmapInfo->m_bmiColors[i].rgbGreen = palette[i * 3 + 1];
p_bitmapInfo->m_bmiColors[i].rgbRed = palette[i * 3];
}
}
// [library:libsmacker] Calculate changed rects
MxRect32* newRect = new MxRect32(0, 0, w - 1, h - 1);
p_list->Append(newRect);
return SUCCESS;
}