summaryrefslogtreecommitdiff
path: root/src/boot_O2
diff options
context:
space:
mode:
authorDerek Hensley <hensley.derek58@gmail.com>2022-06-18 18:56:10 -0700
committerGitHub <noreply@github.com>2022-06-19 02:56:10 +0100
commit271b7c78276f7488f4c75328d79364f3a1cd423d (patch)
tree6cfe906c1a896365d0be1eec7e26b6920a0a1a17 /src/boot_O2
parent03ba9178537f722c2670e69fbb3d3a677f896f57 (diff)
Gfxprint OK (#826)
* Match last two functions as well as some cleanup * One more small cleanup * Reviews * format * Move internal GFXP_FLAG defines to c file * Format
Diffstat (limited to 'src/boot_O2')
-rw-r--r--src/boot_O2/gfxprint.c192
1 files changed, 120 insertions, 72 deletions
diff --git a/src/boot_O2/gfxprint.c b/src/boot_O2/gfxprint.c
index a6f84a7a4..557887abd 100644
--- a/src/boot_O2/gfxprint.c
+++ b/src/boot_O2/gfxprint.c
@@ -1,50 +1,50 @@
#include "global.h"
+#define GFXP_FLAG_HIRAGANA (1 << 0)
+#define GFXP_FLAG_RAINBOW (1 << 1)
+#define GFXP_FLAG_SHADOW (1 << 2)
+#define GFXP_FLAG_UPDATE (1 << 3)
+#define GFXP_FLAG_ENLARGE (1 << 6)
+#define GFXP_FLAG_OPEN (1 << 7)
+
+//! TODO: Need to extract
extern u16 sGfxPrintFontTLUT[64];
-extern u16 sGfxPrintUnkTLUT[16];
-extern u8 sGfxPrintUnkData[8];
+extern u16 sGfxPrintRainbowTLUT[16];
+extern u8 sGfxPrintRainbowData[8];
extern u8 sGfxPrintFontData[2048];
-#define gDPSetPrimColorMod(pkt, m, l, rgba) \
- { \
- Gfx* _g = (Gfx*)(pkt); \
- \
- _g->words.w0 = (_SHIFTL(G_SETPRIMCOLOR, 24, 8) | _SHIFTL(m, 8, 8) | _SHIFTL(l, 0, 8)); \
- _g->words.w1 = (rgba); \
- }
-
-void GfxPrint_InitDlist(GfxPrint* this) {
+void GfxPrint_Setup(GfxPrint* this) {
s32 width = 16;
s32 height = 256;
s32 i;
- gDPPipeSync(this->dlist++);
- gDPSetOtherMode(this->dlist++,
+ gDPPipeSync(this->dList++);
+ gDPSetOtherMode(this->dList++,
G_AD_DISABLE | G_CD_DISABLE | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_IA16 | G_TL_TILE |
G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
G_AC_NONE | G_ZS_PRIM | G_RM_XLU_SURF | G_RM_XLU_SURF2);
- gDPSetCombineMode(this->dlist++, G_CC_DECALRGBA, G_CC_DECALRGBA);
- gDPLoadTextureBlock_4b(this->dlist++, sGfxPrintFontData, G_IM_FMT_CI, width, height, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ gDPSetCombineMode(this->dList++, G_CC_DECALRGBA, G_CC_DECALRGBA);
+ gDPLoadTextureBlock_4b(this->dList++, sGfxPrintFontData, G_IM_FMT_CI, width, height, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
- gDPLoadTLUT(this->dlist++, 64, 256, sGfxPrintFontTLUT);
+ gDPLoadTLUT(this->dList++, 64, 256, sGfxPrintFontTLUT);
for (i = 1; i < 4; i++) {
- gDPSetTile(this->dlist++, G_IM_FMT_CI, G_IM_SIZ_4b, 1, 0, i * 2, i, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK,
+ gDPSetTile(this->dList++, G_IM_FMT_CI, G_IM_SIZ_4b, 1, 0, i * 2, i, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK,
G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
- gDPSetTileSize(this->dlist++, i * 2, 0, 0, 60, 1020);
+ gDPSetTileSize(this->dList++, i * 2, 0, 0, 60, 1020);
}
- gDPSetPrimColorMod(this->dlist++, 0, 0, this->color.rgba);
+ gDPSetColor(this->dList++, G_SETPRIMCOLOR, this->color.rgba);
- gDPLoadMultiTile_4b(this->dlist++, sGfxPrintUnkData, 0, 1, G_IM_FMT_CI, 2, 8, 0, 0, 1, 7, 4,
+ gDPLoadMultiTile_4b(this->dList++, sGfxPrintRainbowData, 0, 1, G_IM_FMT_CI, 2, 8, 0, 0, 1, 7, 4,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 1, 3, G_TX_NOLOD, G_TX_NOLOD);
- gDPLoadTLUT(this->dlist++, 16, 320, sGfxPrintUnkTLUT);
+ gDPLoadTLUT(this->dList++, 16, 320, sGfxPrintRainbowTLUT);
for (i = 1; i < 4; i++) {
- gDPSetTile(this->dlist++, G_IM_FMT_CI, G_IM_SIZ_4b, 1, 0, i * 2 + 1, 4, G_TX_NOMIRROR | G_TX_WRAP, 3,
+ gDPSetTile(this->dList++, G_IM_FMT_CI, G_IM_SIZ_4b, 1, 0, i * 2 + 1, 4, G_TX_NOMIRROR | G_TX_WRAP, 3,
G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, 1, G_TX_NOLOD);
- gDPSetTileSize(this->dlist++, i * 2 + 1, 0, 0, 4, 28);
+ gDPSetTileSize(this->dList++, i * 2 + 1, 0, 0, 4, 28);
}
}
@@ -53,8 +53,8 @@ void GfxPrint_SetColor(GfxPrint* this, u32 r, u32 g, u32 b, u32 a) {
this->color.g = g;
this->color.b = b;
this->color.a = a;
- gDPPipeSync(this->dlist++);
- gDPSetPrimColorMod(this->dlist++, 0, 0, this->color.rgba);
+ gDPPipeSync(this->dList++);
+ gDPSetColor(this->dList++, G_SETPRIMCOLOR, this->color.rgba);
}
void GfxPrint_SetPosPx(GfxPrint* this, s32 x, s32 y) {
@@ -71,108 +71,156 @@ void GfxPrint_SetBasePosPx(GfxPrint* this, s32 x, s32 y) {
this->baseY = y << 2;
}
-/* regalloc in the final gSPTextureRectangle */
-#ifdef NON_MATCHING
void GfxPrint_PrintCharImpl(GfxPrint* this, u8 c) {
u32 tile = (c & 0xFF) * 2;
-
- if (this->flag & GFXPRINT_UPDATE_MODE) {
- this->flag &= ~GFXPRINT_UPDATE_MODE;
-
- gDPPipeSync(this->dlist++);
- if (this->flag & GFXPRINT_USE_RGBA16) {
- gDPSetTextureLUT(this->dlist++, G_TT_RGBA16);
- gDPSetCycleType(this->dlist++, G_CYC_2CYCLE);
- gDPSetRenderMode(this->dlist++, G_RM_OPA_CI, G_RM_XLU_SURF2);
- gDPSetCombineMode(this->dlist++, G_CC_INTERFERENCE, G_CC_PASS2);
+ u16 s = c & 4;
+ u16 t = c >> 3;
+
+ if (this->flags & GFXP_FLAG_UPDATE) {
+ this->flags &= ~GFXP_FLAG_UPDATE;
+
+ gDPPipeSync(this->dList++);
+ if (this->flags & GFXP_FLAG_RAINBOW) {
+ gDPSetTextureLUT(this->dList++, G_TT_RGBA16);
+ gDPSetCycleType(this->dList++, G_CYC_2CYCLE);
+ gDPSetRenderMode(this->dList++, G_RM_OPA_CI, G_RM_XLU_SURF2);
+ gDPSetCombineMode(this->dList++, G_CC_INTERFERENCE, G_CC_PASS2);
} else {
- gDPSetTextureLUT(this->dlist++, G_TT_IA16);
- gDPSetCycleType(this->dlist++, G_CYC_1CYCLE);
- gDPSetRenderMode(this->dlist++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
- gDPSetCombineMode(this->dlist++, G_CC_MODULATEIDECALA_PRIM, G_CC_MODULATEIDECALA_PRIM);
+ gDPSetTextureLUT(this->dList++, G_TT_IA16);
+ gDPSetCycleType(this->dList++, G_CYC_1CYCLE);
+ gDPSetRenderMode(this->dList++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
+ gDPSetCombineMode(this->dList++, G_CC_MODULATEIDECALA_PRIM, G_CC_MODULATEIDECALA_PRIM);
}
}
- if (this->flag & GFXPRINT_FLAG4) {
- gDPSetPrimColorMod(this->dlist++, 0, 0, 0);
+ if (this->flags & GFXP_FLAG_SHADOW) {
+ gDPSetColor(this->dList++, G_SETPRIMCOLOR, 0);
- gSPTextureRectangle(this->dlist++, this->posX + 4, this->posY + 4, this->posX + 4 + 32, this->posY + 4 + 32,
- (c & 3) << 1, (u16)(c & 4) * 64, (u16)(c >> 3) * 256, 1024, 1024);
+ gSPTextureRectangle(this->dList++, this->posX + 4, this->posY + 4, this->posX + 4 + 32, this->posY + 4 + 32,
+ tile, s << 6, t << 8, 1 << 10, 1 << 10);
- gDPSetPrimColorMod(this->dlist++, 0, 0, this->color.rgba);
+ gDPSetColor(this->dList++, G_SETPRIMCOLOR, this->color.rgba);
}
- gSPTextureRectangle(this->dlist++, this->posX, this->posY, this->posX + 32, this->posY + 32, (u16)(tile & 7),
- (u16)(c & 4) * 64, (u16)(c >> 3) * 256, 1024, 1024);
+ gSPTextureRectangle(this->dList++, this->posX, this->posY, this->posX + 32, this->posY + 32, tile, s << 6, t << 8,
+ 1 << 10, 1 << 10);
this->posX += 32;
}
-#else
-#pragma GLOBAL_ASM("asm/non_matchings/boot/gfxprint/GfxPrint_PrintCharImpl.s")
-#endif
-#pragma GLOBAL_ASM("asm/non_matchings/boot/gfxprint/GfxPrint_PrintChar.s")
+void GfxPrint_PrintChar(GfxPrint* this, u8 c) {
+ if (c == ' ') {
+ this->posX += 32;
+ } else if (c > ' ' && c < 0x7F) {
+ GfxPrint_PrintCharImpl(this, c);
+ } else if (c >= 0xA0 && c < 0xE0) {
+ if (this->flags & GFXP_FLAG_HIRAGANA) {
+ if (c < 0xC0) {
+ c -= 0x20;
+ } else {
+ c += 0x20;
+ }
+ }
+ GfxPrint_PrintCharImpl(this, c);
+ } else {
+ switch (c) {
+ case '\0':
+ break;
+ case '\n':
+ this->posY += 32;
+ case '\r':
+ this->posX = this->baseX;
+ break;
+ case '\t':
+ do {
+ GfxPrint_PrintCharImpl(this, ' ');
+ } while ((this->posX - this->baseX) % 256);
+ break;
+ case GFXP_HIRAGANA_CHAR:
+ this->flags |= GFXP_FLAG_HIRAGANA;
+ break;
+ case GFXP_KATAKANA_CHAR:
+ this->flags &= ~GFXP_FLAG_HIRAGANA;
+ break;
+ case GFXP_RAINBOW_ON_CHAR:
+ this->flags |= GFXP_FLAG_RAINBOW;
+ this->flags |= GFXP_FLAG_UPDATE;
+ break;
+ case GFXP_RAINBOW_OFF_CHAR:
+ this->flags &= ~GFXP_FLAG_RAINBOW;
+ this->flags |= GFXP_FLAG_UPDATE;
+ break;
+ case GFXP_UNUSED_CHAR:
+ default:
+ break;
+ }
+ }
+}
void GfxPrint_PrintStringWithSize(GfxPrint* this, const void* buffer, size_t charSize, size_t charCount) {
const char* str = (const char*)buffer;
size_t count = charSize * charCount;
- while (count) {
+ while (count != 0) {
GfxPrint_PrintChar(this, *str++);
count--;
}
}
void GfxPrint_PrintString(GfxPrint* this, const char* str) {
- while (*str) {
- GfxPrint_PrintChar(this, *(str++));
+ while (*str != '\0') {
+ GfxPrint_PrintChar(this, *str++);
}
}
-GfxPrint* GfxPrint_Callback(GfxPrint* this, const char* str, size_t size) {
+void* GfxPrint_Callback(void* arg, const char* str, size_t size) {
+ GfxPrint* this = arg;
+
GfxPrint_PrintStringWithSize(this, str, sizeof(char), size);
+
return this;
}
void GfxPrint_Init(GfxPrint* this) {
- this->flag &= ~GFXPRINT_OPEN;
+ this->flags &= ~GFXP_FLAG_OPEN;
this->callback = GfxPrint_Callback;
-
- this->dlist = NULL;
+ this->dList = NULL;
this->posX = 0;
this->posY = 0;
this->baseX = 0;
this->baseY = 0;
this->color.rgba = 0;
- this->flag &= ~GFXPRINT_FLAG1;
- this->flag &= ~GFXPRINT_USE_RGBA16;
- this->flag |= GFXPRINT_FLAG4;
- this->flag |= GFXPRINT_UPDATE_MODE;
+
+ this->flags &= ~GFXP_FLAG_HIRAGANA;
+ this->flags &= ~GFXP_FLAG_RAINBOW;
+ this->flags |= GFXP_FLAG_SHADOW;
+ this->flags |= GFXP_FLAG_UPDATE;
}
void GfxPrint_Destroy(GfxPrint* this) {
}
-void GfxPrint_Open(GfxPrint* this, Gfx* dlist) {
- if (!(this->flag & GFXPRINT_OPEN)) {
- this->flag |= GFXPRINT_OPEN;
- this->dlist = dlist;
- GfxPrint_InitDlist(this);
+void GfxPrint_Open(GfxPrint* this, Gfx* dList) {
+ if (!(this->flags & GFXP_FLAG_OPEN)) {
+ this->flags |= GFXP_FLAG_OPEN;
+ this->dList = dList;
+ GfxPrint_Setup(this);
}
}
Gfx* GfxPrint_Close(GfxPrint* this) {
Gfx* ret;
- this->flag &= ~GFXPRINT_OPEN;
- ret = this->dlist;
- this->dlist = NULL;
+ this->flags &= ~GFXP_FLAG_OPEN;
+ ret = this->dList;
+ this->dList = NULL;
+
return ret;
}
s32 GfxPrint_VPrintf(GfxPrint* this, const char* fmt, va_list args) {
- return PrintUtils_VPrintf((PrintCallback*)&this->callback, fmt, args);
+ return PrintUtils_VPrintf(&this->callback, fmt, args);
}
s32 GfxPrint_Printf(GfxPrint* this, const char* fmt, ...) {