tp/libs/JSystem/JUtility/JUTCacheFont.cpp

533 lines
16 KiB
C++

//
// Generated By: dol2asm
// Translation Unit: JUTCacheFont
//
#include "JSystem/JUtility/JUTCacheFont.h"
#include "JSystem/JUtility/JUTException.h"
#include "JSystem/JUtility/JUTAssert.h"
#include "JSystem/JUtility/JUTConsole.h"
#include "JSystem/JKernel/JKRAram.h"
#include "dolphin/gx/GX.h"
/* 802DD188-802DD208 2D7AC8 0080+00 0/0 1/1 0/0 .text __ct__12JUTCacheFontFPC7ResFONTUlP7JKRHeap
*/
JUTCacheFont::JUTCacheFont(ResFONT const* p_fontRes, u32 cacheSize, JKRHeap* p_heap) {
initialize_state();
JUTResFont::initialize_state();
JUTFont::initialize_state();
initiate(p_fontRes, NULL, cacheSize, p_heap);
}
/* 802DD208-802DD29C 2D7B48 0094+00 1/0 0/0 0/0 .text __dt__12JUTCacheFontFv */
JUTCacheFont::~JUTCacheFont() {
if (isValid()) {
deleteMemBlocks_CacheFont();
initialize_state();
deleteMemBlocks_ResFont();
JUTResFont::initialize_state();
JUTFont::initialize_state();
}
}
/* 802DD29C-802DD320 2D7BDC 0084+00 3/3 0/0 0/0 .text deleteMemBlocks_CacheFont__12JUTCacheFontFv
*/
void JUTCacheFont::deleteMemBlocks_CacheFont() {
if (field_0xb0 != 0) {
delete[] mCacheBuffer;
}
delete field_0xac;
delete mInf1Ptr;
delete mMemBlocks;
delete field_0x7c;
delete field_0x80;
delete field_0x84;
}
/* 802DD320-802DD35C 2D7C60 003C+00 3/3 0/0 0/0 .text initialize_state__12JUTCacheFontFv
*/
void JUTCacheFont::initialize_state() {
field_0xb0 = 0;
mCacheBuffer = NULL;
field_0xac = NULL;
mInf1Ptr = NULL;
field_0x7c = NULL;
field_0x80 = NULL;
field_0x84 = NULL;
mMemBlocks = NULL;
mPagingType = PAGE_TYPE_0;
mMaxSheetSize = 0;
mCacheBuffer = NULL;
field_0x9c = NULL;
field_0xa0 = NULL;
}
/* 802DD35C-802DD4EC 2D7C9C 0190+00 1/1 0/0 0/0 .text
* getMemorySize__12JUTCacheFontFPC7ResFONTPUsPUlPUsPUlPUsPUlPUl */
int JUTCacheFont::getMemorySize(ResFONT const* p_font, u16* o_widCount, u32* o_widSize,
u16* o_glyCount, u32* o_glySize, u16* o_mapCount, u32* o_mapSize,
u32* o_glyTexSize) {
if (p_font == NULL) {
return 0;
}
u16 widBlockCount = 0;
u16 glyBlockCount = 0;
u16 mapBlockCount = 0;
u32 totalWidSize = 0;
u32 totalGlySize = 0;
u32 totalMapSize = 0;
u32 maxGlyTexSize = 0;
u32 glyTexSize;
u8* fontInf = (u8*)p_font->data;
for (int i = 0; i < p_font->numBlocks; i++) {
switch (((BlockHeader*)fontInf)->magic) {
case 'INF1':
break;
case 'WID1':
totalWidSize += ((BlockHeader*)fontInf)->size;
widBlockCount++;
break;
case 'GLY1':
totalGlySize += ((BlockHeader*)fontInf)->size;
glyTexSize = ((ResFONT::GLY1*)fontInf)->textureSize;
glyBlockCount++;
if (glyTexSize > maxGlyTexSize) {
maxGlyTexSize = glyTexSize;
}
break;
case 'MAP1':
totalMapSize += ((BlockHeader*)fontInf)->size;
mapBlockCount++;
break;
default:
JUTReportConsole("JUTCacheFont: Unknown data block\n");
break;
}
fontInf += ((BlockHeader*)fontInf)->size;
}
if (o_widCount != NULL) {
*o_widCount = widBlockCount;
}
if (o_glyCount != NULL) {
*o_glyCount = glyBlockCount;
}
if (o_mapCount != NULL) {
*o_mapCount = mapBlockCount;
}
if (o_widSize != NULL) {
*o_widSize = totalWidSize;
}
if (o_glySize != NULL) {
*o_glySize = totalGlySize;
}
if (o_mapSize != NULL) {
*o_mapSize = totalMapSize;
}
if (o_glyTexSize != NULL) {
*o_glyTexSize = maxGlyTexSize;
}
return 1;
}
/* 802DD4EC-802DD54C 2D7E2C 0060+00 1/1 0/0 0/0 .text
* initiate__12JUTCacheFontFPC7ResFONTPvUlP7JKRHeap */
int JUTCacheFont::initiate(ResFONT const* p_fontRes, void* param_1, u32 param_2, JKRHeap* p_heap) {
if (!internal_initiate(p_fontRes, param_1, param_2, p_heap)) {
deleteMemBlocks_CacheFont();
deleteMemBlocks_ResFont();
JUTFont::initialize_state();
mValid = false;
return 0;
}
return 1;
}
/* 802DD54C-802DD650 2D7E8C 0104+00 1/1 0/0 0/0 .text
* internal_initiate__12JUTCacheFontFPC7ResFONTPvUlP7JKRHeap */
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();
JUTFont::initialize_state();
if (p_fontRes == NULL) {
return false;
}
mResFont = p_fontRes;
mValid = true;
getMemorySize(p_fontRes, &mWid1BlockNum, &mTotalWidSize, &mGly1BlockNum, &mTotalGlySize,
&mMap1BlockNum, &mTotalMapSize, &mMaxSheetSize);
if (!allocArea(param_1, param_2, param_3)) {
return false;
} else if (!allocArray(param_3)) {
return false;
}
setBlock();
return true;
}
/* 802DD650-802DD804 2D7F90 01B4+00 1/1 0/0 0/0 .text allocArea__12JUTCacheFontFPvUlP7JKRHeap */
bool JUTCacheFont::allocArea(void* param_0, u32 param_1, JKRHeap* heap) {
mInf1Ptr = (ResFONT::INF1*)new (heap, 0) ResFONT();
if (mInf1Ptr == NULL) {
return false;
}
if (mTotalWidSize != 0) {
field_0x7c = new (heap, 0) u8[mTotalWidSize];
if (field_0x7c == NULL) {
return false;
}
}
if (mGly1BlockNum != 0) {
field_0x80 = new (heap, 0) ResFONT::GLY1[mGly1BlockNum];
if (field_0x80 == NULL) {
return false;
}
field_0xac = JKRAram::getManager()->mAramHeap->alloc(
mTotalGlySize - (mGly1BlockNum * sizeof(ResFONT::GLY1)), JKRAramHeap::HEAD);
if (field_0xac == NULL) {
return false;
}
}
if (mTotalMapSize != 0) {
field_0x84 = new (heap, 0) u8[mTotalMapSize];
if (field_0x84 == NULL) {
return false;
}
}
field_0x94 = mMaxSheetSize + 0x40;
mCachePage = param_1 / field_0x94;
u32 v1 = field_0x94 * mCachePage;
if (mCachePage == 0) {
return false;
}
if (param_0 != NULL) {
mCacheBuffer = param_0;
field_0xb0 = 0;
} else {
mCacheBuffer = new (heap, 0x20) u8[v1];
if (mCacheBuffer == NULL) {
return false;
}
field_0xb0 = 1;
}
invalidiateAllCache();
return true;
}
/* 802DD804-802DD8EC 2D8144 00E8+00 1/1 0/0 0/0 .text allocArray__12JUTCacheFontFP7JKRHeap */
bool JUTCacheFont::allocArray(JKRHeap* param_0) {
mMemBlocks = (void**)new (param_0, 0) u32[mWid1BlockNum + mGly1BlockNum + mMap1BlockNum];
if (mMemBlocks == NULL) {
return false;
}
void** blocks = mMemBlocks;
if (mWid1BlockNum) {
mpWidthBlocks = (ResFONT::WID1**)blocks;
blocks = blocks + mWid1BlockNum;
}
if (mGly1BlockNum) {
mpGlyphBlocks = (ResFONT::GLY1**)blocks;
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;
}
return true;
}
/* 802DD8EC-802DDB0C 2D822C 0220+00 1/0 0/0 0/0 .text setBlock__12JUTCacheFontFv */
void JUTCacheFont::setBlock() {
int widthNum = 0;
int gylphNum = 0;
int mapNum = 0;
u8* pWidth = (u8*)field_0x7c;
ResFONT::GLY1* piVar5 = (ResFONT::GLY1*)field_0x80;
ResFONT::MAP1* pMap = (ResFONT::MAP1*)field_0x84;
u32 aramAddress = field_0xac->getAddress();
mMaxCode = 0xffff;
const int* pData = (int*)mResFont->data;
for (int i = 0; i < mResFont->numBlocks; i++) {
switch (*pData) {
case 'INF1':
memcpy(mInf1Ptr, pData, 0x20);
mIsLeadByte = &JUTResFont::saoAboutEncoding_[mInf1Ptr->fontType];
break;
case 'WID1':
memcpy(pWidth, pData, pData[1]);
mpWidthBlocks[widthNum] = (ResFONT::WID1*)pWidth;
pWidth += pData[1];
widthNum++;
break;
case 'GLY1':
memcpy(piVar5, pData, 0x20);
JKRAramBlock* iVar1 =
JKRMainRamToAram((u8*)pData + 0x20, aramAddress, pData[1] - 0x20,
EXPAND_SWITCH_UNKNOWN0, 0, NULL, 0xffffffff, NULL);
if (iVar1 == NULL) {
JUTException::panic("JUTCacheFont.cpp", 0x1dd,
"trouble occurred in JKRMainRamToAram.");
}
piVar5->magic = aramAddress;
if (piVar5->textureSize > mMaxSheetSize) {
mMaxSheetSize = piVar5->textureSize;
}
mpGlyphBlocks[gylphNum] = piVar5;
gylphNum++;
piVar5++;
aramAddress = pData[1] + aramAddress - 0x20;
break;
case 'MAP1':
memcpy(pMap, pData, pData[1]);
mpMapBlocks[mapNum] = pMap;
if (mMaxCode > mpMapBlocks[mapNum]->startCode) {
mMaxCode = mpMapBlocks[mapNum]->startCode;
}
mapNum++;
pMap = (ResFONT::MAP1*)((u8*)pMap + pData[1]);
break;
default:
JUTReportConsole("Unknown data block\n");
break;
}
pData = (int*)((u8*)pData + pData[1]);
}
}
/* 802DDB0C-802DDBBC 2D844C 00B0+00 1/1 0/0 0/0 .text determineBlankPage__12JUTCacheFontFv */
JUTCacheFont::TGlyphCacheInfo* JUTCacheFont::determineBlankPage() {
TGlyphCacheInfo* pVar1 = field_0xa4;
if (pVar1 != NULL) {
field_0xa4 = pVar1->mNext;
TGlyphCacheInfo* pVar2 = pVar1->mNext;
if (pVar2 == NULL) {
field_0xa8 = 0;
} else {
pVar2->mPrev = NULL;
}
return pVar1;
}
TGlyphCacheInfo* puVar1 = field_0xa0;
while (puVar1 != NULL) {
TGlyphCacheInfo* prev = puVar1->mPrev;
if (puVar1->field_0x1e == 0) {
unlink(puVar1);
field_0xb4++;
return puVar1;
}
puVar1 = prev;
}
return NULL;
}
/* 802DDBBC-802DDCE4 2D84FC 0128+00 1/1 0/0 0/0 .text
* getGlyphFromAram__12JUTCacheFontFPQ212JUTCacheFont15TGlyphCacheInfoPQ212JUTCacheFont10TCachePagePiPi
*/
void JUTCacheFont::getGlyphFromAram(JUTCacheFont::TGlyphCacheInfo* param_0,
JUTCacheFont::TCachePage* pCachePage, int* param_2, int* param_3) {
TGlyphCacheInfo* pGylphCacheInfo = pCachePage;
memcpy(pGylphCacheInfo, param_0, sizeof(TGlyphCacheInfo));
prepend(pGylphCacheInfo);
int iVar3 = pGylphCacheInfo->field_0x16 * pGylphCacheInfo->field_0x18;
int iVar2 = *param_2 / 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 =
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);
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,
GX_ANISO_1);
}
/* 802DDCE4-802DDD98 2D8624 00B4+00 1/0 0/0 0/0 .text loadImage__12JUTCacheFontFi11_GXTexMapID */
void JUTCacheFont::loadImage(int param_0, _GXTexMapID texMapId) {
TCachePage* cachePage = loadCache_char_subroutine(&param_0, false);
if (cachePage != NULL) {
mWidth = cachePage->field_0xc * (param_0 % (int)cachePage->field_0x16);
mHeight = cachePage->field_0xe * (param_0 / cachePage->field_0x16);
GXLoadTexObj(getTexObj(cachePage), texMapId);
if (mPagingType == PAGE_TYPE_1) {
unlink(cachePage);
prepend(cachePage);
}
}
}
/* 802DDD98-802DDEE0 2D86D8 0148+00 1/1 0/0 0/0 .text
* loadCache_char_subroutine__12JUTCacheFontFPib */
JUTCacheFont::TCachePage* JUTCacheFont::loadCache_char_subroutine(int* param_0, bool param_1) {
TCachePage* rv = NULL;
for (TCachePage* pCachePage = (TCachePage*)field_0x9c; pCachePage != NULL;
pCachePage = (TCachePage*)pCachePage->mNext)
{
if (pCachePage->field_0x8 <= *param_0 && *param_0 <= pCachePage->field_0xa) {
rv = pCachePage;
*param_0 -= pCachePage->field_0x8;
break;
}
}
if (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;
break;
}
}
if (i < mGly1BlockNum) {
TCachePage* pBlankPage = (TCachePage*)determineBlankPage();
if (pBlankPage == NULL) {
return NULL;
}
int texPageIdx;
getGlyphFromAram((JUTCacheFont::TGlyphCacheInfo*)mpGlyphBlocks[i], pBlankPage, param_0,
&texPageIdx);
mTexPageIdx = texPageIdx;
field_0x66 = i;
rv = pBlankPage;
} else {
return NULL;
}
}
if (param_1) {
rv->field_0x1e = 1;
}
return rv;
}
/* 802DDEE0-802DDF68 2D8820 0088+00 1/1 0/0 0/0 .text invalidiateAllCache__12JUTCacheFontFv */
void JUTCacheFont::invalidiateAllCache() {
int* piVar3 = (int*)mCacheBuffer;
for (int uVar2 = 0; uVar2 < mCachePage; uVar2++) {
int iVar1;
if (uVar2 == 0) {
iVar1 = 0;
} else {
iVar1 = (int)piVar3 - field_0x94;
}
*piVar3 = iVar1;
if (uVar2 == mCachePage - 1) {
iVar1 = 0;
} else {
iVar1 = (int)piVar3 + field_0x94;
}
piVar3[1] = iVar1;
piVar3 = (int*)((int)piVar3 + field_0x94);
}
field_0xa8 = (int)piVar3 - field_0x94;
field_0xa4 = (TGlyphCacheInfo*)mCacheBuffer;
field_0x9c = NULL;
field_0xa0 = NULL;
}
/* 802DDF68-802DDFAC 2D88A8 0044+00 2/2 0/0 0/0 .text
* unlink__12JUTCacheFontFPQ212JUTCacheFont15TGlyphCacheInfo */
void JUTCacheFont::unlink(JUTCacheFont::TGlyphCacheInfo* cacheInfo) {
if (cacheInfo->mPrev == NULL) {
field_0x9c = cacheInfo->mNext;
} else {
cacheInfo->mPrev->mNext = cacheInfo->mNext;
}
if (cacheInfo->mNext == NULL) {
field_0xa0 = cacheInfo->mPrev;
} else {
cacheInfo->mNext->mPrev = cacheInfo->mPrev;
}
}
/* 802DDFAC-802DDFD8 2D88EC 002C+00 2/2 0/0 0/0 .text
* prepend__12JUTCacheFontFPQ212JUTCacheFont15TGlyphCacheInfo */
void JUTCacheFont::prepend(JUTCacheFont::TGlyphCacheInfo* cacheInfo) {
TGlyphCacheInfo* oldHead = field_0x9c;
field_0x9c = cacheInfo;
cacheInfo->mPrev = NULL;
cacheInfo->mNext = oldHead;
if (oldHead == NULL) {
field_0xa0 = cacheInfo;
} else {
oldHead->mPrev = cacheInfo;
}
}
/* 802DDFD8-802DDFE0 2D8918 0008+00 1/0 1/0 0/0 .text getResFont__10JUTResFontCFv */
ResFONT* JUTResFont::getResFont() const {
return (ResFONT*)mResFont;
}
/* 802DDFE0-802DDFEC 2D8920 000C+00 1/0 1/0 0/0 .text getFontType__10JUTResFontCFv */
int JUTResFont::getFontType() const {
return mInf1Ptr->fontType;
}
/* 802DDFEC-802DDFF8 2D892C 000C+00 1/0 1/0 0/0 .text getLeading__10JUTResFontCFv */
int JUTResFont::getLeading() const {
return mInf1Ptr->leading;
}
/* 802DDFF8-802DE004 2D8938 000C+00 1/0 1/0 0/0 .text getWidth__10JUTResFontCFv */
s32 JUTResFont::getWidth() const {
return mInf1Ptr->width;
}
/* 802DE004-802DE010 2D8944 000C+00 1/0 1/0 0/0 .text getAscent__10JUTResFontCFv */
s32 JUTResFont::getAscent() const {
return mInf1Ptr->ascent;
}
/* 802DE010-802DE01C 2D8950 000C+00 1/0 1/0 0/0 .text getDescent__10JUTResFontCFv */
s32 JUTResFont::getDescent() const {
return mInf1Ptr->descent;
}
/* 802DE01C-802DE078 2D895C 005C+00 1/0 1/0 0/0 .text getHeight__10JUTResFontCFv */
s32 JUTResFont::getHeight() const {
return getAscent() + getDescent();
}