diff --git a/libs/JSystem/include/JSystem/JUtility/JUTCacheFont.h b/libs/JSystem/include/JSystem/JUtility/JUTCacheFont.h index 2e089b7cc4..6c4b0b14fc 100644 --- a/libs/JSystem/include/JSystem/JUtility/JUTCacheFont.h +++ b/libs/JSystem/include/JSystem/JUtility/JUTCacheFont.h @@ -55,7 +55,11 @@ public: void prepend(JUTCacheFont::TGlyphCacheInfo*); virtual ~JUTCacheFont(); +#if TARGET_PC + virtual void loadImage(int, GXTexMapID FONT_DRAW_CTX); +#else virtual void loadImage(int, GXTexMapID); +#endif virtual void setBlock(); void setPagingType(EPagingType type) { mPagingType = type; } diff --git a/libs/JSystem/src/JUtility/JUTCacheFont.cpp b/libs/JSystem/src/JUtility/JUTCacheFont.cpp index 81b9f252f1..2282361672 100644 --- a/libs/JSystem/src/JUtility/JUTCacheFont.cpp +++ b/libs/JSystem/src/JUtility/JUTCacheFont.cpp @@ -203,7 +203,7 @@ bool JUTCacheFont::allocArea(void* cacheBuffer, u32 param_1, JKRHeap* heap) { } } - field_0x94 = mMaxSheetSize + 0x40; + field_0x94 = mMaxSheetSize + sizeof(TCachePage); mCachePage = param_1 / field_0x94; u32 v1 = field_0x94 * mCachePage; if (mCachePage == 0) { @@ -346,7 +346,23 @@ void JUTCacheFont::getGlyphFromAram(JUTCacheFont::TGlyphCacheInfo* param_0, JUTCacheFont::TCachePage* pCachePage, int* param_2, int* param_3) { TGlyphCacheInfo* pGylphCacheInfo = pCachePage; int* r30 = param_2; +#if TARGET_PC + // TODO: proper fix to account for 64bit ptr sizes + ResFONT::GLY1* glyph = (ResFONT::GLY1*)param_0; + pGylphCacheInfo->field_0x8 = glyph->startCode; + pGylphCacheInfo->field_0xa = glyph->endCode; + pGylphCacheInfo->field_0xc = glyph->cellWidth; + pGylphCacheInfo->field_0xe = glyph->cellHeight; + pGylphCacheInfo->field_0x10 = glyph->textureSize; + pGylphCacheInfo->mTexFormat = glyph->textureFormat; + pGylphCacheInfo->field_0x16 = glyph->numRows; + pGylphCacheInfo->field_0x18 = glyph->numColumns; + pGylphCacheInfo->mWidth = glyph->textureWidth; + pGylphCacheInfo->mHeight = glyph->textureHeight; + pGylphCacheInfo->field_0x1e = 0; +#else memcpy(pGylphCacheInfo, param_0, sizeof(TGlyphCacheInfo)); +#endif prepend(pGylphCacheInfo); int iVar3 = pGylphCacheInfo->field_0x16 * pGylphCacheInfo->field_0x18; int iVar2 = *r30 / iVar3; @@ -364,7 +380,11 @@ void JUTCacheFont::getGlyphFromAram(JUTCacheFont::TGlyphCacheInfo* param_0, GX_ANISO_1); } +#if TARGET_PC +void JUTCacheFont::loadImage(int param_0, GXTexMapID texMapId FONT_DRAW_CTX) { +#else void JUTCacheFont::loadImage(int param_0, GXTexMapID texMapId) { +#endif TCachePage* cachePage = loadCache_char_subroutine(¶m_0, false); if (cachePage != NULL) { mWidth = cachePage->field_0xc * (param_0 % (int)cachePage->field_0x16); @@ -421,6 +441,16 @@ JUTCacheFont::TCachePage* JUTCacheFont::loadCache_char_subroutine(int* param_0, } void JUTCacheFont::invalidiateAllCache() { +#if TARGET_PC + u8* cacheBuffer = (u8*)mCacheBuffer; + for (int i = 0; i < mCachePage; i++) { + TGlyphCacheInfo* current = (TGlyphCacheInfo*)cacheBuffer; + current->mPrev = i == 0 ? NULL : (TGlyphCacheInfo*)(cacheBuffer - field_0x94); + current->mNext = i == mCachePage - 1 ? NULL : (TGlyphCacheInfo*)(cacheBuffer + field_0x94); + cacheBuffer = cacheBuffer + field_0x94; + } + field_0xa8 = (intptr_t)cacheBuffer - field_0x94; +#else int* cacheBuffer = (int*)mCacheBuffer; for (int i = 0; i < mCachePage; i++) { *cacheBuffer = i == 0 ? 0 : (intptr_t)cacheBuffer - field_0x94; @@ -428,6 +458,7 @@ void JUTCacheFont::invalidiateAllCache() { cacheBuffer = (int*)((intptr_t)cacheBuffer + field_0x94); } field_0xa8 = (intptr_t)cacheBuffer - field_0x94; +#endif field_0xa4 = (TGlyphCacheInfo*)mCacheBuffer; field_0x9c = NULL; field_0xa0 = NULL; diff --git a/libs/JSystem/src/JUtility/JUTResFont.cpp b/libs/JSystem/src/JUtility/JUTResFont.cpp index 02b59aa739..4ec23dff44 100644 --- a/libs/JSystem/src/JUtility/JUTResFont.cpp +++ b/libs/JSystem/src/JUtility/JUTResFont.cpp @@ -7,6 +7,8 @@ #include "JSystem/JUtility/JUTConsole.h" #include +#include "dusk/version.hpp" + JUTResFont::JUTResFont() { initialize_state(); JUTFont::initialize_state(); @@ -68,8 +70,16 @@ void JUTResFont::initJoinedTexture() { int pageCount = 0; u32 pageNumCells = block.numRows * block.numColumns; - for (u32 code = block.startCode; code < block.endCode; code += pageNumCells) { - pageCount += 1; + + if (dusk::version::getGameVersion() == dusk::version::GameVersion::GcnJpn) { + pageCount = 1; + if (pageNumCells > 0 && block.endCode > block.startCode) { + pageCount = (block.endCode - block.startCode + pageNumCells - 1) / pageNumCells; + } + } else { + for (u32 code = block.startCode; code < block.endCode; code += pageNumCells) { + pageCount += 1; + } } mJoinedTextureHeight = block.textureHeight * pageCount; @@ -273,12 +283,19 @@ f32 JUTResFont::drawChar_scale(f32 pos_x, f32 pos_y, f32 scale_x, f32 scale_y, i u16 texW = mpGlyphBlocks[field_0x66]->textureWidth; #if TARGET_PC - u16 texH = mJoinedTextureHeight; + // JUTCacheFont does not set mJoinedTextureHeight (it uses per-page textures via loadImage override). + // Fall back to the individual glyph block's textureHeight in that case. + u16 texH = mJoinedTextureHeight > 0 ? (u16)mJoinedTextureHeight : (u16)mpGlyphBlocks[field_0x66]->textureHeight; #else u16 texH = mpGlyphBlocks[field_0x66]->textureHeight; #endif - u16 cellW = mpGlyphBlocks[field_0x66]->cellWidth; +#if AVOID_UB + if (texW == 0) texW = 1; + if (texH == 0) texH = 1; +#endif + + u16 cellW = mpGlyphBlocks[field_0x66]->cellWidth; u16 cellH = mpGlyphBlocks[field_0x66]->cellHeight; s32 u1 = (mWidth * 0x8000) / texW; s32 v1 = (mHeight * 0x8000) / texH;