mirror of
https://github.com/isledecomp/isle.git
synced 2026-01-30 19:51:15 +00:00
WIP
This commit is contained in:
parent
f1300d9de5
commit
267e3a0753
61
3rdparty/flic/flic.h
vendored
61
3rdparty/flic/flic.h
vendored
@ -6,31 +6,42 @@
|
|||||||
// A basic FLIC header structure from the "EGI" documentation. Source: https://www.compuphase.com/flic.htm#FLICHEADER
|
// 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
|
// This also goes over the FLIC structures: https://github.com/thinkbeforecoding/nomemalloc.handson/blob/master/flic.txt
|
||||||
typedef struct {
|
typedef struct {
|
||||||
DWORD size; /* Size of FLIC including this header */
|
DWORD size; /* Size of FLIC including this header */
|
||||||
WORD type; /* File type 0xAF11, 0xAF12, 0xAF30, 0xAF44, ... */
|
WORD type; /* File type 0xAF11, 0xAF12, 0xAF30, 0xAF44, ... */
|
||||||
WORD frames; /* Number of frames in first segment */
|
WORD frames; /* Number of frames in first segment */
|
||||||
WORD width; /* FLIC width in pixels */
|
WORD width; /* FLIC width in pixels */
|
||||||
WORD height; /* FLIC height in pixels */
|
WORD height; /* FLIC height in pixels */
|
||||||
WORD depth; /* Bits per pixel (usually 8) */
|
WORD depth; /* Bits per pixel (usually 8) */
|
||||||
WORD flags; /* Set to zero or to three */
|
WORD flags; /* Set to zero or to three */
|
||||||
DWORD speed; /* Delay between frames */
|
DWORD speed; /* Delay between frames */
|
||||||
WORD reserved1; /* Set to zero */
|
WORD reserved1; /* Set to zero */
|
||||||
DWORD created; /* Date of FLIC creation (FLC only) */
|
DWORD created; /* Date of FLIC creation (FLC only) */
|
||||||
DWORD creator; /* Serial number or compiler id (FLC only) */
|
DWORD creator; /* Serial number or compiler id (FLC only) */
|
||||||
DWORD updated; /* Date of FLIC update (FLC only) */
|
DWORD updated; /* Date of FLIC update (FLC only) */
|
||||||
DWORD updater; /* Serial number (FLC only), see creator */
|
DWORD updater; /* Serial number (FLC only), see creator */
|
||||||
WORD aspect_dx; /* Width of square rectangle (FLC only) */
|
WORD aspect_dx; /* Width of square rectangle (FLC only) */
|
||||||
WORD aspect_dy; /* Height of square rectangle (FLC only) */
|
WORD aspect_dy; /* Height of square rectangle (FLC only) */
|
||||||
WORD ext_flags; /* EGI: flags for specific EGI extensions */
|
WORD ext_flags; /* EGI: flags for specific EGI extensions */
|
||||||
WORD keyframes; /* EGI: key-image frequency */
|
WORD keyframes; /* EGI: key-image frequency */
|
||||||
WORD totalframes; /* EGI: total number of frames (segments) */
|
WORD totalframes; /* EGI: total number of frames (segments) */
|
||||||
DWORD req_memory; /* EGI: maximum chunk size (uncompressed) */
|
DWORD req_memory; /* EGI: maximum chunk size (uncompressed) */
|
||||||
WORD max_regions; /* EGI: max. number of regions in a CHK_REGION chunk */
|
WORD max_regions; /* EGI: max. number of regions in a CHK_REGION chunk */
|
||||||
WORD transp_num; /* EGI: number of transparent levels */
|
WORD transp_num; /* EGI: number of transparent levels */
|
||||||
BYTE reserved2[24]; /* Set to zero */
|
BYTE reserved2[24]; /* Set to zero */
|
||||||
DWORD oframe1; /* Offset to frame 1 (FLC only) */
|
DWORD oframe1; /* Offset to frame 1 (FLC only) */
|
||||||
DWORD oframe2; /* Offset to frame 2 (FLC only) */
|
DWORD oframe2; /* Offset to frame 2 (FLC only) */
|
||||||
BYTE reserved3[40]; /* Set to zero */
|
BYTE reserved3[40]; /* Set to zero */
|
||||||
} FLIC_HEADER;
|
} FLIC_HEADER;
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
void DecodeFLCFrame(
|
||||||
|
LPBITMAPINFOHEADER bitmapHeader,
|
||||||
|
void* pixelData,
|
||||||
|
FLIC_HEADER* flcHeader,
|
||||||
|
void* flcFrame,
|
||||||
|
unsigned char* decodedColorMap
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#endif // FLIC_H
|
#endif // FLIC_H
|
||||||
|
|||||||
BIN
3rdparty/flic/flic.lib
vendored
Normal file
BIN
3rdparty/flic/flic.lib
vendored
Normal file
Binary file not shown.
@ -278,9 +278,10 @@ if (ISLE_USE_DX5)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
target_link_directories(lego1 PRIVATE "${CMAKE_SOURCE_DIR}/3rdparty/smacker")
|
target_link_directories(lego1 PRIVATE "${CMAKE_SOURCE_DIR}/3rdparty/smacker")
|
||||||
|
target_link_directories(lego1 PRIVATE "${CMAKE_SOURCE_DIR}/3rdparty/flic")
|
||||||
|
|
||||||
# Link libraries
|
# Link libraries
|
||||||
target_link_libraries(lego1 PRIVATE ddraw dsound dinput dxguid winmm d3drm smack)
|
target_link_libraries(lego1 PRIVATE ddraw dsound dinput dxguid winmm d3drm smack flic)
|
||||||
|
|
||||||
# Make sure filenames are ALL CAPS
|
# Make sure filenames are ALL CAPS
|
||||||
set_property(TARGET lego1 PROPERTY OUTPUT_NAME LEGO1)
|
set_property(TARGET lego1 PROPERTY OUTPUT_NAME LEGO1)
|
||||||
|
|||||||
@ -28,13 +28,14 @@ class MxFlcPresenter : public MxVideoPresenter {
|
|||||||
|
|
||||||
virtual void LoadHeader(MxStreamChunk* p_chunk) override; // vtable+0x5c
|
virtual void LoadHeader(MxStreamChunk* p_chunk) override; // vtable+0x5c
|
||||||
virtual void CreateBitmap() override; // vtable+0x60
|
virtual void CreateBitmap() override; // vtable+0x60
|
||||||
|
virtual void LoadFrame(MxStreamChunk* p_chunk) override; // vtable+0x68
|
||||||
virtual void RealizePalette() override; // vtable+0x70
|
virtual void RealizePalette() override; // vtable+0x70
|
||||||
|
|
||||||
// SYNTHETIC: LEGO1 0x100b3400
|
// SYNTHETIC: LEGO1 0x100b3400
|
||||||
// MxFlcPresenter::`scalar deleting destructor'
|
// MxFlcPresenter::`scalar deleting destructor'
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
FLIC_HEADER* m_flicHeader;
|
FLIC_HEADER* m_flcHeader; // 0x64
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MXFLCPRESENTER_H
|
#endif // MXFLCPRESENTER_H
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "decomp.h"
|
#include "decomp.h"
|
||||||
#include "mxbitmap.h"
|
#include "mxbitmap.h"
|
||||||
|
#include "mxdsmediaaction.h"
|
||||||
#include "mxomni.h"
|
#include "mxomni.h"
|
||||||
#include "mxpalette.h"
|
#include "mxpalette.h"
|
||||||
#include "mxvideomanager.h"
|
#include "mxvideomanager.h"
|
||||||
@ -11,7 +12,7 @@ DECOMP_SIZE_ASSERT(MxFlcPresenter, 0x68);
|
|||||||
// FUNCTION: LEGO1 0x100b3310
|
// FUNCTION: LEGO1 0x100b3310
|
||||||
MxFlcPresenter::MxFlcPresenter()
|
MxFlcPresenter::MxFlcPresenter()
|
||||||
{
|
{
|
||||||
this->m_flicHeader = NULL;
|
this->m_flcHeader = NULL;
|
||||||
this->m_flags &= ~c_bit2;
|
this->m_flags &= ~c_bit2;
|
||||||
this->m_flags &= ~c_bit3;
|
this->m_flags &= ~c_bit3;
|
||||||
}
|
}
|
||||||
@ -19,16 +20,16 @@ MxFlcPresenter::MxFlcPresenter()
|
|||||||
// FUNCTION: LEGO1 0x100b3420
|
// FUNCTION: LEGO1 0x100b3420
|
||||||
MxFlcPresenter::~MxFlcPresenter()
|
MxFlcPresenter::~MxFlcPresenter()
|
||||||
{
|
{
|
||||||
if (this->m_flicHeader) {
|
if (this->m_flcHeader) {
|
||||||
delete this->m_flicHeader;
|
delete this->m_flcHeader;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x100b3490
|
// FUNCTION: LEGO1 0x100b3490
|
||||||
void MxFlcPresenter::LoadHeader(MxStreamChunk* p_chunk)
|
void MxFlcPresenter::LoadHeader(MxStreamChunk* p_chunk)
|
||||||
{
|
{
|
||||||
m_flicHeader = (FLIC_HEADER*) new MxU8[p_chunk->GetLength()];
|
m_flcHeader = (FLIC_HEADER*) new MxU8[p_chunk->GetLength()];
|
||||||
memcpy(m_flicHeader, p_chunk->GetData(), p_chunk->GetLength());
|
memcpy(m_flcHeader, p_chunk->GetData(), p_chunk->GetLength());
|
||||||
}
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x100b34d0
|
// FUNCTION: LEGO1 0x100b34d0
|
||||||
@ -38,7 +39,39 @@ void MxFlcPresenter::CreateBitmap()
|
|||||||
delete m_bitmap;
|
delete m_bitmap;
|
||||||
|
|
||||||
m_bitmap = new MxBitmap;
|
m_bitmap = new MxBitmap;
|
||||||
m_bitmap->SetSize(m_flicHeader->width, m_flicHeader->height, NULL, FALSE);
|
m_bitmap->SetSize(m_flcHeader->width, m_flcHeader->height, NULL, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// FUNCTION: LEGO1 0x100b3570
|
||||||
|
void MxFlcPresenter::LoadFrame(MxStreamChunk* p_chunk)
|
||||||
|
{
|
||||||
|
MxU32* dat = (MxU32*) p_chunk->GetData() + 4;
|
||||||
|
MxU32 offset = *(MxU32*) p_chunk->GetData();
|
||||||
|
MxBool decodedColorMap;
|
||||||
|
|
||||||
|
DecodeFLCFrame(
|
||||||
|
&m_bitmap->GetBitmapInfo()->m_bmiHeader,
|
||||||
|
m_bitmap->GetBitmapData(),
|
||||||
|
m_flcHeader,
|
||||||
|
&dat[offset],
|
||||||
|
//&(p_chunk->GetData() + 4)[*(MxU32*) p_chunk->GetData()],
|
||||||
|
&decodedColorMap
|
||||||
|
);
|
||||||
|
|
||||||
|
if (((MxDSMediaAction*) m_action)->GetPaletteManagement() && decodedColorMap)
|
||||||
|
RealizePalette();
|
||||||
|
|
||||||
|
while (offset > 0) {
|
||||||
|
dat += 4;
|
||||||
|
MxRect32 rect(
|
||||||
|
dat[-4] + m_location.GetX(),
|
||||||
|
dat[-3] + m_location.GetY(),
|
||||||
|
dat[-2] + m_location.GetX(),
|
||||||
|
dat[-1] + m_location.GetY()
|
||||||
|
);
|
||||||
|
MVideoManager()->InvalidateRect(rect);
|
||||||
|
offset--;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x100b3620
|
// FUNCTION: LEGO1 0x100b3620
|
||||||
|
|||||||
@ -45,7 +45,7 @@ void MxLoopingFlcPresenter::NextFrame()
|
|||||||
else {
|
else {
|
||||||
LoadFrame(chunk);
|
LoadFrame(chunk);
|
||||||
LoopChunk(chunk);
|
LoopChunk(chunk);
|
||||||
m_unk0x68 += m_flicHeader->speed;
|
m_unk0x68 += m_flcHeader->speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_subscriber->DestroyChunk(chunk);
|
m_subscriber->DestroyChunk(chunk);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user