diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 6278d342..5edab8fa 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -77,8 +77,12 @@ d/d_fader.cpp: .ctors start:0x804DB678 end:0x804DB67C d/d_font_manager.cpp: - .text start:0x80053E70 end:0x800541D0 + .text start:0x80053E70 end:0x800541EC .ctors start:0x804DB67C end:0x804DB680 + .rodata start:0x804DDFF0 end:0x804DE008 + .data start:0x8050D358 end:0x8050D440 + .sbss start:0x80575108 end:0x80575110 + .bss start:0x80597608 end:0x80597740 d/d_gfx.cpp: .text start:0x800541F0 end:0x80054B00 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 268e77c7..89d5db6f 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -2191,17 +2191,17 @@ fn_80053C50 = .text:0x80053C50; // type:function size:0x198 fn_80053DF0 = .text:0x80053DF0; // type:function size:0x1C fn_80053E10 = .text:0x80053E10; // type:function size:0x38 fn_80053E50 = .text:0x80053E50; // type:function size:0x20 -fn_80053E70 = .text:0x80053E70; // type:function size:0x50 -fn_80053EC0 = .text:0x80053EC0; // type:function size:0x68 -fn_80053F30 = .text:0x80053F30; // type:function size:0x34 -fn_80053F70 = .text:0x80053F70; // type:function size:0x14 -fn_80053F90 = .text:0x80053F90; // type:function size:0x14 -fn_80053FB0 = .text:0x80053FB0; // type:function size:0x18 -fn_80053FD0 = .text:0x80053FD0; // type:function size:0x18 -fn_80053FF0 = .text:0x80053FF0; // type:function size:0xB4 -fn_800540B0 = .text:0x800540B0; // type:function size:0xB4 -fn_80054170 = .text:0x80054170; // type:function size:0x58 -fn_800541D0 = .text:0x800541D0; // type:function size:0x1C +__ct__10dFontMng_cFv = .text:0x80053E70; // type:function size:0x50 +__dt__10dFontMng_cFv = .text:0x80053EC0; // type:function size:0x68 +getFont__10dFontMng_cFUc = .text:0x80053F30; // type:function size:0x34 +getFontName__FUc = .text:0x80053F70; // type:function size:0x14 +getFontManager__10dFontMng_cFi = .text:0x80053F90; // type:function size:0x14 +getFontMgrIdx__10dFontMng_cFUc = .text:0x80053FB0; // type:function size:0x18 +setFontFile__10dFontMng_cFiPv = .text:0x80053FD0; // type:function size:0x18 +getFontPath__10dFontMng_cFUc = .text:0x80053FF0; // type:function size:0xB4 +create__10dFontMng_cFv = .text:0x800540B0; // type:function size:0xB4 +__sinit_\d_font_manager_cpp = .text:0x80054170; // type:function size:0x58 scope:local +__arraydtor$4302 = .text:0x800541D0; // type:function size:0x1C scope:local fn_800541F0 = .text:0x800541F0; // type:function size:0xD4 fn_800542D0 = .text:0x800542D0; // type:function size:0x70 fn_80054340 = .text:0x80054340; // type:function size:0x54 @@ -27834,7 +27834,7 @@ lbl_804DCB24 = .rodata:0x804DCB24; // type:object size:0xCC DYNAMIC_NAME_TABLE = .rodata:0x804DCBF0; // type:object size:0x13E0 lbl_804DDFD0 = .rodata:0x804DDFD0; // type:object size:0xC data:4byte lbl_804DDFDC = .rodata:0x804DDFDC; // type:object size:0x14 data:4byte -lbl_804DDFF0 = .rodata:0x804DDFF0; // type:object size:0x18 +fontMgrIndex = .rodata:0x804DDFF0; // type:object size:0x14 @stringBase@ = .rodata:0x804DE008; // type:object size:0x28 scope:local data:string_table lbl_804DE030 = .rodata:0x804DE030; // type:object size:0x28 lbl_804DE058 = .rodata:0x804DE058; // type:object size:0x2C @@ -30700,11 +30700,14 @@ __vt__21dDynamicModuleControl = .data:0x8050D330; // type:object size:0xC lbl_8050D33C = .data:0x8050D33C; // type:object size:0xC lbl_8050D348 = .data:0x8050D348; // type:object size:0x10 lbl_8050D358 = .data:0x8050D358; // type:object size:0x10 data:string -lbl_8050D368 = .data:0x8050D368; // type:object size:0x14 -lbl_8050D37C = .data:0x8050D37C; // type:object size:0x24 +lbl_8050D368 = .data:0x8050D368; // type:object size:0x11 data:string +lbl_8050D37C = .data:0x8050D37C; // type:object size:0x11 data:string +systemFonts = .data:0x8050D390; // type:object size:0xC lbl_8050D3A0 = .data:0x8050D3A0; // type:object size:0x10 data:string -lbl_8050D3B0 = .data:0x8050D3B0; // type:object size:0x14 -lbl_8050D3C4 = .data:0x8050D3C4; // type:object size:0x7C +lbl_8050D3B0 = .data:0x8050D3B0; // type:object size:0x11 data:string +fonts = .data:0x8050D3C4; // type:object size:0x14 +lbl_8050D420 = .data:0x8050D420; // type:object size:0x9 data:string +lbl_8050D42C = .data:0x8050D42C; // type:object size:0xF data:string __vt__14dHeapAllocator = .data:0x8050D440; // type:object size:0x18 lbl_8050D458 = .data:0x8050D458; // type:object size:0xC data:string lbl_8050D464 = .data:0x8050D464; // type:object size:0x10 @@ -39740,7 +39743,7 @@ cCc_frmHeap__4dDyl = .sbss:0x805750F0; // type:object size:0x4 data:4byte Initialized__4dDyl = .sbss:0x805750F4; // type:object size:0x1 data:byte DVD__4dDyl = .sbss:0x805750F8; // type:object size:0x4 data:4byte lbl_80575100 = .sbss:0x80575100; // type:object size:0x8 data:byte -lbl_80575108 = .sbss:0x80575108; // type:object size:0x8 data:byte +@GUARD@getFontPath__10dFontMng_cFUc@TEMP_FONT_NAME = .sbss:0x80575108; // type:object size:0x1 data:byte lbl_80575110 = .sbss:0x80575110; // type:object size:0x8 data:4byte lbl_80575118 = .sbss:0x80575118; // type:object size:0x4 data:4byte lbl_8057511C = .sbss:0x8057511C; // type:object size:0x4 data:4byte @@ -48177,9 +48180,9 @@ lbl_8059752C = .bss:0x8059752C; // type:object size:0x74 data:4byte lbl_805975A0 = .bss:0x805975A0; // type:object size:0x10 data:float lbl_805975B0 = .bss:0x805975B0; // type:object size:0x10 lbl_805975C0 = .bss:0x805975C0; // type:object size:0x48 -lbl_80597608 = .bss:0x80597608; // type:object size:0x10 -lbl_80597618 = .bss:0x80597618; // type:object size:0xA8 -lbl_805976C0 = .bss:0x805976C0; // type:object size:0x80 data:byte +lbl_80597608 = .bss:0x80597608; // type:object size:0xC +l_dFontMng_obj = .bss:0x80597618; // type:object size:0xA8 +@LOCAL@getFontPath__10dFontMng_cFUc@TEMP_FONT_NAME = .bss:0x805976C0; // type:object size:0x80 data:byte sAllocator__14dHeapAllocator = .bss:0x80597740; // type:object size:0x18 data:4byte lbl_80597758 = .bss:0x80597758; // type:object size:0x318 lbl_80597A70 = .bss:0x80597A70; // type:object size:0x10 diff --git a/configure.py b/configure.py index 225657bc..68b625d6 100644 --- a/configure.py +++ b/configure.py @@ -311,6 +311,7 @@ def nw4rLib(lib_name, objects, extra_cflags=[]): Object(Matching, "d/d_dvd.cpp"), Object(NonMatching, "d/d_dvd_unk.cpp"), Object(NonMatching, "d/d_dylink.cpp"), + Object(Matching, "d/d_font_manager.cpp"), Object(NonMatching, "d/d_heap.cpp"), Object(Matching, "d/d_rawarchive.cpp"), Object(NonMatching, "d/d_stage.cpp"), diff --git a/include/d/d_font_manager.h b/include/d/d_font_manager.h new file mode 100644 index 00000000..8614f5a4 --- /dev/null +++ b/include/d/d_font_manager.h @@ -0,0 +1,35 @@ +#ifndef D_FONT_MANAGER_H +#define D_FONT_MANAGER_H + +#include +#include + + +class dFontMng_c { +public: + dFontMng_c(); + ~dFontMng_c(); + + static nw4r::ut::ResFont *getFont(u8 type); + void setFontFile(int idx, void *fileData); + static dFontMng_c *getFontManager(int idx); + static u8 getFontMgrIdx(u8 type); + static const char *getFontPath(u8 idx); + + static bool create(); + +private: + static char special_01[]; + static char special_00[]; + static char normal_01[]; + static char normal_00[]; + + nw4r::ut::ResFont mFont; + dDvd::loader_c mLoader; + // The purpose of these two is a bit unclear because they appear + // to be set to the same thing? + nw4r::ut::BinaryFileHeader *mpFontFile; + void *mpFileData; +}; + +#endif diff --git a/src/d/d_font_manager.cpp b/src/d/d_font_manager.cpp new file mode 100644 index 00000000..32f9a558 --- /dev/null +++ b/src/d/d_font_manager.cpp @@ -0,0 +1,77 @@ +#include +#include +#include + +static dFontMng_c l_dFontMng_obj[3]; + +static const char *systemFonts[] = {"normal_00.brfnt", "special_00.brfnt", "picture_00.brfnt"}; +static const char *fonts[] = {"normal_00.brfnt", "normal_01.brfnt", "special_00.brfnt", "special_01.brfnt", + "picture_00.brfnt"}; + +// TODO What's up with these? +char dFontMng_c::normal_01[] = "normal_01.brfnt"; +char dFontMng_c::normal_00[] = "normal_00.brfnt"; +char dFontMng_c::special_01[] = "special_01.brfnt"; +char dFontMng_c::special_00[] = "special_00.brfnt"; + +const u32 fontMgrIndex[] = {0, 0, 1, 1, 2}; + +dFontMng_c::dFontMng_c() { + l_dFontMng_obj[0].mpFileData = nullptr; + l_dFontMng_obj[1].mpFileData = nullptr; + l_dFontMng_obj[2].mpFileData = nullptr; +} + +dFontMng_c::~dFontMng_c() {} + +nw4r::ut::ResFont *dFontMng_c::getFont(u8 type) { + u8 index = getFontMgrIdx(type); + return &l_dFontMng_obj[index].mFont; +} + +const char *getFontName(u8 type) { + return fonts[type]; +} + +dFontMng_c *dFontMng_c::getFontManager(int idx) { + return &l_dFontMng_obj[idx]; +} + +u8 dFontMng_c::getFontMgrIdx(u8 type) { + return fontMgrIndex[type]; +} + +void dFontMng_c::setFontFile(int idx, void *fileData) { + l_dFontMng_obj[idx].mpFileData = fileData; +} + +// getUsedLanguageString +extern "C" const char *fn_801B2DB0(); + +const char *dFontMng_c::getFontPath(u8 idx) { + static SizedString<128> TEMP_FONT_NAME; + if (idx == 2) { + TEMP_FONT_NAME.sprintf("/Font/%s", systemFonts[idx]); + } else { + TEMP_FONT_NAME.sprintf("/US/Font/%s/%s", fn_801B2DB0(), systemFonts[idx]); + } + return &TEMP_FONT_NAME; +} + +bool dFontMng_c::create() { + for (u8 i = 0; i < 3; i++) { + if (l_dFontMng_obj[i].mpFontFile == nullptr) { + const char *path = getFontPath(i); + nw4r::ut::BinaryFileHeader *file = static_cast( + l_dFontMng_obj[i].mLoader.request(path, 0, dHeap::fontHeap.heap)); + if (file == nullptr) { + return false; + } + l_dFontMng_obj[i].mpFontFile = file; + getFontManager(i)->setFontFile(i, l_dFontMng_obj[i].mpFontFile); + l_dFontMng_obj[i].mFont.SetResource(l_dFontMng_obj[i].mpFontFile); + } + } + + return true; +}