From d28318af44fe81248346ebfeaad0f20464a68aca Mon Sep 17 00:00:00 2001 From: Gottfried Leibniz <37632412+gottfriedleibniz@users.noreply.github.com> Date: Sun, 25 Feb 2024 21:37:08 -0400 Subject: [PATCH] tweak(streaming/five): move sfFontStuff definitions --- .../include/sfDefinitions.h | 199 ++++++++++++++- .../gta-streaming-five/src/ScaleformHacks.cpp | 2 +- .../gta-streaming-five/src/sfFontStuff.cpp | 233 +----------------- 3 files changed, 210 insertions(+), 224 deletions(-) diff --git a/code/components/gta-streaming-five/include/sfDefinitions.h b/code/components/gta-streaming-five/include/sfDefinitions.h index b59c494cff..7131af62f3 100644 --- a/code/components/gta-streaming-five/include/sfDefinitions.h +++ b/code/components/gta-streaming-five/include/sfDefinitions.h @@ -9,6 +9,50 @@ #include +struct GRectF +{ + float left, top, right, bottom; +}; + +struct GMatrix2D +{ + float matrix[2][3]; + + inline GMatrix2D() + { + memset(matrix, 0, sizeof(matrix)); + matrix[0][0] = 1.0f; + matrix[1][1] = 1.0f; + } + + inline void AppendScaling(float sx, float sy) + { + matrix[0][0] *= sx; + matrix[0][1] *= sx; + matrix[0][2] *= sx; + matrix[1][0] *= sy; + matrix[1][1] *= sy; + matrix[1][2] *= sy; + } + + inline void AppendTranslation(float dx, float dy) + { + matrix[0][2] += dx; + matrix[1][2] += dy; + } + + inline void Prepend(const GMatrix2D& m) + { + GMatrix2D t = *this; + matrix[0][0] = t.matrix[0][0] * m.matrix[0][0] + t.matrix[0][1] * m.matrix[1][0]; + matrix[1][0] = t.matrix[1][0] * m.matrix[0][0] + t.matrix[1][1] * m.matrix[1][0]; + matrix[0][1] = t.matrix[0][0] * m.matrix[0][1] + t.matrix[0][1] * m.matrix[1][1]; + matrix[1][1] = t.matrix[1][0] * m.matrix[0][1] + t.matrix[1][1] * m.matrix[1][1]; + matrix[0][2] = t.matrix[0][0] * m.matrix[0][2] + t.matrix[0][1] * m.matrix[1][2] + t.matrix[0][2]; + matrix[1][2] = t.matrix[1][0] * m.matrix[0][2] + t.matrix[1][1] * m.matrix[1][2] + t.matrix[1][2]; + } +}; + class GMemoryHeap { public: @@ -38,13 +82,52 @@ class GRefCountBase void operator delete(void* ptr); void operator delete[](void* ptr); + inline void AddRef() + { + InterlockedIncrement(&RefCount); + } + + inline void Release() + { + if (!InterlockedDecrement(&RefCount)) + { + delete this; + } + } + private: volatile long RefCount; }; +class GRenderer +{ +public: + struct CXform + { + float matrix[4][2]; + + CXform() + { + matrix[0][0] = 1.0f; + matrix[1][0] = 1.0f; + matrix[2][0] = 1.0f; + matrix[3][0] = 1.0f; + matrix[0][1] = 0.0f; + matrix[1][1] = 0.0f; + matrix[2][1] = 0.0f; + matrix[3][1] = 0.0f; + } + }; +}; + class GFxObjectInterface; +class GFxMovieDef; class GFxValue; +class GFxCharacter : public GRefCountBase +{ +}; + class GFxFunctionHandler : public GRefCountBase { public: @@ -63,10 +146,33 @@ class GFxFunctionHandler : public GRefCountBase virtual void Call(const Params& params) = 0; }; -class GFxMovieRoot +class GFxTextImageDesc : public GRefCountBase { public: - virtual void m_00() = 0; + void* imageShape; + GFxCharacter* spriteShape; + int baseLineX; + int baseLineY; + uint32_t screenWidth; + uint32_t screenHeight; + GMatrix2D matrix; +}; + +class GFxStyledText : public GRefCountBase +{ +public: + struct HTMLImageTagInfo + { + GFxTextImageDesc* textImageDesc; + char pad[32]; + uint32_t Width, Height; + }; +}; + +class GFxMovieRoot : public GRefCountBase +{ +public: + // virtual void m_00() = 0; virtual void m_08() = 0; virtual void m_10() = 0; virtual void m_18() = 0; @@ -83,6 +189,10 @@ class GFxMovieRoot virtual void m_70() = 0; virtual void CreateFunction(GFxValue* value, GFxFunctionHandler* pfc, void* puserData = nullptr) = 0; virtual void SetVariable(const char* path, const GFxValue& value, int type) = 0; + +public: + char pad_10[0xB8]; + GRectF VisibleFrameRect; }; class GFxValue @@ -201,3 +311,88 @@ class GFxValue ValueType Type; ValueUnion mValue; }; + +class GFxSprite : public GFxCharacter +{ +public: + // virtual void m0() = 0; + virtual void m1() = 0; + virtual void m2() = 0; + virtual void m3() = 0; + virtual void m4() = 0; + virtual void m5() = 0; + virtual void m6() = 0; + virtual void m7() = 0; + virtual void m8() = 0; + virtual void m9() = 0; + virtual void m10() = 0; + virtual void m11() = 0; + virtual void m12() = 0; + virtual void m13() = 0; + virtual void m14() = 0; + virtual void m15() = 0; + virtual GRectF GetRectBounds(const GMatrix2D& matrix) = 0; + virtual void m17() = 0; + virtual void m18() = 0; + virtual void m19() = 0; + virtual void m20() = 0; + virtual void m21() = 0; + virtual void m22() = 0; + virtual void m23() = 0; + virtual void m24() = 0; + virtual void m25() = 0; + virtual void m26() = 0; + virtual void m27() = 0; + virtual void m28() = 0; + virtual void Display(void* context) = 0; + virtual void Restart() = 0; +}; + +struct GFxDisplayContext +{ + GRenderer::CXform* parentCxform; + GMatrix2D* parentMatrix; +}; + +struct GFxTextFormat +{ + char pad[66]; + uint16_t presentMask; + char pad2[12]; +}; + +struct GFxElemDesc +{ + char pad[32]; + GFxTextFormat fmt; + char paraFmt[24]; +}; + +class GFxResource +{ +public: + virtual void m_0() = 0; + virtual void m_1() = 0; + virtual int GetType() = 0; + + inline bool IsSprite() + { + return ((GetType() >> 8) & 0xff) == 0x84; + } +}; + +class GFxSpriteDef : public GFxResource +{ +public: + virtual void m_s0() = 0; + virtual void m_s1() = 0; + virtual void m_s2() = 0; + virtual void m_s3() = 0; + virtual void m_s4() = 0; + virtual void m_s5() = 0; + virtual void* CreateCharacterInstance(void* parent, uint32_t* id, void* pbindingImpl) = 0; +}; + +#ifdef _DEBUG +static_assert(offsetof(GFxMovieRoot, VisibleFrameRect) == 200); +#endif diff --git a/code/components/gta-streaming-five/src/ScaleformHacks.cpp b/code/components/gta-streaming-five/src/ScaleformHacks.cpp index 1bd1c009ba..7d7ed91891 100644 --- a/code/components/gta-streaming-five/src/ScaleformHacks.cpp +++ b/code/components/gta-streaming-five/src/ScaleformHacks.cpp @@ -76,7 +76,7 @@ bool GFxValue::GetMember(const char* name, GFxValue* pval) const return __GFxObjectInterface_GetMember(pObjectInterface, mValue.pData, name, pval, IsDisplayObject()); } -GMemoryHeap** g_gfxMemoryHeap;// = (GFxMemoryHeap**)0x142CBB3E8; +static GMemoryHeap** g_gfxMemoryHeap;// = (GFxMemoryHeap**)0x142CBB3E8; void* GRefCountBase::operator new(size_t size) { diff --git a/code/components/gta-streaming-five/src/sfFontStuff.cpp b/code/components/gta-streaming-five/src/sfFontStuff.cpp index 01b1bd5a7f..b08522c2f8 100644 --- a/code/components/gta-streaming-five/src/sfFontStuff.cpp +++ b/code/components/gta-streaming-five/src/sfFontStuff.cpp @@ -1,5 +1,6 @@ #include "StdInc.h" #include +#include #include @@ -142,22 +143,6 @@ static void UpdateFontLoading() static bool(*g_origFindExportedResource)(void* movieRoot, void* localDef, void* bindData, void* symbol); -struct GFxMovieDef -{ - -}; - -struct GRectF -{ - float left, top, right, bottom; -}; - -struct GFxMovieRoot -{ - char pad[200]; - GRectF VisibleFrameRect; -}; - static GFxMovieDef* g_md; static GFxMovieRoot* g_movie; @@ -253,50 +238,11 @@ static bool GetExportedResource(void* movieDef, void* bindData, void* symbol, vo return rv; } -static void AddRef(void* ptr) -{ - InterlockedIncrement((unsigned long*)((char*)ptr + 8)); -} - -static void ReleaseRef(void* ptr) -{ - struct VBase - { - public: - virtual ~VBase() = 0; - }; - - if (!InterlockedDecrement((unsigned long*)((char*)ptr + 8))) - { - delete (VBase*)ptr; - } -} - static hook::cdecl_stub _gfxMovieRoot_getLevelMovie([]() { return hook::get_pattern("48 8B 49 40 44 8B C0 4D 03 C0 42 39 14 C1 74 0D", -0xB); }); -class GFxMemoryHeap -{ -public: - virtual void m_00() = 0; - virtual void m_08() = 0; - virtual void m_10() = 0; - virtual void m_18() = 0; - virtual void m_20() = 0; - virtual void m_28() = 0; - virtual void m_30() = 0; - virtual void m_38() = 0; - virtual void m_40() = 0; - virtual void m_48() = 0; - virtual void* Alloc(uint32_t size) = 0; - virtual void m_58() = 0; - virtual void Free(void* memory) = 0; -}; - -extern GFxMemoryHeap** g_gfxMemoryHeap; - static LONG SafetyFilter(PEXCEPTION_POINTERS pointers) { static bool excepted = false; @@ -311,159 +257,18 @@ static LONG SafetyFilter(PEXCEPTION_POINTERS pointers) return EXCEPTION_EXECUTE_HANDLER; } -struct Matrix2D -{ - float matrix[2][3]; - - inline Matrix2D() - { - memset(matrix, 0, sizeof(matrix)); - matrix[0][0] = 1.0f; - matrix[1][1] = 1.0f; - } - - inline void AppendScaling(float sx, float sy) - { - matrix[0][0] *= sx; - matrix[0][1] *= sx; - matrix[0][2] *= sx; - matrix[1][0] *= sy; - matrix[1][1] *= sy; - matrix[1][2] *= sy; - } - - inline void AppendTranslation(float dx, float dy) - { - matrix[0][2] += dx; - matrix[1][2] += dy; - } - - inline void Prepend(const Matrix2D& m) - { - Matrix2D t = *this; - matrix[0][0] = t.matrix[0][0] * m.matrix[0][0] + t.matrix[0][1] * m.matrix[1][0]; - matrix[1][0] = t.matrix[1][0] * m.matrix[0][0] + t.matrix[1][1] * m.matrix[1][0]; - matrix[0][1] = t.matrix[0][0] * m.matrix[0][1] + t.matrix[0][1] * m.matrix[1][1]; - matrix[1][1] = t.matrix[1][0] * m.matrix[0][1] + t.matrix[1][1] * m.matrix[1][1]; - matrix[0][2] = t.matrix[0][0] * m.matrix[0][2] + t.matrix[0][1] * m.matrix[1][2] + t.matrix[0][2]; - matrix[1][2] = t.matrix[1][0] * m.matrix[0][2] + t.matrix[1][1] * m.matrix[1][2] + t.matrix[1][2]; - } -}; - -struct CXform -{ - float matrix[4][2]; - - CXform() - { - matrix[0][0] = 1.0f; - matrix[1][0] = 1.0f; - matrix[2][0] = 1.0f; - matrix[3][0] = 1.0f; - matrix[0][1] = 0.0f; - matrix[1][1] = 0.0f; - matrix[2][1] = 0.0f; - matrix[3][1] = 0.0f; - } -}; - -struct GFxTextImageDesc -{ - void* vtbl; - int refcount; - void* imageShape; - void* spriteShape; - int baseLineX; - int baseLineY; - uint32_t screenWidth; - uint32_t screenHeight; - Matrix2D matrix; -}; - -struct HTMLImageTagInfo -{ - GFxTextImageDesc* textImageDesc; - char pad[32]; - uint32_t Width, Height; -}; - -struct GFxResource -{ - virtual void m_0() = 0; - virtual void m_1() = 0; - virtual int GetType() = 0; - - inline bool IsSprite() - { - return ((GetType() >> 8) & 0xff) == 0x84; - } -}; - -struct GFxSprite -{ - virtual void m0() = 0; - virtual void m1() = 0; - virtual void m2() = 0; - virtual void m3() = 0; - virtual void m4() = 0; - virtual void m5() = 0; - virtual void m6() = 0; - virtual void m7() = 0; - virtual void m8() = 0; - virtual void m9() = 0; - virtual void m10() = 0; - virtual void m11() = 0; - virtual void m12() = 0; - virtual void m13() = 0; - virtual void m14() = 0; - virtual void m15() = 0; - virtual GRectF GetRectBounds(const Matrix2D& matrix) = 0; - virtual void m17() = 0; - virtual void m18() = 0; - virtual void m19() = 0; - virtual void m20() = 0; - virtual void m21() = 0; - virtual void m22() = 0; - virtual void m23() = 0; - virtual void m24() = 0; - virtual void m25() = 0; - virtual void m26() = 0; - virtual void m27() = 0; - virtual void m28() = 0; - virtual void Display(void* context) = 0; - virtual void Restart() = 0; -}; - -struct GFxSpriteDef : public GFxResource -{ - virtual void m_s0() = 0; - virtual void m_s1() = 0; - virtual void m_s2() = 0; - virtual void m_s3() = 0; - virtual void m_s4() = 0; - virtual void m_s5() = 0; - virtual void* CreateCharacterInstance(void* parent, uint32_t* id, - void* pbindingImpl) = 0; -}; - -struct DisplayContext -{ - CXform* parentCxform; - Matrix2D* parentMatrix; -}; - -static void HandleSprite(GFxResource* resource, HTMLImageTagInfo* imgTagInfo, uint64_t document, void* md, void* character) +static void HandleSprite(GFxResource* resource, GFxStyledText::HTMLImageTagInfo* imgTagInfo, uint64_t document, void* md, void* character) { auto sprite = (GFxSpriteDef*)resource; static uint32_t id = 0x1234; auto ci = (GFxSprite*)sprite->CreateCharacterInstance(character ? character : _gfxMovieRoot_getLevelMovie(g_movie, 0), &id, g_md ? g_md : md); - AddRef(ci); + ci->AddRef(); if (imgTagInfo->textImageDesc->spriteShape) { - ReleaseRef(imgTagInfo->textImageDesc->spriteShape); + imgTagInfo->textImageDesc->spriteShape->Release(); } imgTagInfo->textImageDesc->spriteShape = ci; @@ -473,7 +278,7 @@ static void HandleSprite(GFxResource* resource, HTMLImageTagInfo* imgTagInfo, ui ci->Restart(); - auto rect = ci->GetRectBounds(Matrix2D{}); + auto rect = ci->GetRectBounds(GMatrix2D{}); float origWidth = abs(rect.right - rect.left); float origHeight = abs(rect.bottom - rect.top); @@ -490,7 +295,7 @@ static void HandleSprite(GFxResource* resource, HTMLImageTagInfo* imgTagInfo, ui // SetCompleteReformatReq *(uint8_t*)(document + 456i64) |= 2u; - ReleaseRef(ci); + ci->Release(); } static HookFunction hookFunction([]() @@ -550,7 +355,7 @@ static HookFunction hookFunction([]() ret(); } - static void HandleNewImageTag(HTMLImageTagInfo* imgTagInfo, GFxResource* resource, void* self, void* md) + static void HandleNewImageTag(GFxStyledText::HTMLImageTagInfo* imgTagInfo, GFxResource* resource, void* self, void* md) { if (resource->IsSprite()) { @@ -603,7 +408,7 @@ static HookFunction hookFunction([]() ret(); } - static int HandleNewImageTag(HTMLImageTagInfo* imgTagInfo, GFxResource* resource, uint64_t document) + static int HandleNewImageTag(GFxStyledText::HTMLImageTagInfo* imgTagInfo, GFxResource* resource, uint64_t document) { __try { @@ -654,7 +459,7 @@ static HookFunction hookFunction([]() ret(); } - static void DrawSprite(GFxTextImageDesc* image, DisplayContext* drawContext, const Matrix2D* matrix) + static void DrawSprite(GFxTextImageDesc* image, GFxDisplayContext* drawContext, const GMatrix2D* matrix) { // add a SEH frame here so we won't try unwinding over the jitasm stub __try @@ -667,7 +472,7 @@ static HookFunction hookFunction([]() } } - static void DrawSpriteInternal(GFxTextImageDesc* image, DisplayContext* drawContext, const Matrix2D* matrix) + static void DrawSpriteInternal(GFxTextImageDesc* image, GFxDisplayContext* drawContext, const GMatrix2D* matrix) { // expand the visible rectangle of the placeholder movie // otherwise, only ~600x400 on-screen gets sprites drawn due to culling tests @@ -687,7 +492,7 @@ static HookFunction hookFunction([]() m2.Prepend(image->matrix); // set the matrix/color transform in the context - CXform identityCxform; + GRenderer::CXform identityCxform; auto oldParentCxform = drawContext->parentCxform; auto oldParentMatrix = drawContext->parentMatrix; @@ -710,20 +515,6 @@ static HookFunction hookFunction([]() // fix bug when img tag is last in a text formatting tag (https://github.com/citizenfx/fivem/issues/1112) static void (*origPopBack)(void* vec, size_t len); - struct TextFormat - { - char pad[66]; - uint16_t presentMask; - char pad2[12]; - }; - - struct ElemDesc - { - char pad[32]; - TextFormat fmt; - char paraFmt[24]; - }; - static struct : jitasm::Frontend { void InternalMain() override @@ -733,7 +524,7 @@ static HookFunction hookFunction([]() jmp(rax); } - static void ParseHtmlReset(ElemDesc** vec, size_t len, TextFormat* format) + static void ParseHtmlReset(GFxElemDesc** vec, size_t len, GFxTextFormat* format) { if (len > 0) {