diff options
Diffstat (limited to 'arm9/src/text.c')
-rw-r--r-- | arm9/src/text.c | 102 |
1 files changed, 81 insertions, 21 deletions
diff --git a/arm9/src/text.c b/arm9/src/text.c index 0379769f..ccc86bab 100644 --- a/arm9/src/text.c +++ b/arm9/src/text.c @@ -1,5 +1,6 @@ #include "text.h" #include "heap.h" +#include "string16.h" const struct FontInfo *gFonts = NULL; @@ -7,19 +8,24 @@ u8 UNK_021C5734[0x200]; u32 UNK_021C5714[8]; u8 UNK_021C570C[8]; -extern u32 FUN_0200CA7C(void *param0, u32 param1, u32 param2); -extern u16 AddTextPrinter(struct TextPrinterTemplate *template, u32 speed, void (*callback)(void *, u16)); +extern u32 FUN_0200CA7C(void *func, struct TextPrinter *printer, u32 param2); -extern void *FUN_0201B6C8(void); +extern struct TextPrinter *FUN_0201B6C8(void); extern void FUN_0200CAB4(u32 param0); -extern void FUN_0201C238(void); +extern void FUN_0201C238(struct TextPrinter *printer); + +extern u32 RenderFont(struct TextPrinter *printer); +extern void FUN_0201C1A8(struct TextPrinter *printer); +extern FUN_0201BFDC(); //no idea what this is +extern void FUN_0201C05C(u8 fgColor, u8 bgColor, u8 shadowColor); +extern void FUN_020191D0(u32 windowId); THUMB_FUNC void SetFontsPointer(const struct FontInfo *fonts) { gFonts = fonts; } -THUMB_FUNC u8 FUN_0201BCC8(void *param0, u32 param1, u32 param2) +THUMB_FUNC u8 FUN_0201BCC8(void *func, struct TextPrinter *printer, u32 param2) { u32 *r4 = UNK_021C5714; s32 i; @@ -29,7 +35,7 @@ THUMB_FUNC u8 FUN_0201BCC8(void *param0, u32 param1, u32 param2) { continue; } - UNK_021C5714[i] = FUN_0200CA7C(param0, param1, param2); + UNK_021C5714[i] = FUN_0200CA7C(func, printer, param2); if (UNK_021C5714[i] != 0) { break; @@ -52,11 +58,11 @@ THUMB_FUNC void FUN_0201BCFC(u32 param0) { return; } - void *r5 = FUN_0201B6C8(); - if (r5) + struct TextPrinter *printer = FUN_0201B6C8(); + if (printer) { - FUN_0201C238(); - FreeToHeap(r5); + FUN_0201C238(printer); + FreeToHeap((void *)printer); } FUN_0200CAB4(UNK_021C5714[param0]); UNK_021C5714[param0] = 0; @@ -85,7 +91,7 @@ THUMB_FUNC void FUN_0201BD7C(u32 param0) FUN_0201BCFC(param0); } -THUMB_FUNC u16 AddTextPrinterParameterized(u32 windowId, u8 fontId, const u8 *str, u32 x, u32 y, u32 speed, void (*callback)(void *, u16)) +THUMB_FUNC u16 AddTextPrinterParameterized(u32 windowId, u8 fontId, const u16 *str, u32 x, u32 y, u32 speed, void (*callback)(struct TextPrinterTemplate *, u16)) { struct TextPrinterTemplate printerTemplate; @@ -108,7 +114,7 @@ THUMB_FUNC u16 AddTextPrinterParameterized(u32 windowId, u8 fontId, const u8 *st return AddTextPrinter(&printerTemplate, speed, callback); } -THUMB_FUNC u16 AddTextPrinterParameterized2(u32 windowId, u8 fontId, const u8 *str, u32 x, u32 y, u32 speed, u32 colors, void (*callback)(void *, u16)) +THUMB_FUNC u16 AddTextPrinterParameterized2(u32 windowId, u8 fontId, const u16 *str, u32 x, u32 y, u32 speed, u32 colors, void (*callback)(struct TextPrinterTemplate *, u16)) { struct TextPrinterTemplate printerTemplate; @@ -122,16 +128,16 @@ THUMB_FUNC u16 AddTextPrinterParameterized2(u32 windowId, u8 fontId, const u8 *s printerTemplate.letterSpacing = gFonts[fontId].letterSpacing; printerTemplate.lineSpacing = gFonts[fontId].lineSpacing; printerTemplate.unk = gFonts[fontId].unk; - printerTemplate.fgColor = colors >> 16; - printerTemplate.shadowColor = colors >> 8; - printerTemplate.bgColor = colors; + printerTemplate.fgColor = (u8)(colors >> 16); + printerTemplate.shadowColor = (u8)(colors >> 8); + printerTemplate.bgColor = (u8)colors; printerTemplate.unk2 = 0; printerTemplate.unk3 = 0; printerTemplate.unk4 = 255; return AddTextPrinter(&printerTemplate, speed, callback); } -THUMB_FUNC u16 AddTextPrinterParameterized3(u32 windowId, u8 fontId, const u8 *str, u32 x, u32 y, u32 speed, u32 colors, u32 letterSpacing, u32 lineSpacing, void (*callback)(void *, u16)) +THUMB_FUNC u16 AddTextPrinterParameterized3(u32 windowId, u8 fontId, const u16 *str, u32 x, u32 y, u32 speed, u32 colors, u32 letterSpacing, u32 lineSpacing, void (*callback)(struct TextPrinterTemplate *, u16)) { struct TextPrinterTemplate printerTemplate; @@ -142,14 +148,68 @@ THUMB_FUNC u16 AddTextPrinterParameterized3(u32 windowId, u8 fontId, const u8 *s printerTemplate.y = (u8)y; printerTemplate.currentX = (u8)x; printerTemplate.currentY = (u8)y; - printerTemplate.letterSpacing = letterSpacing; - printerTemplate.lineSpacing = lineSpacing; + printerTemplate.letterSpacing = (u8)letterSpacing; + printerTemplate.lineSpacing = (u8)lineSpacing; printerTemplate.unk = gFonts[fontId].unk; - printerTemplate.fgColor = colors >> 16; - printerTemplate.shadowColor = colors >> 8; - printerTemplate.bgColor = colors; + printerTemplate.fgColor = (u8)(colors >> 16); + printerTemplate.shadowColor = (u8)(colors >> 8); + printerTemplate.bgColor = (u8)colors; printerTemplate.unk2 = 0; printerTemplate.unk3 = 0; printerTemplate.unk4 = 255; return AddTextPrinter(&printerTemplate, speed, callback); } + +THUMB_FUNC u16 AddTextPrinter(struct TextPrinterTemplate *printerTemplate, u32 speed, void (*callback)(struct TextPrinterTemplate *, u16)) +{ + if (!gFonts) + return 0xff; + + struct TextPrinter *printer = (struct TextPrinter *)AllocFromHeap(0, sizeof(struct TextPrinter)); + + printer->active = TRUE; + printer->state = 0; + printer->textSpeedBottom = (u8)speed; + printer->delayCounter = 0; + printer->scrollDistance = 0; + printer->japanese = 0; + + for (s32 i = 0; i < 7; i++) + { + printer->subStructFields[i] = 0; + } + + printer->printerTemplate = *printerTemplate; + printer->printerTemplate.currentChar = String_c_str((struct String *)printer->printerTemplate.currentChar); //TODO clean up + printer->callback = callback; + UNK_021C570C[0] = 0; + FUN_0201C1A8(printer); + if (speed != 0xff && speed != 0) + { + printer->textSpeedBottom += 0xff; + printer->textSpeedTop = 1; + printer->minLetterSpacing = FUN_0201BCC8(FUN_0201BFDC, printer, 1); + return printer->minLetterSpacing; + } + else + { + u32 j = 0; + printer->textSpeedBottom = 0; + printer->textSpeedTop = 0; + FUN_0201C05C(printerTemplate->fgColor, printerTemplate->bgColor, printerTemplate->shadowColor); //GenerateFontHalfRowLookupTable ? + for (; j < 0x400; ++j) + { + if (RenderFont(printer) == 1) + { + break; + } + } + if (speed != 0xff) + { + FUN_020191D0(printer->printerTemplate.windowId); // CopyWindowToVram? + } + FUN_0201C238(printer); + FreeToHeap((void *)printer); + return 8; + } +} |