diff --git a/asm/Kyoto/Text/CBlockInstruction.s b/asm/Kyoto/Text/CBlockInstruction.s index 004ebe6d..bba9728f 100644 --- a/asm/Kyoto/Text/CBlockInstruction.s +++ b/asm/Kyoto/Text/CBlockInstruction.s @@ -3,8 +3,8 @@ .section .data .balign 8 -.global lbl_803ED8C8 -lbl_803ED8C8: +.global __vt__17CBlockInstruction +__vt__17CBlockInstruction: # ROM: 0x3EA8C8 .4byte 0 .4byte 0 @@ -39,8 +39,8 @@ __dt__17CBlockInstructionFv: /* 80305DE4 00302D44 93 E1 00 0C */ stw r31, 0xc(r1) /* 80305DE8 00302D48 7C 7F 1B 79 */ or. r31, r3, r3 /* 80305DEC 00302D4C 41 82 00 30 */ beq lbl_80305E1C -/* 80305DF0 00302D50 3C 60 80 3F */ lis r3, lbl_803ED8C8@ha -/* 80305DF4 00302D54 38 03 D8 C8 */ addi r0, r3, lbl_803ED8C8@l +/* 80305DF0 00302D50 3C 60 80 3F */ lis r3, __vt__17CBlockInstruction@ha +/* 80305DF4 00302D54 38 03 D8 C8 */ addi r0, r3, __vt__17CBlockInstruction@l /* 80305DF8 00302D58 90 1F 00 00 */ stw r0, 0(r31) /* 80305DFC 00302D5C 41 82 00 10 */ beq lbl_80305E0C /* 80305E00 00302D60 3C 60 80 3E */ lis r3, __vt__12CInstruction@ha @@ -103,12 +103,10 @@ SetupPositionLTR__17CBlockInstructionCFR16CFontRenderState: /* 80305EB0 00302E10 7C 05 00 2E */ lwzx r0, r5, r0 /* 80305EB4 00302E14 7C 09 03 A6 */ mtctr r0 /* 80305EB8 00302E18 4E 80 04 20 */ bctr -.global lbl_80305EBC lbl_80305EBC: /* 80305EBC 00302E1C 80 03 00 08 */ lwz r0, 8(r3) /* 80305EC0 00302E20 90 04 00 D8 */ stw r0, 0xd8(r4) /* 80305EC4 00302E24 4E 80 00 20 */ blr -.global lbl_80305EC8 lbl_80305EC8: /* 80305EC8 00302E28 80 A3 00 30 */ lwz r5, 0x30(r3) /* 80305ECC 00302E2C 80 03 00 10 */ lwz r0, 0x10(r3) @@ -120,7 +118,6 @@ lbl_80305EC8: /* 80305EE4 00302E44 7C 06 02 14 */ add r0, r6, r0 /* 80305EE8 00302E48 90 04 00 D8 */ stw r0, 0xd8(r4) /* 80305EEC 00302E4C 4E 80 00 20 */ blr -.global lbl_80305EF0 lbl_80305EF0: /* 80305EF0 00302E50 80 C3 00 34 */ lwz r6, 0x34(r3) /* 80305EF4 00302E54 80 A3 00 24 */ lwz r5, 0x24(r3) @@ -134,7 +131,6 @@ lbl_80305EF0: /* 80305F14 00302E74 7C 06 02 14 */ add r0, r6, r0 /* 80305F18 00302E78 90 04 00 D8 */ stw r0, 0xd8(r4) /* 80305F1C 00302E7C 4E 80 00 20 */ blr -.global lbl_80305F20 lbl_80305F20: /* 80305F20 00302E80 80 A3 00 08 */ lwz r5, 8(r3) /* 80305F24 00302E84 80 03 00 10 */ lwz r0, 0x10(r3) @@ -143,7 +139,6 @@ lbl_80305F20: /* 80305F30 00302E90 7C 03 00 50 */ subf r0, r3, r0 /* 80305F34 00302E94 90 04 00 D8 */ stw r0, 0xd8(r4) /* 80305F38 00302E98 4E 80 00 20 */ blr -.global lbl_80305F3C lbl_80305F3C: /* 80305F3C 00302E9C 80 C3 00 34 */ lwz r6, 0x34(r3) /* 80305F40 00302EA0 80 03 00 24 */ lwz r0, 0x24(r3) diff --git a/asm/Kyoto/Text/CTextExecuteBuffer.s b/asm/Kyoto/Text/CTextExecuteBuffer.s index 2c095905..4f3b93b7 100644 --- a/asm/Kyoto/Text/CTextExecuteBuffer.s +++ b/asm/Kyoto/Text/CTextExecuteBuffer.s @@ -2317,11 +2317,11 @@ BeginBlock__18CTextExecuteBufferFiiiib14ETextDirection14EJustification22EVertica /* 80303BB8 00300B18 7C 7A 1B 79 */ or. r26, r3, r3 /* 80303BBC 00300B1C 41 82 00 54 */ beq .L_80303C10 /* 80303BC0 00300B20 3C 80 80 3E */ lis r4, __vt__12CInstruction@ha -/* 80303BC4 00300B24 3C 60 80 3F */ lis r3, lbl_803ED8C8@ha +/* 80303BC4 00300B24 3C 60 80 3F */ lis r3, __vt__17CBlockInstruction@ha /* 80303BC8 00300B28 38 84 9A 6C */ addi r4, r4, __vt__12CInstruction@l /* 80303BCC 00300B2C 38 00 00 00 */ li r0, 0 /* 80303BD0 00300B30 90 9A 00 00 */ stw r4, 0(r26) -/* 80303BD4 00300B34 38 63 D8 C8 */ addi r3, r3, lbl_803ED8C8@l +/* 80303BD4 00300B34 38 63 D8 C8 */ addi r3, r3, __vt__17CBlockInstruction@l /* 80303BD8 00300B38 90 7A 00 00 */ stw r3, 0(r26) /* 80303BDC 00300B3C 92 FA 00 04 */ stw r23, 4(r26) /* 80303BE0 00300B40 93 1A 00 08 */ stw r24, 8(r26) diff --git a/configure.py b/configure.py index 0af274a0..3d2ad531 100755 --- a/configure.py +++ b/configure.py @@ -552,7 +552,7 @@ LIBS = [ ["Kyoto/Text/CTextParser", False], ["Kyoto/Text/CWordBreakTables", False], "Kyoto/Text/CWordInstruction", - "Kyoto/Text/CBlockInstruction", + ["Kyoto/Text/CBlockInstruction", True], ["Kyoto/Text/CFont", True], ["Kyoto/Graphics/CLight", True], "Kyoto/Graphics/CCubeModel", diff --git a/include/Kyoto/Text/CBlockInstruction.hpp b/include/Kyoto/Text/CBlockInstruction.hpp new file mode 100644 index 00000000..d1e97999 --- /dev/null +++ b/include/Kyoto/Text/CBlockInstruction.hpp @@ -0,0 +1,46 @@ +#ifndef _CBLOCKINSTRUCTION +#define _CBLOCKINSTRUCTION + +#include "Kyoto/Text/CInstruction.hpp" +#include "Kyoto/Text/TextCommon.hpp" + +class CBlockInstruction : public CInstruction { +public: + CBlockInstruction(int offX, int offY, int extX, int extY, ETextDirection dir, EJustification just, + EVerticalJustification vjust) + : x4_offsetX(offX) + , x8_offsetY(offY) + , xc_blockExtentX(extX) + , x10_blockExtentY(extY) + , x14_dir(dir) + , x18_justification(just) + , x1c_vertJustification(vjust) + , x20_largestMonoW(0) + , x24_largestMonoH(0) + , x28_largestBaseline(0) + , x2c_lineX(0) + , x30_lineY(0) + , x34_lineCount(0) {} + + void Invoke(CFontRenderState& state, CTextRenderBuffer* buf) const; + void SetupPositionLTR(CFontRenderState& state) const; + void TestLargestFont(int monoW, int monoH, int baseline); + void PageInvoke(CFontRenderState& state, CTextRenderBuffer* buf) const; + +private: + int x4_offsetX; + int x8_offsetY; + int xc_blockExtentX; + int x10_blockExtentY; + ETextDirection x14_dir; + EJustification x18_justification; + EVerticalJustification x1c_vertJustification; + int x20_largestMonoW; + int x24_largestMonoH; + int x28_largestBaseline; + int x2c_lineX; + int x30_lineY; + int x34_lineCount; +}; + +#endif // _CBLOCKINSTRUCTION diff --git a/include/Kyoto/Text/CDrawStringOptions.hpp b/include/Kyoto/Text/CDrawStringOptions.hpp index bd789af0..47534f09 100644 --- a/include/Kyoto/Text/CDrawStringOptions.hpp +++ b/include/Kyoto/Text/CDrawStringOptions.hpp @@ -3,38 +3,7 @@ #include "Kyoto/Graphics/CColor.hpp" #include "rstl/reserved_vector.hpp" - -enum ETextDirection { - kTD_Horizontal, - kTD_Vertical, -}; - -enum EJustification { - kJustification_Left = 0, - kJustification_Center, - kJustification_Right, - kJustification_Full, - kJustification_NLeft, - kJustification_NCenter, - kJustification_NRight, - kJustification_LeftMono, - kJustification_CenterMono, - kJustification_RightMono, -}; - -enum EVerticalJustification { - kVerticalJustification_Top = 0, - kVerticalJustification_Center, - kVerticalJustification_Bottom, - kVerticalJustification_Full, - kVerticalJustification_NTop, - kVerticalJustification_NCenter, - kVerticalJustification_NBottom, - kVerticalJustification_TopMono, - kVerticalJustification_CenterMono, - kVerticalJustification_RightMono, -}; - +#include "Kyoto/Text/TextCommon.hpp" class CDrawStringOptions { public: diff --git a/include/Kyoto/Text/CFontRenderState.hpp b/include/Kyoto/Text/CFontRenderState.hpp index 2febb3d0..86ad6b8b 100644 --- a/include/Kyoto/Text/CFontRenderState.hpp +++ b/include/Kyoto/Text/CFontRenderState.hpp @@ -1,8 +1,8 @@ #ifndef _CFONTRENDERSTATE #define _CFONTRENDERSTATE -#include "Kyoto/Text/CSaveableState.hpp" #include "Kyoto/Text/CDrawStringOptions.hpp" +#include "Kyoto/Text/CSaveableState.hpp" #include "Kyoto/Text/TextCommon.hpp" class CBlockInstruction; @@ -15,12 +15,16 @@ public: void SetColor(EColorType type, const CTextColor& color); void RefreshPalette(); CDrawStringOptions& GetOptions() { return x0_state.GetOptions(); } - const TToken& GetFont() { return x0_state.GetFont(); } + const TToken< CRasterFont >& GetFont() { return x0_state.GetFont(); } + rstl::vector< CTextColor >& GetColors() { return x0_state.GetColors(); } + rstl::vector< bool >& GetOverride() { return x0_state.GetOverride(); } void SetLineSpacing(float spacing) { x0_state.SetLineSpacing(spacing); } void SetExtraLineSpace(int spacing) { x0_state.SetLineExtraSpace(spacing); } - - rstl::vector& GetColors() { return x0_state.GetColors(); } - rstl::vector& GetOverride() { return x0_state.GetOverride(); } + void SetBlock(const CBlockInstruction* block) { x88_curBlock = const_cast(block); } + void SetX(int x) { xd4_curX = x; } + int GetX() const { return xd4_curX; } + void SetY(int y) { xd8_curY = y; } + int GetY() const { return xd8_curY; } private: CSaveableState x0_state; CBlockInstruction* x88_curBlock; diff --git a/include/Kyoto/Text/TextCommon.hpp b/include/Kyoto/Text/TextCommon.hpp index 375d9765..8c81e47b 100644 --- a/include/Kyoto/Text/TextCommon.hpp +++ b/include/Kyoto/Text/TextCommon.hpp @@ -1,9 +1,39 @@ #ifndef _TEXTCOMMON #define _TEXTCOMMON - enum EColorType { }; +enum ETextDirection { + kTD_Horizontal, + kTD_Vertical, +}; + +enum EJustification { + kJustification_Left = 0, + kJustification_Center, + kJustification_Right, + kJustification_Full, + kJustification_NLeft, + kJustification_NCenter, + kJustification_NRight, + kJustification_LeftMono, + kJustification_CenterMono, + kJustification_RightMono, +}; + +enum EVerticalJustification { + kVerticalJustification_Top = 0, + kVerticalJustification_Center, + kVerticalJustification_Bottom, + kVerticalJustification_Full, + kVerticalJustification_NTop, + kVerticalJustification_NCenter, + kVerticalJustification_NBottom, + kVerticalJustification_TopMono, + kVerticalJustification_CenterMono, + kVerticalJustification_RightMono, +}; + #endif // _TEXTCOMMON diff --git a/src/Kyoto/Text/CBlockInstruction.cpp b/src/Kyoto/Text/CBlockInstruction.cpp new file mode 100644 index 00000000..93500f4f --- /dev/null +++ b/src/Kyoto/Text/CBlockInstruction.cpp @@ -0,0 +1,53 @@ +#include "Kyoto/Text/CBlockInstruction.hpp" +#include "Kyoto/Text/CFontRenderState.hpp" + +void CBlockInstruction::Invoke(CFontRenderState& state, CTextRenderBuffer* buf) const { + state.GetOptions().SetTextDirection(x14_dir); + state.SetBlock(this); + if (x14_dir == kTD_Horizontal) { + SetupPositionLTR(state); + } +} +void CBlockInstruction::SetupPositionLTR(CFontRenderState& state) const { + switch (x1c_vertJustification) { + case kVerticalJustification_Top: + case kVerticalJustification_Full: + case kVerticalJustification_NTop: + case kVerticalJustification_TopMono: + state.SetY(x8_offsetY); + break; + case kVerticalJustification_Center: + case kVerticalJustification_NCenter: + state.SetY(x8_offsetY + (x10_blockExtentY - x30_lineY) / 2); + break; + case kVerticalJustification_CenterMono: + state.SetY(x8_offsetY + (x10_blockExtentY - x34_lineCount * x24_largestMonoH) / 2); + break; + case kVerticalJustification_Bottom: + case kVerticalJustification_NBottom: + state.SetY(x8_offsetY + x10_blockExtentY - x30_lineY); + break; + case kVerticalJustification_RightMono: + state.SetY(x8_offsetY + x10_blockExtentY - x34_lineCount * x24_largestMonoH); + break; + } +} + +void CBlockInstruction::TestLargestFont(int monoW, int monoH, int baseline) { + if (!x28_largestBaseline) { + x28_largestBaseline = baseline; + } + + if (x20_largestMonoW < monoW) { + x20_largestMonoW = monoW; + } + + if (x24_largestMonoH < monoH) { + x24_largestMonoH = monoH; + x28_largestBaseline = baseline; + } +} + +void CBlockInstruction::PageInvoke(CFontRenderState& state, CTextRenderBuffer* buf) const { + Invoke(state, buf); +} diff --git a/src/Kyoto/Text/CFontImageDef.cpp b/src/Kyoto/Text/CFontImageDef.cpp index b8a1f22c..6053fc28 100644 --- a/src/Kyoto/Text/CFontImageDef.cpp +++ b/src/Kyoto/Text/CFontImageDef.cpp @@ -29,9 +29,6 @@ bool CFontImageDef::IsLoaded() const { } int CFontImageDef::CalculateBaseline() { - int height; - - height = GetHeight(); - + int height = GetHeight(); return (height * 2.5f) / 3.f; }