summaryrefslogtreecommitdiff
path: root/src/JSystem/JUtility/JUTCacheFont.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/JSystem/JUtility/JUTCacheFont.cpp')
-rw-r--r--src/JSystem/JUtility/JUTCacheFont.cpp112
1 files changed, 51 insertions, 61 deletions
diff --git a/src/JSystem/JUtility/JUTCacheFont.cpp b/src/JSystem/JUtility/JUTCacheFont.cpp
index dc2a5455dc..9054c6ec77 100644
--- a/src/JSystem/JUtility/JUTCacheFont.cpp
+++ b/src/JSystem/JUtility/JUTCacheFont.cpp
@@ -16,12 +16,9 @@ JUTCacheFont::JUTCacheFont(ResFONT const* p_fontRes, u32 cacheSize, JKRHeap* p_h
}
JUTCacheFont::~JUTCacheFont() {
- if (isValid()) {
- deleteMemBlocks_CacheFont();
- initialize_state();
-
- deleteMemBlocks_ResFont();
- JUTResFont::initialize_state();
+ if (mValid) {
+ delete_and_initialize();
+ JUTResFont::delete_and_initialize();
JUTFont::initialize_state();
}
@@ -32,7 +29,7 @@ void JUTCacheFont::deleteMemBlocks_CacheFont() {
delete[] mCacheBuffer;
}
- delete field_0xac;
+ JKRFreeToAram(field_0xac);
delete mInf1Ptr;
delete mMemBlocks;
delete field_0x7c;
@@ -149,10 +146,8 @@ int JUTCacheFont::initiate(ResFONT const* p_fontRes, void* param_1, u32 param_2,
bool JUTCacheFont::internal_initiate(ResFONT const* p_fontRes, void* param_1, u32 param_2,
JKRHeap* param_3) {
- deleteMemBlocks_CacheFont();
- initialize_state();
- deleteMemBlocks_ResFont();
- JUTResFont::initialize_state();
+ delete_and_initialize();
+ JUTResFont::delete_and_initialize();
JUTFont::initialize_state();
if (p_fontRes == NULL) {
@@ -174,7 +169,7 @@ bool JUTCacheFont::internal_initiate(ResFONT const* p_fontRes, void* param_1, u3
return true;
}
-bool JUTCacheFont::allocArea(void* param_0, u32 param_1, JKRHeap* heap) {
+bool JUTCacheFont::allocArea(void* cacheBuffer, u32 param_1, JKRHeap* heap) {
mInf1Ptr = (ResFONT::INF1*)new (heap, 0) ResFONT();
if (mInf1Ptr == NULL) {
return false;
@@ -193,8 +188,7 @@ bool JUTCacheFont::allocArea(void* param_0, u32 param_1, JKRHeap* heap) {
return false;
}
- field_0xac = JKRAram::getManager()->mAramHeap->alloc(
- mTotalGlySize - (mGly1BlockNum * sizeof(ResFONT::GLY1)), JKRAramHeap::HEAD);
+ field_0xac = JKRAllocFromAram(mTotalGlySize - (mGly1BlockNum * sizeof(ResFONT::GLY1)), JKRAramHeap::HEAD);
if (field_0xac == NULL) {
return false;
}
@@ -214,8 +208,9 @@ bool JUTCacheFont::allocArea(void* param_0, u32 param_1, JKRHeap* heap) {
return false;
}
- if (param_0 != NULL) {
- mCacheBuffer = param_0;
+ if (cacheBuffer != NULL) {
+ JUT_ASSERT(352, ( (u32)cacheBuffer & 0x1f ) == 0);
+ mCacheBuffer = cacheBuffer;
field_0xb0 = 0;
} else {
mCacheBuffer = new (heap, 0x20) u8[v1];
@@ -237,18 +232,18 @@ bool JUTCacheFont::allocArray(JKRHeap* param_0) {
void** blocks = mMemBlocks;
if (mWid1BlockNum) {
- mpWidthBlocks = (ResFONT::WID1**)blocks;
+ mpWidthBlocks = new (blocks) ResFONT::WID1*[mWid1BlockNum];
blocks = blocks + mWid1BlockNum;
}
if (mGly1BlockNum) {
- mpGlyphBlocks = (ResFONT::GLY1**)blocks;
+ mpGlyphBlocks = new (blocks) ResFONT::GLY1*[mGly1BlockNum];
blocks = blocks + mGly1BlockNum;
for (int i = 0; i < mGly1BlockNum; i++) {
mpGlyphBlocks[i] = (ResFONT::GLY1*)((u8*)mCacheBuffer + (field_0x94 * i));
}
- }
+ }
if (mMap1BlockNum) {
- mpMapBlocks = (ResFONT::MAP1**)blocks;
+ mpMapBlocks = new (blocks) ResFONT::MAP1*[mMap1BlockNum];
}
return true;
}
@@ -265,16 +260,19 @@ void JUTCacheFont::setBlock() {
const int* pData = (int*)mResFont->data;
for (int i = 0; i < mResFont->numBlocks; i++) {
+ u32 u;
switch (*pData) {
case 'INF1':
memcpy(mInf1Ptr, pData, 0x20);
- mIsLeadByte = &JUTResFont::saoAboutEncoding_[mInf1Ptr->fontType];
+ u = mInf1Ptr->fontType;
+ JUT_ASSERT(448, u < suAboutEncoding_);
+ mIsLeadByte = &JUTResFont::saoAboutEncoding_[u];
break;
case 'WID1':
memcpy(pWidth, pData, pData[1]);
mpWidthBlocks[widthNum] = (ResFONT::WID1*)pWidth;
- pWidth += pData[1];
widthNum++;
+ pWidth += pData[1];
break;
case 'GLY1':
memcpy(piVar5, pData, 0x20);
@@ -292,7 +290,7 @@ void JUTCacheFont::setBlock() {
mpGlyphBlocks[gylphNum] = piVar5;
gylphNum++;
piVar5++;
- aramAddress = pData[1] + aramAddress - 0x20;
+ aramAddress += pData[1] - 0x20;
break;
case 'MAP1':
memcpy(pMap, pData, pData[1]);
@@ -313,27 +311,27 @@ void JUTCacheFont::setBlock() {
}
JUTCacheFont::TGlyphCacheInfo* JUTCacheFont::determineBlankPage() {
- TGlyphCacheInfo* pVar1 = field_0xa4;
- if (pVar1 != NULL) {
+ TGlyphCacheInfo* pVar1;
+ if (field_0xa4 != NULL) {
+ pVar1 = field_0xa4;
field_0xa4 = pVar1->mNext;
- TGlyphCacheInfo* pVar2 = pVar1->mNext;
- if (pVar2 == NULL) {
+ if (pVar1->mNext == NULL) {
field_0xa8 = 0;
} else {
- pVar2->mPrev = NULL;
+ pVar1->mNext->mPrev = NULL;
}
return pVar1;
}
- TGlyphCacheInfo* puVar1 = field_0xa0;
- while (puVar1 != NULL) {
- TGlyphCacheInfo* prev = puVar1->mPrev;
- if (puVar1->field_0x1e == 0) {
- unlink(puVar1);
+ pVar1 = field_0xa0;
+ while (pVar1 != NULL) {
+ TGlyphCacheInfo* prev = pVar1->mPrev;
+ if (pVar1->field_0x1e == 0) {
+ unlink(pVar1);
field_0xb4++;
- return puVar1;
+ return pVar1;
}
- puVar1 = prev;
+ pVar1 = prev;
}
return NULL;
@@ -342,19 +340,20 @@ JUTCacheFont::TGlyphCacheInfo* JUTCacheFont::determineBlankPage() {
void JUTCacheFont::getGlyphFromAram(JUTCacheFont::TGlyphCacheInfo* param_0,
JUTCacheFont::TCachePage* pCachePage, int* param_2, int* param_3) {
TGlyphCacheInfo* pGylphCacheInfo = pCachePage;
+ int* r30 = param_2;
memcpy(pGylphCacheInfo, param_0, sizeof(TGlyphCacheInfo));
prepend(pGylphCacheInfo);
int iVar3 = pGylphCacheInfo->field_0x16 * pGylphCacheInfo->field_0x18;
- int iVar2 = *param_2 / iVar3;
+ int iVar2 = *r30 / iVar3;
pGylphCacheInfo->field_0x8 += iVar2 * iVar3;
u16 local_30 = pGylphCacheInfo->field_0x8 + iVar3 - 1;
pGylphCacheInfo->field_0xa = pGylphCacheInfo->field_0xa < local_30 ? pGylphCacheInfo->field_0xa : local_30;
*param_3 = iVar2;
- *param_2 -= iVar2 * iVar3;
- u8* addr =
+ *r30 -= iVar2 * iVar3;
+ u8* result =
JKRAramToMainRam((u32)param_0->mPrev + pGylphCacheInfo->field_0x10 * iVar2, pCachePage->mImage,
pGylphCacheInfo->field_0x10, EXPAND_SWITCH_UNKNOWN0, 0, NULL, 0xffffffff, NULL);
- JUT_ASSERT(624, addr != NULL);
+ JUT_ASSERT(624, result);
GXInitTexObj(&pCachePage->mTexObj, pCachePage->mImage, pGylphCacheInfo->mWidth, pGylphCacheInfo->mHeight,
(GXTexFmt)pGylphCacheInfo->mTexFormat, GX_CLAMP, GX_CLAMP, GX_FALSE);
GXInitTexObjLOD(&pCachePage->mTexObj, GX_LINEAR, GX_LINEAR, 0.0f, 0.0f, 0.0f, GX_FALSE, GX_FALSE,
@@ -376,21 +375,23 @@ void JUTCacheFont::loadImage(int param_0, _GXTexMapID texMapId) {
JUTCacheFont::TCachePage* JUTCacheFont::loadCache_char_subroutine(int* param_0, bool param_1) {
TCachePage* rv = NULL;
+ int* r29 = param_0;
for (TCachePage* pCachePage = (TCachePage*)field_0x9c; pCachePage != NULL;
pCachePage = (TCachePage*)pCachePage->mNext)
{
- if (pCachePage->field_0x8 <= *param_0 && *param_0 <= pCachePage->field_0xa) {
+ if (pCachePage->field_0x8 <= *r29 && *r29 <= pCachePage->field_0xa) {
rv = pCachePage;
- *param_0 -= pCachePage->field_0x8;
+ *r29 -= pCachePage->field_0x8;
break;
}
}
if (rv == NULL) {
+ rv = NULL;
int i = 0;
for (; i < mGly1BlockNum; i++) {
- if (mpGlyphBlocks[i]->startCode <= *param_0 && *param_0 <= mpGlyphBlocks[i]->endCode) {
- *param_0 -= mpGlyphBlocks[i]->startCode;
+ if (mpGlyphBlocks[i]->startCode <= *r29 && *r29 <= mpGlyphBlocks[i]->endCode) {
+ *r29 -= mpGlyphBlocks[i]->startCode;
break;
}
}
@@ -400,7 +401,7 @@ JUTCacheFont::TCachePage* JUTCacheFont::loadCache_char_subroutine(int* param_0,
return NULL;
}
int texPageIdx;
- getGlyphFromAram((JUTCacheFont::TGlyphCacheInfo*)mpGlyphBlocks[i], pBlankPage, param_0,
+ getGlyphFromAram((JUTCacheFont::TGlyphCacheInfo*)mpGlyphBlocks[i], pBlankPage, r29,
&texPageIdx);
mTexPageIdx = texPageIdx;
field_0x66 = i;
@@ -416,24 +417,13 @@ JUTCacheFont::TCachePage* JUTCacheFont::loadCache_char_subroutine(int* param_0,
}
void JUTCacheFont::invalidiateAllCache() {
- int* piVar3 = (int*)mCacheBuffer;
- for (int uVar2 = 0; uVar2 < mCachePage; uVar2++) {
- int iVar1;
- if (uVar2 == 0) {
- iVar1 = 0;
- } else {
- iVar1 = (intptr_t)piVar3 - field_0x94;
- }
- *piVar3 = iVar1;
- if (uVar2 == mCachePage - 1) {
- iVar1 = 0;
- } else {
- iVar1 = (intptr_t)piVar3 + field_0x94;
- }
- piVar3[1] = iVar1;
- piVar3 = (int*)((intptr_t)piVar3 + field_0x94);
+ int* cacheBuffer = (int*)mCacheBuffer;
+ for (int i = 0; i < mCachePage; i++) {
+ *cacheBuffer = i == 0 ? 0 : (intptr_t)cacheBuffer - field_0x94;
+ cacheBuffer[1] = i == mCachePage - 1 ? 0 : (intptr_t)cacheBuffer + field_0x94;
+ cacheBuffer = (int*)((intptr_t)cacheBuffer + field_0x94);
}
- field_0xa8 = (intptr_t)piVar3 - field_0x94;
+ field_0xa8 = (intptr_t)cacheBuffer - field_0x94;
field_0xa4 = (TGlyphCacheInfo*)mCacheBuffer;
field_0x9c = NULL;
field_0xa0 = NULL;