summaryrefslogtreecommitdiff
path: root/arm9/src
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/src')
-rw-r--r--arm9/src/gf_gfx_loader.c204
1 files changed, 191 insertions, 13 deletions
diff --git a/arm9/src/gf_gfx_loader.c b/arm9/src/gf_gfx_loader.c
index 83ca9119..d9d6d411 100644
--- a/arm9/src/gf_gfx_loader.c
+++ b/arm9/src/gf_gfx_loader.c
@@ -2,6 +2,7 @@
#include "filesystem.h"
#include "NNS_g2d.h"
#include "unk_02016B94.h"
+#include "GXS_ioreg.h"
void * UncompressFromNarc(NarcId narcId, s32 memberNo, BOOL isCompressed, u32 heap_id, BOOL allocAtEnd);
@@ -146,31 +147,208 @@ THUMB_FUNC void FUN_02006A8C(NarcId narcId, s32 memberId, NNS_G2D_VRAM_TYPE r5,
}
}
-THUMB_FUNC u32 FUN_02006AE4(NarcId narcId, s32 memberId, BOOL isCompressed, u32 r5, u32 sp18, u32 sp1C, u32 sp20, u32 heap_id, NNSG2dImageProxy *sp28)
+THUMB_FUNC u32 FUN_02006AE4(NarcId narcId, s32 memberId, BOOL isCompressed, u32 whichRoutine, u32 szByte, NNS_G2D_VRAM_TYPE type, u32 baseAddr, u32 heap_id, NNSG2dImageProxy *pImgProxy)
{
static void (*const UNK_020ECBA8[])(const NNSG2dCharacterData *, u32, NNS_G2D_VRAM_TYPE, NNSG2dImageProxy *) = {
NNS_G2dLoadImage1DMapping,
NNS_G2dLoadImage2DMapping
};
- void * r6 = UncompressFromNarc(narcId, memberId, isCompressed, heap_id, TRUE);
- u32 r4 = 0;
+ void * pFile = UncompressFromNarc(narcId, memberId, isCompressed, heap_id, TRUE);
+ u32 retSize = 0;
+ NNSG2dCharacterData * pSrcData;
+ if (pFile != NULL)
+ {
+ if (NNS_G2dGetUnpackedCharacterData(pFile, &pSrcData))
+ {
+ if (szByte != 0)
+ pSrcData->szByte = szByte;
+ UNK_020ECBA8[whichRoutine](pSrcData, baseAddr, type, pImgProxy);
+ retSize = pSrcData->szByte;
+ }
+ FreeToHeap(pFile);
+ }
+ return retSize;
+}
+
+THUMB_FUNC void FUN_02006B38(NarcId narcId, s32 memberId, BOOL isCompressed, u32 r5, u32 sp18, NNS_G2D_VRAM_TYPE sp1C, u32 sp20, u32 heap_id, NNSG2dImageProxy * sp28)
+{
+ static void (*const UNK_020ECB98[])(const NNSG2dCharacterData *, u32, NNS_G2D_VRAM_TYPE, NNSG2dImageProxy *) = {
+ NNS_G2dLoadImage1DMapping,
+ NNS_G2dLoadImage2DMapping
+ };
NNSG2dCharacterData * sp4;
- if (r6 != NULL)
+ void * r4 = UncompressFromNarc(narcId, memberId, isCompressed, heap_id, TRUE);
+ if (r4 != NULL)
{
- if (NNS_G2dGetUnpackedCharacterData(r6, &sp4))
+ if (NNS_G2dGetUnpackedCharacterData(r4, &sp4))
{
if (sp18 != 0)
sp4->szByte = sp18;
- UNK_020ECBA8[r5](sp4, sp20, sp1C, sp28);
- r4 = sp4->szByte;
+ switch (sp1C)
+ {
+ case NNS_G2D_VRAM_TYPE_2DMAIN:
+ sp4->mapingType = reg_GX_DISPCNT & (REG_GX_DISPCNT_EXOBJ_CH_MASK | REG_GX_DISPCNT_OBJMAP_CH_MASK);
+ break;
+ case NNS_G2D_VRAM_TYPE_2DSUB:
+ sp4->mapingType = reg_GXS_DB_DISPCNT & (REG_GXS_DB_DISPCNT_EXOBJ_MASK | REG_GXS_DB_DISPCNT_OBJMAP_CH_MASK);
+ break;
+ default:
+ ;
+ }
+ UNK_020ECB98[r5](sp4, sp20, sp1C, sp28);
}
- FreeToHeap(r6);
+ FreeToHeap(r4);
}
- return r4;
}
-void (*const UNK_020ECB98[])(const NNSG2dCharacterData *, u32, NNS_G2D_VRAM_TYPE, NNSG2dImageProxy *) = {
- NNS_G2dLoadImage1DMapping,
- NNS_G2dLoadImage2DMapping
-};
+THUMB_FUNC void * FUN_02006BB0(NarcId narcId, s32 memberId, BOOL isCompressed, NNSG2dCharacterData ** r4, u32 heap_id)
+{
+ void * r5 = UncompressFromNarc(narcId, memberId, isCompressed, heap_id, FALSE);
+ if (r5 != NULL)
+ {
+ if (!NNS_G2dGetUnpackedBGCharacterData(r5, r4))
+ {
+ FreeToHeap(r5);
+ return NULL;
+ }
+ }
+ return r5;
+}
+
+THUMB_FUNC void * FUN_02006BDC(NarcId narcId, s32 memberId, BOOL isCompressed, NNSG2dScreenData ** r4, u32 heap_id)
+{
+ void * r5 = UncompressFromNarc(narcId, memberId, isCompressed, heap_id, FALSE);
+ if (r5 != NULL)
+ {
+ if (!NNS_G2dGetUnpackedScreenData(r5, r4))
+ {
+ FreeToHeap(r5);
+ return NULL;
+ }
+ }
+ return r5;
+}
+
+THUMB_FUNC void * FUN_02006C08(NarcId narcId, s32 memberId, NNSG2dPaletteData ** r4, u32 heap_id)
+{
+ void * r5 = UncompressFromNarc(narcId, memberId, FALSE, heap_id, FALSE);
+ if (r5 != NULL)
+ {
+ if (!NNS_G2dGetUnpackedPaletteData(r5, r4))
+ {
+ FreeToHeap(r5);
+ return NULL;
+ }
+ }
+ return r5;
+}
+
+THUMB_FUNC void * FUN_02006C30(NarcId narcId, s32 memberId, BOOL isCompressed, NNSG2dCellDataBank ** r4, u32 heap_id)
+{
+ void * r5 = UncompressFromNarc(narcId, memberId, isCompressed, heap_id, FALSE);
+ if (r5 != NULL)
+ {
+ if (!NNS_G2dGetUnpackedCellBank(r5, r4))
+ {
+ FreeToHeap(r5);
+ return NULL;
+ }
+ }
+ return r5;
+}
+
+THUMB_FUNC void * FUN_02006C5C(NarcId narcId, s32 memberId, BOOL isCompressed, NNSG2dAnimBankData ** r4, u32 heap_id)
+{
+ void * r5 = UncompressFromNarc(narcId, memberId, isCompressed, heap_id, FALSE);
+ if (r5 != NULL)
+ {
+ if (!NNS_G2dGetUnpackedAnimBank(r5, r4))
+ {
+ FreeToHeap(r5);
+ return NULL;
+ }
+ }
+ return r5;
+}
+
+THUMB_FUNC void * FUN_02006C88(NarcId narcId, s32 memberId, u32 heap_id)
+{
+ return UncompressFromNarc(narcId, memberId, TRUE, heap_id, FALSE);
+}
+
+THUMB_FUNC void * UncompressFromNarc(NarcId narcId, s32 memberNo, BOOL isCompressed, u32 heap_id, BOOL allocAtEnd)
+{
+ void * dest;
+ void * dest2;
+ if (isCompressed || allocAtEnd == TRUE)
+ {
+ u32 size = GetNarcMemberSizeByIdPair(narcId, memberNo);
+ dest = AllocFromHeapAtEnd(heap_id, size);
+ }
+ else
+ {
+ u32 size = GetNarcMemberSizeByIdPair(narcId, memberNo);
+ dest = AllocFromHeap(heap_id, size);
+ }
+ if (dest != NULL)
+ {
+ ReadWholeNarcMemberByIdPair(dest, narcId, memberNo);
+ if (isCompressed)
+ {
+ if (allocAtEnd == FALSE)
+ {
+ dest2 = AllocFromHeap(heap_id, (*(u32 *)dest) >> 8);
+ }
+ else
+ {
+ dest2 = AllocFromHeapAtEnd(heap_id, (*(u32 *)dest) >> 8);
+ }
+ if (dest2 != NULL)
+ {
+ MI_UncompressLZ8(dest, dest2);
+ FreeToHeap(dest);
+ }
+ dest = dest2; // UB: if dest2 is NULL, dest is never freed
+ }
+ }
+ return dest;
+}
+
+THUMB_FUNC void * FUN_02006D18(NarcId narcId, s32 memberNo, BOOL isCompressed, u32 heap_id, BOOL allocAtEnd, u32 *size_p)
+{
+ void * dest;
+ void * dest2;
+ *size_p = GetNarcMemberSizeByIdPair(narcId, memberNo);
+ if (isCompressed || allocAtEnd == TRUE)
+ {
+ dest = AllocFromHeapAtEnd(heap_id, *size_p);
+ }
+ else
+ {
+ dest = AllocFromHeap(heap_id, *size_p);
+ }
+ if (dest != NULL)
+ {
+ ReadWholeNarcMemberByIdPair(dest, narcId, memberNo);
+ if (isCompressed)
+ {
+ *size_p = (*(u32 *)dest) >> 8;
+ if (allocAtEnd == FALSE)
+ {
+ dest2 = AllocFromHeap(heap_id, *size_p);
+ }
+ else
+ {
+ dest2 = AllocFromHeapAtEnd(heap_id, *size_p);
+ }
+ if (dest2 != NULL)
+ {
+ MI_UncompressLZ8(dest, dest2);
+ FreeToHeap(dest);
+ }
+ dest = dest2; // UB: if dest2 is NULL, dest is never freed
+ }
+ }
+ return dest;
+}