From fa69cd1160a53ab889a349246f24258eb4d73938 Mon Sep 17 00:00:00 2001 From: Misha Date: Sat, 7 Oct 2023 18:22:31 -0400 Subject: [PATCH] mxvideopresenter --- LEGO1/mxrect32.h | 3 ++ LEGO1/mxvideomanager.cpp | 6 +++ LEGO1/mxvideomanager.h | 2 + LEGO1/mxvideopresenter.cpp | 88 +++++++++++++++++++++++++++++--------- LEGO1/mxvideopresenter.h | 12 +++--- 5 files changed, 84 insertions(+), 27 deletions(-) diff --git a/LEGO1/mxrect32.h b/LEGO1/mxrect32.h index 53b5b1eb..37574a4d 100644 --- a/LEGO1/mxrect32.h +++ b/LEGO1/mxrect32.h @@ -1,6 +1,9 @@ #ifndef MXRECT32_H #define MXRECT32_H +#define MxRect32GetWidth(rect) (rect.m_right - rect.m_left) + 1 +#define MxRect32GetHeight(rect) (rect.m_bottom - rect.m_top) + 1 + class MxRect32 { public: diff --git a/LEGO1/mxvideomanager.cpp b/LEGO1/mxvideomanager.cpp index bab495fd..e1ac9b10 100644 --- a/LEGO1/mxvideomanager.cpp +++ b/LEGO1/mxvideomanager.cpp @@ -123,3 +123,9 @@ MxResult MxVideoManager::vtable0x2c(MxVideoParam& p_videoParam, undefined4 p_unk { return FAILURE; } + +// OFFSET: LEGO1 0x100be270 +void MxVideoManager::vtable0x34(MxU32 p_x, MxU32 p_y, MxU32 p_width, MxU32 p_height) +{ + +} diff --git a/LEGO1/mxvideomanager.h b/LEGO1/mxvideomanager.h index d72c1d10..7298e6d1 100644 --- a/LEGO1/mxvideomanager.h +++ b/LEGO1/mxvideomanager.h @@ -5,6 +5,7 @@ #include "mxregion.h" #include "mxmediamanager.h" #include "mxvideoparam.h" +#include "mxrect32.h" // VTABLE 0x100dc810 // SIZE 0x64 @@ -19,6 +20,7 @@ class MxVideoManager : public MxMediaManager __declspec(dllexport) void InvalidateRect(MxRect32 &); __declspec(dllexport) virtual MxLong RealizePalette(MxPalette *); // vtable+0x30 + virtual void vtable0x34(MxU32 p_x, MxU32 p_y, MxU32 p_width, MxU32 p_height); MxVideoManager(); diff --git a/LEGO1/mxvideopresenter.cpp b/LEGO1/mxvideopresenter.cpp index 42dc34f3..10b90b5c 100644 --- a/LEGO1/mxvideopresenter.cpp +++ b/LEGO1/mxvideopresenter.cpp @@ -1,11 +1,12 @@ #include "mxvideopresenter.h" +#include "MxVideoManager.h" DECOMP_SIZE_ASSERT(MxVideoPresenter, 0x64); -// OFFSET: LEGO1 0x1000c700 STUB -void MxVideoPresenter::VTable0x5c() +// OFFSET: LEGO1 0x1000c700 +void MxVideoPresenter::VTable0x5c(undefined4 p_unknown1) { - // TODO + // Empty } // OFFSET: LEGO1 0x1000c710 @@ -14,16 +15,16 @@ void MxVideoPresenter::VTable0x60() // Empty } -// OFFSET: LEGO1 0x1000c720 STUB -void MxVideoPresenter::VTable0x68() +// OFFSET: LEGO1 0x1000c720 +void MxVideoPresenter::VTable0x68(undefined4 p_unknown1) { - // TODO + // Empty } -// OFFSET: LEGO1 0x1000c730 STUB +// OFFSET: LEGO1 0x1000c730 void MxVideoPresenter::VTable0x70() { - // TODO + // Empty } // OFFSET: LEGO1 0x1000c740 @@ -32,16 +33,16 @@ MxVideoPresenter::~MxVideoPresenter() Destroy(TRUE); } -// OFFSET: LEGO1 0x1000c7a0 STUB +// OFFSET: LEGO1 0x1000c7a0 void MxVideoPresenter::InitVirtual() { - // TODO + Destroy(FALSE); } -// OFFSET: LEGO1 0x1000c7b0 STUB -void MxVideoPresenter::VTable0x78() +// OFFSET: LEGO1 0x1000c7b0 +MxCore* MxVideoPresenter::VTable0x78() { - // TODO + return m_unk58; } // OFFSET: LEGO1 0x1000c7c0 @@ -64,16 +65,61 @@ MxS32 MxVideoPresenter::GetHeight() : m_bitmap->GetBmiHeader()->biHeight; } -// OFFSET: LEGO1 0x100b2760 STUB +// OFFSET: LEGO1 0x100b2760 void MxVideoPresenter::Init() { - // TODO + m_bitmap = NULL; + m_unk54 = NULL; + m_unk5c = 1; + m_unk58 = NULL; + m_unk60 = -1; + m_flags = m_flags & 0xfe; + if (MVideoManager() != NULL) + { + MVideoManager(); + m_flags = m_flags | 2; + m_flags = m_flags & 0xfb; + } + m_flags = m_flags & 0xf7; + m_flags = m_flags & 0xef; } -// OFFSET: LEGO1 0x100b27b0 STUB -void MxVideoPresenter::Destroy(MxBool) +// OFFSET: LEGO1 0x100b27b0 +void MxVideoPresenter::Destroy(MxBool p_reinit) { - // TODO + MxRect32 rect; + if (MVideoManager() != NULL) + { + MVideoManager()->RemovePresenter(*this); + } + if(m_unk58 != NULL) + { + m_unk58->Tickle(); + m_unk58 = NULL; + m_flags = m_flags & 0xfd; + m_flags = m_flags & 0xfb; + } + + if (MVideoManager() != NULL && m_unk54 != NULL && m_bitmap != NULL) + { + rect.m_right = GetWidth() + rect.m_left; + rect.m_bottom = GetHeight() + rect.m_top; + rect.m_left = GetLocationX(); + rect.m_top = GetLocationY(); + + MVideoManager()->InvalidateRect(rect); + MVideoManager()->vtable0x34(rect.m_left, rect.m_top, MxRect32GetWidth(rect), MxRect32GetHeight(rect)); + } + + delete m_bitmap; + delete m_unk58; + + Init(); + if (!p_reinit) + { + // TODO MxMediaPresenter->Destroy(FALSE) + //Destroy(FALSE); + } } // OFFSET: LEGO1 0x100b28b0 STUB @@ -88,8 +134,8 @@ void MxVideoPresenter::VTable0x6c() // TODO } -// OFFSET: LEGO1 0x100b3300 STUB -void MxVideoPresenter::VTable0x74() +// OFFSET: LEGO1 0x100b3300 +undefined MxVideoPresenter::VTable0x74() { - // TODO + return 0; } diff --git a/LEGO1/mxvideopresenter.h b/LEGO1/mxvideopresenter.h index 9c9a21a3..5e7a5c66 100644 --- a/LEGO1/mxvideopresenter.h +++ b/LEGO1/mxvideopresenter.h @@ -35,14 +35,14 @@ class MxVideoPresenter : public MxMediaPresenter virtual void InitVirtual() override; // vtable+0x38 - virtual void VTable0x5c(); // vtable+0x5c + virtual void VTable0x5c(undefined4 p_unknown1); // vtable+0x5c virtual void VTable0x60(); // vtable+0x60 virtual void VTable0x64(); // vtable+0x64 - virtual void VTable0x68(); // vtable+0x68 + virtual void VTable0x68(undefined4 p_unknown1); // vtable+0x68 virtual void VTable0x6c(); // vtable+0x6c virtual void VTable0x70(); // vtable+0x70 - virtual void VTable0x74(); // vtable+0x74 - virtual void VTable0x78(); // vtable+0x78 + virtual undefined VTable0x74(); // vtable+0x74 + virtual MxCore* VTable0x78(); // vtable+0x78 virtual MxBool VTable0x7c(); // vtable+0x7c virtual MxS32 GetWidth(); // vtable+0x80 virtual MxS32 GetHeight(); // vtable+0x84 @@ -57,10 +57,10 @@ class MxVideoPresenter : public MxMediaPresenter MxBitmap *m_bitmap; unknown_meta_struct *m_unk54; - undefined4 m_unk58; + MxCore* m_unk58; undefined2 m_unk5c; unsigned char m_flags; // 0x5e - undefined4 m_unk60; + MxLong m_unk60; }; #endif // MXVIDEOPRESENTER_H