summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsceptillion <33798691+sceptillion@users.noreply.github.com>2017-12-18 13:14:49 -0800
committersceptillion <33798691+sceptillion@users.noreply.github.com>2017-12-18 13:14:49 -0800
commitf70d7efa6638c428885756405800aa022fb339da (patch)
treec314815a5a99184a866fff4cc671ae367f4311b0 /src
parentd1437d30f7e6071f62d1a7842400d6732c7313b7 (diff)
partially decompile text_printer
Diffstat (limited to 'src')
-rw-r--r--src/bg.c2
-rw-r--r--src/text_printer.c216
2 files changed, 217 insertions, 1 deletions
diff --git a/src/bg.c b/src/bg.c
index 86c95b953..b7da03dc6 100644
--- a/src/bg.c
+++ b/src/bg.c
@@ -53,7 +53,7 @@ void ResetBgs(void)
SetTextModeAndHideBgs();
}
-static void SetBgModeInternal(u8 bgMode)
+void SetBgModeInternal(u8 bgMode)
{
sGpuBgConfigs.bgVisibilityAndMode &= 0xFFF8;
sGpuBgConfigs.bgVisibilityAndMode |= bgMode;
diff --git a/src/text_printer.c b/src/text_printer.c
new file mode 100644
index 000000000..95de6fbbd
--- /dev/null
+++ b/src/text_printer.c
@@ -0,0 +1,216 @@
+#include "global.h"
+#include "main.h"
+#include "palette.h"
+#include "string_util.h"
+#include "window.h"
+#include "text.h"
+
+static EWRAM_DATA struct TextPrinter sTempTextPrinter = {0};
+static EWRAM_DATA struct TextPrinter sTextPrinters[NUM_TEXT_PRINTERS] = {0};
+
+static u16 sFontHalfRowLookupTable[0x51];
+static u16 sLastTextBgColor;
+static u16 sLastTextFgColor;
+static u16 sLastTextShadowColor;
+
+const struct FontInfo *gFonts;
+u32 gGlyphBuffer1[8];
+u32 gGlyphBuffer2[8];
+u32 gGlyphBuffer3[8];
+u32 gGlyphBuffer4[8];
+
+static const u8 sFontHalfRowOffsets[] =
+{
+ 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00,
+ 0x09, 0x0A, 0x0B, 0x09, 0x0C, 0x0D, 0x0E, 0x0C, 0x0F, 0x10, 0x11, 0x0F, 0x09, 0x0A, 0x0B, 0x09,
+ 0x12, 0x13, 0x14, 0x12, 0x15, 0x16, 0x17, 0x15, 0x18, 0x19, 0x1A, 0x18, 0x12, 0x13, 0x14, 0x12,
+ 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00,
+ 0x1B, 0x1C, 0x1D, 0x1B, 0x1E, 0x1F, 0x20, 0x1E, 0x21, 0x22, 0x23, 0x21, 0x1B, 0x1C, 0x1D, 0x1B,
+ 0x24, 0x25, 0x26, 0x24, 0x27, 0x28, 0x29, 0x27, 0x2A, 0x2B, 0x2C, 0x2A, 0x24, 0x25, 0x26, 0x24,
+ 0x2D, 0x2E, 0x2F, 0x2D, 0x30, 0x31, 0x32, 0x30, 0x33, 0x34, 0x35, 0x33, 0x2D, 0x2E, 0x2F, 0x2D,
+ 0x1B, 0x1C, 0x1D, 0x1B, 0x1E, 0x1F, 0x20, 0x1E, 0x21, 0x22, 0x23, 0x21, 0x1B, 0x1C, 0x1D, 0x1B,
+ 0x36, 0x37, 0x38, 0x36, 0x39, 0x3A, 0x3B, 0x39, 0x3C, 0x3D, 0x3E, 0x3C, 0x36, 0x37, 0x38, 0x36,
+ 0x3F, 0x40, 0x41, 0x3F, 0x42, 0x43, 0x44, 0x42, 0x45, 0x46, 0x47, 0x45, 0x3F, 0x40, 0x41, 0x3F,
+ 0x48, 0x49, 0x4A, 0x48, 0x4B, 0x4C, 0x4D, 0x4B, 0x4E, 0x4F, 0x50, 0x4E, 0x48, 0x49, 0x4A, 0x48,
+ 0x36, 0x37, 0x38, 0x36, 0x39, 0x3A, 0x3B, 0x39, 0x3C, 0x3D, 0x3E, 0x3C, 0x36, 0x37, 0x38, 0x36,
+ 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00,
+ 0x09, 0x0A, 0x0B, 0x09, 0x0C, 0x0D, 0x0E, 0x0C, 0x0F, 0x10, 0x11, 0x0F, 0x09, 0x0A, 0x0B, 0x09,
+ 0x12, 0x13, 0x14, 0x12, 0x15, 0x16, 0x17, 0x15, 0x18, 0x19, 0x1A, 0x18, 0x12, 0x13, 0x14, 0x12,
+ 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00
+};
+
+void SetFontsPointer(const struct FontInfo *fonts)
+{
+ gFonts = fonts;
+}
+
+void DeactivateAllTextPrinters (void)
+{
+ int printer;
+ for (printer = 0; printer < NUM_TEXT_PRINTERS; ++printer)
+ sTextPrinters[printer].sub_union.sub.active = 0;
+}
+
+u16 PrintTextOnWindow(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextSubPrinter *, u16))
+{
+ struct TextSubPrinter subPrinter;
+
+ subPrinter.current_text_offset = str;
+ subPrinter.windowId = windowId;
+ subPrinter.fontId = fontId;
+ subPrinter.x = x;
+ subPrinter.y = y;
+ subPrinter.currentX = x;
+ subPrinter.currentY = y;
+ subPrinter.letterSpacing = gFonts[fontId].letterSpacing;
+ subPrinter.lineSpacing = gFonts[fontId].lineSpacing;
+ subPrinter.fontColor_l = gFonts[fontId].fontColor_l;
+ subPrinter.fontColor_h = gFonts[fontId].fontColor_h;
+ subPrinter.bgColor = gFonts[fontId].bgColor;
+ subPrinter.shadowColor = gFonts[fontId].shadowColor;
+ return AddTextPrinter(&subPrinter, speed, callback);
+}
+
+bool16 AddTextPrinter(struct TextSubPrinter *textSubPrinter, u8 speed, void (*callback)(struct TextSubPrinter *, u16))
+{
+ int i;
+ u16 j;
+
+ if (!gFonts)
+ return FALSE;
+
+ sTempTextPrinter.sub_union.sub.active = 1;
+ sTempTextPrinter.state = 0;
+ sTempTextPrinter.text_speed = speed;
+ sTempTextPrinter.delayCounter = 0;
+ sTempTextPrinter.scrollDistance = 0;
+
+ for (i = 0; i < 7; ++i)
+ {
+ sTempTextPrinter.sub_union.sub_fields[i] = 0;
+ }
+
+ sTempTextPrinter.subPrinter = *textSubPrinter;
+ sTempTextPrinter.callback = callback;
+ sTempTextPrinter.minLetterSpacing = 0;
+ sTempTextPrinter.japanese = 0;
+
+ GenerateFontHalfRowLookupTable(textSubPrinter->fontColor_h, textSubPrinter->bgColor, textSubPrinter->shadowColor);
+ if (speed != TEXT_SPEED_FF && speed != 0x0)
+ {
+ --sTempTextPrinter.text_speed;
+ sTextPrinters[textSubPrinter->windowId] = sTempTextPrinter;
+ }
+ else
+ {
+ sTempTextPrinter.text_speed = 0;
+ for (j = 0; j < 0x400; ++j)
+ {
+ if ((u32)RenderFont(&sTempTextPrinter) == 1)
+ break;
+ }
+
+ if (speed != TEXT_SPEED_FF)
+ CopyWindowToVram(sTempTextPrinter.subPrinter.windowId, 2);
+ sTextPrinters[textSubPrinter->windowId].sub_union.sub.active = 0;
+ }
+ return TRUE;
+}
+
+void RunTextPrinters(void)
+{
+ int i;
+ u16 temp;
+
+ for (i = 0; i < 0x20; ++i)
+ {
+ if (sTextPrinters[i].sub_union.sub.active != 0)
+ {
+ temp = RenderFont(&sTextPrinters[i]);
+ switch (temp) {
+ case 0:
+ CopyWindowToVram(sTextPrinters[i].subPrinter.windowId, 2);
+ case 3:
+ if (sTextPrinters[i].callback != 0)
+ sTextPrinters[i].callback(&sTextPrinters[i].subPrinter, temp);
+ break;
+ case 1:
+ sTextPrinters[i].sub_union.sub.active = 0;
+ break;
+ }
+ }
+ }
+}
+
+bool16 IsTextPrinterActive(u8 id)
+{
+ return sTextPrinters[id].sub_union.sub.active;
+}
+
+u32 RenderFont(struct TextPrinter *textPrinter)
+{
+ u32 ret;
+ while (TRUE)
+ {
+ ret = gFonts[textPrinter->subPrinter.fontId].fontFunction(textPrinter);
+ if (ret != 2)
+ return ret;
+ }
+}
+
+void GenerateFontHalfRowLookupTable(u8 fgColor, u8 bgColor, u8 shadowColor)
+{
+ int lutIndex;
+ int i, j, k, l;
+ const u32 colors[] = {bgColor, fgColor, shadowColor};
+
+ sLastTextBgColor = bgColor;
+ sLastTextFgColor = fgColor;
+ sLastTextShadowColor = shadowColor;
+
+ lutIndex = 0;
+
+ for (i = 0; i < 3; i++)
+ for (j = 0; j < 3; j++)
+ for (k = 0; k < 3; k++)
+ for (l = 0; l < 3; l++)
+ sFontHalfRowLookupTable[lutIndex++] = (colors[l] << 12) | (colors[k] << 8) | (colors[j] << 4) | colors[i];
+}
+
+void SaveTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor)
+{
+ *bgColor = sLastTextBgColor;
+ *fgColor = sLastTextFgColor;
+ *shadowColor = sLastTextShadowColor;
+}
+
+void RestoreTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor)
+{
+ GenerateFontHalfRowLookupTable(*fgColor, *bgColor, *shadowColor);
+}
+
+void DecompressGlyphTile(const u16 *src, u16 *dest)
+{
+ int i;
+
+ for (i = 0; i < 16; i++)
+ {
+ int offsetIndex = (i << 31) ? (u8)*src++ : (*src >> 8);
+ dest[i] = sFontHalfRowLookupTable[sFontHalfRowOffsets[offsetIndex]];
+ }
+}
+
+u8 GetLastTextColor(u8 colorType)
+{
+ switch (colorType)
+ {
+ case 0:
+ return sLastTextFgColor;
+ case 2:
+ return sLastTextBgColor;
+ case 1:
+ return sLastTextShadowColor;
+ default:
+ return 0;
+ }
+}