From 834d0673ea3a737633ef26d19392e81aed87ebbf Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 12 May 2024 14:23:03 -0400 Subject: [PATCH] Matched ut_TextWriterBase --- config/SOUE01/symbols.txt | 4 +- configure.py | 6 +- include/nw4r/ut/ut_TextWriterBase.h | 9 +-- src/nw4r/ut/ut_TextWriterBase.cpp | 89 +++++++++++++++-------------- 4 files changed, 57 insertions(+), 51 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index c0fbc182..01079b35 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -3837,7 +3837,7 @@ fn_800AEB00 = .text:0x800AEB00; // type:function size:0x178 fn_800AEC80 = .text:0x800AEC80; // type:function size:0x108 fn_800AED90 = .text:0x800AED90; // type:function size:0x1E8 fn_800AEF80 = .text:0x800AEF80; // type:function size:0x414 -fn_800AF3A0 = .text:0x800AF3A0; // type:function size:0x38 +GetCharStrmReader__Q34nw4r2ut4FontCFv = .text:0x800AF3A0; // type:function size:0x38 fn_800AF3E0 = .text:0x800AF3E0; // type:function size:0x8C fn_800AF470 = .text:0x800AF470; // type:function size:0xCC fn_800AF540 = .text:0x800AF540; // type:function size:0x8C @@ -24137,7 +24137,7 @@ CalcStringRectImpl__Q34nw4r2ut17TextWriterBaseFPQ34nw4r2ut4RectPCwi = .text:0 PrintImpl__Q34nw4r2ut17TextWriterBaseFPCwib = .text:0x804334E0; // type:function size:0x828 AdjustCursor__Q34nw4r2ut17TextWriterBaseFPfPfPCwi = .text:0x80433D10; // type:function size:0x4D8 IsDrawFlagSet__Q34nw4r2ut17TextWriterBaseCFUlUl = .text:0x804341F0; // type:function size:0x18 -__sinit_\ut_TextWriterBase_cpp = .text:0x80434210; // type:function size:0x84 +__sinit_\ut_TextWriterBase_cpp = .text:0x80434210; // type:function size:0x84 scope:local DirectPrint_Init__Q24nw4r2dbFv = .text:0x804342A0; // type:function size:0xB4 DirectPrint_IsActive__Q24nw4r2dbFv = .text:0x80434360; // type:function size:0x28 DirectPrint_EraseXfb__Q24nw4r2dbFiiii = .text:0x80434390; // type:function size:0x190 diff --git a/configure.py b/configure.py index cb417508..bbe0cf79 100644 --- a/configure.py +++ b/configure.py @@ -230,7 +230,7 @@ def Rel(status, rel_name, cpp_name, extra_cflags=[]): def DolphinLib(lib_name, objects): return { "lib": lib_name, - "mw_version": "GC/1.2.5n", + "mw_version": "Wii/1.0", # from version strings "cflags": cflags_dolphin, "host": False, "objects": objects, @@ -250,7 +250,7 @@ def EGGLib(lib_name, objects): def nw4rLib(lib_name, objects): return { "lib": lib_name, - "mw_version": "Wii/1.6", + "mw_version": "Wii/1.1", # most seem to be around 1.2, snd is 1.6 "cflags": cflags_nw4r, "host": False, "objects": objects, @@ -343,7 +343,7 @@ config.libs = [ Object(Matching, "nw4r/ut/ut_ResFontBase.cpp"), Object(Matching, "nw4r/ut/ut_ResFont.cpp"), Object(Matching, "nw4r/ut/ut_CharWriter.cpp"), - Object(NonMatching, "nw4r/ut/ut_TextWriterBase.cpp"), + Object(Matching, "nw4r/ut/ut_TextWriterBase.cpp"), ], ), # EGG diff --git a/include/nw4r/ut/ut_TextWriterBase.h b/include/nw4r/ut/ut_TextWriterBase.h index 71291fbe..54aad853 100644 --- a/include/nw4r/ut/ut_TextWriterBase.h +++ b/include/nw4r/ut/ut_TextWriterBase.h @@ -64,9 +64,6 @@ public: void SetDrawFlag(u32 flag) { mDrawFlag = flag; } - bool IsDrawFlagSet(unsigned long mask, u32 flag) const { - return (mDrawFlag & mask) == flag; - } TagProcessorBase *GetTagProcessor() const { return mTagProcessor; @@ -108,11 +105,15 @@ public: } f32 CalcLineWidth(const T *format, int len); - bool CalcLineRectImpl(Rect *rect, const T **str, int len); + int CalcLineRectImpl(Rect *rect, const T **str, int len); void CalcStringRectImpl(Rect *rect, const T *str, int len); f32 PrintImpl(const T *str, int len, bool m); f32 AdjustCursor(f32 *x1, f32 *y1, const T *str, int len); + bool IsDrawFlagSet(unsigned long mask, unsigned long flag) const { + return (mDrawFlag & mask) == flag; + } + private: f32 mWidthLimit; // at 0x4C f32 mCharSpace; // at 0x50 diff --git a/src/nw4r/ut/ut_TextWriterBase.cpp b/src/nw4r/ut/ut_TextWriterBase.cpp index 82c464a8..f781f906 100644 --- a/src/nw4r/ut/ut_TextWriterBase.cpp +++ b/src/nw4r/ut/ut_TextWriterBase.cpp @@ -179,68 +179,70 @@ f32 TextWriterBase::CalcLineWidth(const T *str, int len) { } template -bool TextWriterBase::CalcLineRectImpl(Rect *rect, const T **str, int len) { - const T *strBegin = *str; - const T *strEnd = strBegin + len; +int TextWriterBase::CalcLineRectImpl(Rect *pRect, const T **pStr, int length) { + const T *strBegin = *pStr; + const T *strEnd = strBegin + length; const bool useLimit = mWidthLimit < NW4R_MATH_FLT_MAX; PrintContext context = {this, strBegin}; - f32 x = 0.0f; bool charSpace = false; bool overLimit = false; const T *prevStream = NULL; + Rect prevRect; CharStrmReader reader = GetFont()->GetCharStrmReader(); - rect->left = 0.0f; - rect->right = 0.0f; - rect->top = Min(0.0f, GetLineHeight()); - rect->bottom = Max(0.0f, GetLineHeight()); - prevRect = *rect; + pRect->left = 0.0f; + pRect->right = 0.0f; + pRect->top = Min(0.0f, GetLineHeight()); + pRect->bottom = Max(0.0f, GetLineHeight()); + prevRect = *pRect; reader.Set(strBegin); prevStream = NULL; - u16 ch = reader.Next(); + u16 code = reader.Next(); while (static_cast(reader.GetCurrentPos()) <= strEnd) { - if (ch < ' ') { + if (code < ' ') { Rect r(x, 0.0f, 0.0f, 0.0f); context.str = static_cast(reader.GetCurrentPos()); context.flags = charSpace ? 0 : PRINTFLAGS_CHARSPACE; SetCursorX(x); - if (useLimit && ch != '\n' && prevStream != NULL) { + if (useLimit && code != '\n' && prevStream != NULL) { PrintContext context2 = context; TextWriterBase clone(*this); Rect r; context2.writer = &clone; - mTagProcessor->CalcRect(&r, ch, &context2); + mTagProcessor->CalcRect(&r, code, &context2); - if (r.GetWidth() > 0.0f && clone.GetCursorX() - context.x > mWidthLimit) { - overLimit = true; - ch = '\n'; - reader.Set(prevStream); - continue; + if (r.GetWidth() > 0.0f) { + if (clone.GetCursorX() - context.x > mWidthLimit) { + overLimit = true; + code = '\n'; + reader.Set(prevStream); + continue; + } } } - Operation oper = mTagProcessor->CalcRect(&r, ch, &context); + Operation oper = mTagProcessor->CalcRect(&r, code, &context); reader.Set(context.str); - rect->left = Min(rect->left, r.left); - rect->top = Min(rect->top, r.top); - rect->right = Max(rect->right, r.right); - rect->bottom = Max(rect->bottom, r.bottom); + pRect->left = Min(pRect->left, r.left); + pRect->top = Min(pRect->top, r.top); + pRect->right = Max(pRect->right, r.right); + pRect->bottom = Max(pRect->bottom, r.bottom); x = GetCursorX(); if (oper == OPERATION_END_DRAW) { - *str += len; + *pStr += length; return false; } @@ -261,19 +263,20 @@ bool TextWriterBase::CalcLineRectImpl(Rect *rect, const T **str, int len) { if (IsWidthFixed()) { dx += GetFixedWidth(); } else { - dx += GetFont()->GetCharWidth(ch) * GetScaleH(); + dx += GetFont()->GetCharWidth(code) * GetScaleH(); } - - if (useLimit && prevStream != NULL && x + dx > mWidthLimit) { - overLimit = true; - ch = '\n'; - reader.Set(prevStream); - continue; + if (useLimit && prevStream != NULL) { + if (x + dx > mWidthLimit) { + overLimit = true; + code = '\n'; + reader.Set(prevStream); + continue; + } } x += dx; - rect->left = Min(rect->left, x); - rect->right = Max(rect->right, x); + pRect->left = Min(pRect->left, x); + pRect->right = Max(pRect->right, x); charSpace = true; } @@ -282,10 +285,10 @@ bool TextWriterBase::CalcLineRectImpl(Rect *rect, const T **str, int len) { prevStream = static_cast(reader.GetCurrentPos()); } - ch = reader.Next(); + code = reader.Next(); } - *str = static_cast(reader.GetCurrentPos()); + *pStr = static_cast(reader.GetCurrentPos()); return overLimit; } @@ -434,6 +437,10 @@ f32 TextWriterBase::PrintImpl(const T *str, int len, bool m) { if (IsDrawFlagSet(0x300, 0x100) || IsDrawFlagSet(0x300, 0x200)) { SetCursorY(orgCursorY); + } else if (m) { + if (IsDrawFlagSet(0x300, 0)) { + SetCursorY(GetCursorY() - GetFontAscent()); + } } else { MoveCursorY(cursorYAdj); } @@ -446,14 +453,12 @@ f32 TextWriterBase::AdjustCursor(f32 *x1, f32 *y1, const T *str, int len) { f32 textWidth = 0.0f; f32 textHeight = 0.0f; - if (!IsDrawFlagSet(0x333, 0x300)) { - if (!IsDrawFlagSet(0x333, 0)) { - Rect rect; - CalcStringRect(&rect, str, len); + if (!IsDrawFlagSet(0x333, 0x300) && !IsDrawFlagSet(0x333, 0)) { + Rect rect; + CalcStringRect(&rect, str, len); - textWidth = rect.left + rect.right; - textHeight = rect.top + rect.bottom; - } + textWidth = rect.left + rect.right; + textHeight = rect.top + rect.bottom; } if (IsDrawFlagSet(0x30, 0x10)) {