From 0e6b084b8131b5e66a464dafb77d0e16f263cccb Mon Sep 17 00:00:00 2001 From: Joshua Peisach Date: Sat, 25 Nov 2023 14:39:31 -0500 Subject: [PATCH] begin work on MxFlcPresenter's m_unk64 --- 3rdparty/flic/flic.h | 36 ++++++++++++++++++++++++++++++++++++ CMakeLists.txt | 2 ++ LEGO1/mxflcpresenter.cpp | 25 +++++++++++-------------- LEGO1/mxflcpresenter.h | 8 +++++--- 4 files changed, 54 insertions(+), 17 deletions(-) create mode 100644 3rdparty/flic/flic.h diff --git a/3rdparty/flic/flic.h b/3rdparty/flic/flic.h new file mode 100644 index 00000000..6d8495f4 --- /dev/null +++ b/3rdparty/flic/flic.h @@ -0,0 +1,36 @@ +#ifndef FLIC_H +#define FLIC_H + +#include + +// A basic FLIC header structure from the "EGI" documentation. Source: https://www.compuphase.com/flic.htm#FLICHEADER +// This also goes over the FLIC structures: https://github.com/thinkbeforecoding/nomemalloc.handson/blob/master/flic.txt +typedef struct { + DWORD size; /* Size of FLIC including this header */ + WORD type; /* File type 0xAF11, 0xAF12, 0xAF30, 0xAF44, ... */ + WORD frames; /* Number of frames in first segment */ + WORD width; /* FLIC width in pixels */ + WORD height; /* FLIC height in pixels */ + WORD depth; /* Bits per pixel (usually 8) */ + WORD flags; /* Set to zero or to three */ + DWORD speed; /* Delay between frames */ + WORD reserved1; /* Set to zero */ + DWORD created; /* Date of FLIC creation (FLC only) */ + DWORD creator; /* Serial number or compiler id (FLC only) */ + DWORD updated; /* Date of FLIC update (FLC only) */ + DWORD updater; /* Serial number (FLC only), see creator */ + WORD aspect_dx; /* Width of square rectangle (FLC only) */ + WORD aspect_dy; /* Height of square rectangle (FLC only) */ + WORD ext_flags; /* EGI: flags for specific EGI extensions */ + WORD keyframes; /* EGI: key-image frequency */ + WORD totalframes; /* EGI: total number of frames (segments) */ + DWORD req_memory; /* EGI: maximum chunk size (uncompressed) */ + WORD max_regions; /* EGI: max. number of regions in a CHK_REGION chunk */ + WORD transp_num; /* EGI: number of transparent levels */ + BYTE reserved2[24]; /* Set to zero */ + DWORD oframe1; /* Offset to frame 1 (FLC only) */ + DWORD oframe2; /* Offset to frame 2 (FLC only) */ + BYTE reserved3[40]; /* Set to zero */ +} FLIC_HEADER; + +#endif FLIC_H // FLIC_H \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index d4d9ccb2..d8a091bb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -220,6 +220,8 @@ endif() # Additional include directories target_include_directories(lego1 PUBLIC "${CMAKE_SOURCE_DIR}/3rdparty/vec") + +target_include_directories(lego1 PRIVATE "${CMAKE_SOURCE_DIR}/3rdparty/flic") target_include_directories(lego1 PRIVATE "${CMAKE_SOURCE_DIR}/3rdparty/smk") if (ISLE_USE_SMARTHEAP) diff --git a/LEGO1/mxflcpresenter.cpp b/LEGO1/mxflcpresenter.cpp index 6325c3b9..db14bd55 100644 --- a/LEGO1/mxflcpresenter.cpp +++ b/LEGO1/mxflcpresenter.cpp @@ -23,7 +23,17 @@ MxFlcPresenter::~MxFlcPresenter() delete this->m_unk64; } } -<<<<<<< HEAD + +// OFFSET: LEGO1 0x100b34d0 +void MxFlcPresenter::vtable60() +{ + if(m_bitmap) + delete m_bitmap; + + m_bitmap = new MxBitmap; + + m_bitmap->SetSize(m_unk64->width, m_unk64->height, NULL, FALSE); +} // OFFSET: LEGO1 0x100b3620 void MxFlcPresenter::VTable0x70() @@ -34,16 +44,3 @@ void MxFlcPresenter::VTable0x70() if (pal) delete pal; } -||||||| parent of 679bbcf (MxFlcPresenter: vtable70) -======= - -// OFFSET: LEGO1 0x100b3620 -void MxFlcPresenter::vtable70() -{ - MxPalette* pal = m_bitmap->CreatePalette(); - MVideoManager()->RealizePalette(pal); - if (pal) { - delete pal; - } -} ->>>>>>> 679bbcf (MxFlcPresenter: vtable70) diff --git a/LEGO1/mxflcpresenter.h b/LEGO1/mxflcpresenter.h index b0c0fb33..3c1ad6bc 100644 --- a/LEGO1/mxflcpresenter.h +++ b/LEGO1/mxflcpresenter.h @@ -2,6 +2,9 @@ #define MXFLCPRESENTER_H #include "decomp.h" + +#include + #include "mxvideopresenter.h" // VTABLE 0x100dc2c0 @@ -24,11 +27,10 @@ class MxFlcPresenter : public MxVideoPresenter { return "MxFlcPresenter"; } + virtual void vtable60() override; // vtable+0x60 virtual void VTable0x70() override; // vtable+0x70 - virtual void vtable70() override; // vtable+0x74 - - undefined4* m_unk64; + FLIC_HEADER* m_unk64; // 0x64 - what we believe so far. Could be another custom structure like MxSmack. }; #endif // MXFLCPRESENTER_H