mirror of
https://github.com/isledecomp/isle-portable.git
synced 2026-01-14 03:31:14 +00:00
79 lines
1.8 KiB
C++
79 lines
1.8 KiB
C++
#include "mxsmk.h"
|
|
|
|
#include "mxbitmap.h"
|
|
|
|
#include <string.h>
|
|
|
|
DECOMP_SIZE_ASSERT(SmackTag, 0x390);
|
|
DECOMP_SIZE_ASSERT(MxSmk, 0x6b8);
|
|
|
|
// FUNCTION: LEGO1 0x100c5a90
|
|
// FUNCTION: BETA10 0x10151e70
|
|
MxResult MxSmk::LoadHeader(MxU8* p_data, MxU32 p_length, MxSmk* p_mxSmk)
|
|
{
|
|
p_mxSmk->m_smk = smk_open_memory_stream(p_data, p_length);
|
|
|
|
if (p_mxSmk->m_smk == NULL) {
|
|
return FAILURE;
|
|
}
|
|
|
|
smk_enable_video(p_mxSmk->m_smk, TRUE);
|
|
return SUCCESS;
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x100c5d40
|
|
// FUNCTION: BETA10 0x10152298
|
|
void MxSmk::Destroy(MxSmk* p_mxSmk)
|
|
{
|
|
if (p_mxSmk->m_smk != NULL) {
|
|
smk_close(p_mxSmk->m_smk);
|
|
}
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x100c5db0
|
|
// FUNCTION: BETA10 0x10152391
|
|
MxResult MxSmk::LoadFrame(
|
|
MxBITMAPINFO* p_bitmapInfo,
|
|
MxU8* p_bitmapData,
|
|
MxSmk* p_mxSmk,
|
|
MxU8* p_chunkData,
|
|
MxBool& p_paletteChanged,
|
|
MxU32 p_currentFrame,
|
|
MxRect32List* p_list
|
|
)
|
|
{
|
|
p_bitmapInfo->m_bmiHeader.biHeight = -MxBitmap::HeightAbs(p_bitmapInfo->m_bmiHeader.biHeight);
|
|
|
|
unsigned long w, h;
|
|
smk_info_video(p_mxSmk->m_smk, &w, &h, NULL);
|
|
smk_set_chunk(p_mxSmk->m_smk, p_currentFrame, p_chunkData);
|
|
|
|
if (p_currentFrame == 0) {
|
|
smk_first(p_mxSmk->m_smk);
|
|
}
|
|
else {
|
|
smk_next(p_mxSmk->m_smk);
|
|
}
|
|
|
|
memcpy(p_bitmapData, smk_get_video(p_mxSmk->m_smk), w * h);
|
|
|
|
unsigned char frameType;
|
|
smk_info_all(p_mxSmk->m_smk, NULL, NULL, &frameType, NULL);
|
|
p_paletteChanged = frameType & 1;
|
|
|
|
if (p_paletteChanged) {
|
|
const unsigned char* palette = smk_get_palette(p_mxSmk->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;
|
|
}
|