diff --git a/arm9/global.inc b/arm9/global.inc index 47f9053dd..421e7e43e 100644 --- a/arm9/global.inc +++ b/arm9/global.inc @@ -1066,7 +1066,7 @@ .extern BgFillTilemapBufferAndSchedule .extern BgGetCharPtr .extern GetBgTilemapBuffer -.extern GetBgAffineRotation +.extern GetBgRotation .extern GetBgPriority .extern BlitBitmapRect4Bit .extern FillBitmapRect8Bit @@ -1109,8 +1109,8 @@ .extern GetWindowHeight .extern GetWindowX .extern GetWindowY -.extern MoveWindowX -.extern MoveWindowY +.extern SetWindowX +.extern SetWindowY .extern SetWindowPaletteNum .extern LoadCharacterDataFromFile .extern LoadPaletteDataFromFile diff --git a/arm9/lib/NitroSDK/include/GX_bgcnt.h b/arm9/lib/NitroSDK/include/GX_bgcnt.h index b64d44323..3fd989005 100644 --- a/arm9/lib/NitroSDK/include/GX_bgcnt.h +++ b/arm9/lib/NitroSDK/include/GX_bgcnt.h @@ -169,12 +169,10 @@ typedef enum } GXBGScrSizeLargeBmp; -typedef enum -{ +typedef enum { GX_BG_COLORMODE_16 = 0, GX_BG_COLORMODE_256 = 1 -} -GXBGColorMode; +} GXBGColorMode; typedef enum { diff --git a/arm9/lib/NitroSDK/include/MI_uncompress.h b/arm9/lib/NitroSDK/include/MI_uncompress.h index defafa8c5..3e3e98b18 100644 --- a/arm9/lib/NitroSDK/include/MI_uncompress.h +++ b/arm9/lib/NitroSDK/include/MI_uncompress.h @@ -1,7 +1,13 @@ #ifndef POKEDIAMOND_MI_UNCOMPRESS_H #define POKEDIAMOND_MI_UNCOMPRESS_H +#include "nitro/types.h" + void MIi_UncompressBackward(void * bottom); void MI_UncompressLZ8(register const void *srcp, register void *destp); +inline u32 MI_GetUncompressedSize(const void *srcp) { + return (*(u32 *)srcp >> 8); +} + #endif //POKEDIAMOND_MI_UNCOMPRESS_H diff --git a/arm9/overlays/59/include/ov59_Intro.h b/arm9/overlays/59/include/ov59_Intro.h index 51d08dd49..f8541d96c 100644 --- a/arm9/overlays/59/include/ov59_Intro.h +++ b/arm9/overlays/59/include/ov59_Intro.h @@ -126,7 +126,7 @@ void ov59_LoadCharDataFromIndex(ov59_IntroOverlayData *data); void ov59_LoadSubScrnData(ov59_IntroOverlayData *data); void ov59_DrawMunchlax(ov59_IntroOverlayData *data); void ov59_LoadPokeballButton(ov59_IntroOverlayData *data); -BOOL ov59_MoveSprite(ov59_IntroOverlayData *data, u32 layer, u32 param2); +BOOL ov59_MoveSprite(ov59_IntroOverlayData *data, enum GFBgLayer layer, u32 param2); void ov59_ResetPlayerAnimation(ov59_IntroOverlayData *data); void ov59_AnimatePlayerSprite(ov59_IntroOverlayData *data); void ov59_DisableBlend(ov59_IntroOverlayData *data); diff --git a/arm9/overlays/59/src/ov59_Intro.c b/arm9/overlays/59/src/ov59_Intro.c index 40045a681..1403f7ed5 100644 --- a/arm9/overlays/59/src/ov59_Intro.c +++ b/arm9/overlays/59/src/ov59_Intro.c @@ -33,66 +33,66 @@ extern void sub_0200E3A0(PMLCDTarget, int); const struct WindowTemplate ov59_021D9DB8 = { .bgId = GF_BG_LYR_MAIN_0, - .tilemapLeft = 2, - .tilemapTop = 19, + .left = 2, + .top = 19, .width = 27, .height = 4, - .paletteNum = 6, + .palette = 6, .baseTile = 877, }; const struct WindowTemplate ov59_021D9DA8 = { .bgId = GF_BG_LYR_MAIN_0, - .tilemapLeft = 2, - .tilemapTop = 3, + .left = 2, + .top = 3, .width = 6, .height = 4, - .paletteNum = 5, + .palette = 5, .baseTile = 853, }; const struct WindowTemplate ov59_021D9DB0 = { .bgId = GF_BG_LYR_MAIN_0, - .tilemapLeft = 1, - .tilemapTop = 3, + .left = 1, + .top = 3, .width = 16, .height = 6, - .paletteNum = 5, + .palette = 5, .baseTile = 781, }; const struct WindowTemplate ov59_021D9D90 = { .bgId = GF_BG_LYR_MAIN_0, - .tilemapLeft = 8, - .tilemapTop = 0, + .left = 8, + .top = 0, .width = 24, .height = 24, - .paletteNum = 5, + .palette = 5, .baseTile = 301, }; const struct WindowTemplate ov59_021D9D98 = { .bgId = GF_BG_LYR_MAIN_0, - .tilemapLeft = 4, - .tilemapTop = 0, + .left = 4, + .top = 0, .width = 24, .height = 24, - .paletteNum = 5, + .palette = 5, .baseTile = 301, }; const struct WindowTemplate ov59_021D9DA0 = { .bgId = GF_BG_LYR_MAIN_0, - .tilemapLeft = 2, - .tilemapTop = 3, + .left = 2, + .top = 3, .width = 14, .height = 10, - .paletteNum = 5, + .palette = 5, .baseTile = 737, }; @@ -956,7 +956,7 @@ BOOL ov59_DisplayControlAdventureMessage(ov59_IntroOverlayData *data, u32 msgNo, { template = ov59_021D9D98; u32 count = sub_02002F90(data->string); - template.tilemapTop = (u8)(12 - count); + template.top = (u8)(12 - count); template.height = (u8)(count * 2); AddWindow(data->bgConfig, &data->window, &template); FillWindowPixelRect(&data->window, 0, 0, 0, 192, 192); @@ -965,7 +965,7 @@ BOOL ov59_DisplayControlAdventureMessage(ov59_IntroOverlayData *data, u32 msgNo, else { template = ov59_021D9D90; - template.tilemapTop = (u8)tilemapTop; + template.top = (u8)tilemapTop; template.height = (u8)height; AddWindow(data->bgConfig, &data->window, &template); FillWindowPixelRect(&data->window, 0, 0, 0, 192, 192); @@ -1275,7 +1275,7 @@ void ov59_LoadPokeballButton(ov59_IntroOverlayData *data) GfGfxLoader_LoadCharData(NARC_DEMO_INTRO_INTRO, NARC_intro_pokeball_button_1_NCGR, data->bgConfig, GF_BG_LYR_SUB_2, 0x20, 0, FALSE, data->heapId); } -BOOL ov59_MoveSprite(ov59_IntroOverlayData *data, u32 layer, u32 param2) +BOOL ov59_MoveSprite(ov59_IntroOverlayData *data, enum GFBgLayer layer, u32 param2) { BOOL ret = FALSE; if (param2 == 0) diff --git a/arm9/overlays/59/src/ov59_TV.c b/arm9/overlays/59/src/ov59_TV.c index 7a7a8284c..a1e2e3a9d 100644 --- a/arm9/overlays/59/src/ov59_TV.c +++ b/arm9/overlays/59/src/ov59_TV.c @@ -23,11 +23,11 @@ extern BOOL IsPaletteFadeFinished(void); const struct WindowTemplate ov59_021DA04C = { .bgId = GF_BG_LYR_MAIN_2, - .tilemapLeft = 0, - .tilemapTop = 0, + .left = 0, + .top = 0, .width = 32, .height = 24, - .paletteNum = 0x01, + .palette = 1, .baseTile = 1, }; diff --git a/arm9/overlays/75/asm/overlay_75.s b/arm9/overlays/75/asm/overlay_75.s index ca5b0f189..1257ca509 100644 --- a/arm9/overlays/75/asm/overlay_75.s +++ b/arm9/overlays/75/asm/overlay_75.s @@ -6707,7 +6707,7 @@ ov75_021EA0CC: ; 0x021EA0CC ldr r0, [r4] add r5, r1, #0 mov r1, #7 - bl GetBgAffineRotation + bl GetBgRotation lsl r0, r0, #0x10 asr r0, r0, #0x10 add r0, r0, r5 diff --git a/arm9/overlays/83/asm/overlay_83.s b/arm9/overlays/83/asm/overlay_83.s index 87fb2c5f2..2e9187593 100644 --- a/arm9/overlays/83/asm/overlay_83.s +++ b/arm9/overlays/83/asm/overlay_83.s @@ -1477,11 +1477,11 @@ _0222E104: beq _0222E188 ldr r0, [sp, #0x2c] mov r1, #3 - bl MoveWindowX + bl SetWindowX lsl r1, r5, #0x18 ldr r0, [sp, #0x2c] lsr r1, r1, #0x18 - bl MoveWindowY + bl SetWindowY ldr r2, [sp, #0x54] ldr r3, [sp, #0x58] lsl r2, r2, #0x10 @@ -23228,7 +23228,7 @@ _02238A8A: add r0, r1, #0 lsl r1, r6, #0x18 lsr r1, r1, #0x18 - bl MoveWindowX + bl SetWindowX _02238A9C: mov r0, #0 mvn r0, r0 @@ -23237,7 +23237,7 @@ _02238A9C: lsl r1, r5, #0x18 ldr r0, [r4, #0x10] lsr r1, r1, #0x18 - bl MoveWindowY + bl SetWindowY _02238AAE: ldr r1, [sp, #0x28] add r0, r4, #0 diff --git a/arm9/src/GX_layers.c b/arm9/src/GX_layers.c index 525e4d85a..5ae258291 100644 --- a/arm9/src/GX_layers.c +++ b/arm9/src/GX_layers.c @@ -40,7 +40,7 @@ void GX_DisableEngineALayers() EngineA_DISPCNT_LayerMask = 0; } -void GX_EngineAToggleLayers(u32 layer_mask, GX_LayerToggle layer_toggle) +void GX_EngineAToggleLayers(u32 layer_mask, GXLayerToggle layer_toggle) { if (layer_toggle == GX_LAYER_TOGGLE_ON) { @@ -71,7 +71,7 @@ void GX_DisableEngineBLayers() EngineB_DISPCNT_LayerMask = 0; } -void GX_EngineBToggleLayers(u32 layer_mask, GX_LayerToggle layer_toggle) +void GX_EngineBToggleLayers(u32 layer_mask, GXLayerToggle layer_toggle) { if (layer_toggle == GX_LAYER_TOGGLE_ON) { diff --git a/arm9/src/bg_window.c b/arm9/src/bg_window.c index 91bafa246..0220dbefd 100644 --- a/arm9/src/bg_window.c +++ b/arm9/src/bg_window.c @@ -4,6 +4,44 @@ #include "game_init.h" #include "gx.h" #include "heap.h" +#include "MI_uncompress.h" + +static u8 TranslateGFBgModePairToGXScreenSize(enum GFBgScreenSize size, enum GFBgType type); +static void GetBgScreenDimensions(u32 screenSize, u8 *widthPtr, u8 *heightPtr); +static void Bg_SetPosText(Background *bg, enum BgPosAdjustOp op, fx32 val); +static void BgAffineReset(BgConfig *bgConfig, u8 bgId); +static void CopyOrUncompressTilemapData(const void *src, void *dest, u32 size); +static void LoadBgVramScr(u8 bgId, const void *data, u32 offset, u32 size); +static void BG_LoadCharPixelData(BgConfig *bgConfig, u8 bgId, const void *buffer, u32 size, u32 offset); +static void LoadBgVramChar(u8 bgId, const void *data, u32 offset, u32 size); +static u16 GetTileMapIndexFromCoords(u8 x, u8 y, u8 size); +static u16 GetSrcTileMapIndexFromCoords(u8 x, u8 y, u8 width, u8 height); +static void CopyToBgTilemapRectText(Background *bg, u8 destX, u8 destY, u8 destWidth, u8 destHeight, const u16 *buffer, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 mode); +static void CopyBgTilemapRectAffine(Background *bg, u8 destX, u8 destY, u8 destWidth, u8 destHeight, const u8 *buffer, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 mode); +static void FillBgTilemapRectText(Background *bg, u16 fillValue, u8 x, u8 y, u8 width, u8 height, u8 mode); +static void FillBgTilemapRectAffine(Background *bg, u8 fillValue, u8 x, u8 y, u8 width, u8 height); +static void Convert4bppTo8bppInternal(u8 *src4bpp, u32 size, u8 *dest8bpp, u8 paletteNum); +static void BlitBitmapRect8Bit(const struct Bitmap *src, const struct Bitmap *dest, u16 srcX, u16 srcY, u16 destX, u16 destY, u16 width, u16 height, u16 colorKey); +static void FillBitmapRect4Bit(const Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue); +static void PutWindowTilemap_TextMode(Window *window); +static void PutWindowTilemap_AffineMode(Window *window); +static void ClearWindowTilemapText(Window *window); +static void ClearWindowTilemapAffine(Window *window); +static void CopyWindowToVram_TextMode(Window *window); +static void ScheduleWindowCopyToVram_TextMode(Window *window); +static void CopyWindowToVram_AffineMode(Window *window); +static void ScheduleWindowCopyToVram_AffineMode(Window *window); +static void ClearWindowTilemapAndCopyToVram_TextMode(Window *window); +static void ClearWindowTilemapAndScheduleTransfer_TextMode(Window *window); +static void ClearWindowTilemapAndCopyToVram_AffineMode(Window *window); +static void ClearWindowTilemapAndScheduleTransfer_AffineMode(Window *window); +static void ScrollWindow4bpp(Window *window, u8 direction, u8 y, u8 fillValue); +static void ScrollWindow8bpp(Window *window, u8 direction, u8 y, u8 fillValue); +static void BgConfig_HandleScheduledBufferTransfers(BgConfig *bgConfig); +static void BgConfig_HandleScheduledScrolls(BgConfig *bgConfig); +static void Bg_SetAffineRotation(Background *bg, enum BgPosAdjustOp op, u16 val); +static void Bg_SetAffinePos(Background *bg, enum BgPosAdjustOp op, fx32 val); +static void ApplyFlipFlagsToTile(BgConfig *bgConfig, u8 flags, u8 *tile); static const u8 sTilemapWidthByBufferSize[] = { [GF_BG_SCR_SIZE_128x128] = 0x10, @@ -14,60 +52,58 @@ static const u8 sTilemapWidthByBufferSize[] = { [GF_BG_SCR_SIZE_1024x1024] = 0x20, }; -void (*const sScheduleWindowCopyToVramFuncs[])(struct Window *) = { +static void (*const sScheduleWindowCopyToVramFuncs[])(Window *window) = { ScheduleWindowCopyToVram_TextMode, ScheduleWindowCopyToVram_AffineMode, ScheduleWindowCopyToVram_TextMode, }; -void (*const sClearWindowTilemapAndCopyToVramFuncs[])(struct Window *) = { +static void (*const sClearWindowTilemapAndCopyToVramFuncs[])(Window *) = { ClearWindowTilemapAndCopyToVram_TextMode, ClearWindowTilemapAndCopyToVram_AffineMode, ClearWindowTilemapAndCopyToVram_TextMode, }; -void (*const sClearWindowTilemapAndScheduleTransferFuncs[])(struct Window *) = { +static void (*const sClearWindowTilemapAndScheduleTransferFuncs[])(Window *) = { ClearWindowTilemapAndScheduleTransfer_TextMode, ClearWindowTilemapAndScheduleTransfer_AffineMode, ClearWindowTilemapAndScheduleTransfer_TextMode, }; -void (*const sPutWindowTilemapFuncs[])(struct Window *) = { +static void (*const sPutWindowTilemapFuncs[])(Window *) = { PutWindowTilemap_TextMode, PutWindowTilemap_AffineMode, PutWindowTilemap_TextMode, }; -void (*const sCopyWindowToVramFuncs[])(struct Window *) = { +static void (*const sCopyWindowToVramFuncs[])(Window *) = { CopyWindowToVram_TextMode, CopyWindowToVram_AffineMode, CopyWindowToVram_TextMode, }; -void (*const sClearWindowTilemapFuncs[])(struct Window *) = { +static void (*const sClearWindowTilemapFuncs[])(Window *) = { ClearWindowTilemapText, ClearWindowTilemapAffine, ClearWindowTilemapText, }; -struct BgConfig *BgConfig_Alloc(HeapID heapId) -{ - struct BgConfig *ptr = AllocFromHeap(heapId, sizeof(struct BgConfig)); - memset(ptr, 0, sizeof(struct BgConfig)); - ptr->heapId = heapId; - ptr->scrollScheduled = 0; - ptr->bufferTransferScheduled = 0; - - return ptr; +// Make a new BgConfig object, which manages the +// eight background layers (four on each screen). +BgConfig *BgConfig_Alloc(HeapID heapId) { + BgConfig *ret = AllocFromHeap(heapId, sizeof(BgConfig)); + memset(ret, 0, sizeof(BgConfig)); + ret->heapId = heapId; + ret->scrollScheduled = 0; // redundant to above memset + ret->bufferTransferScheduled = 0; // redundant to above memset + return ret; } -HeapID BgConfig_GetHeapId(struct BgConfig *bgConfig) -{ +HeapID BgConfig_GetHeapId(BgConfig *bgConfig) { return bgConfig->heapId; } -void SetBothScreensModesAndDisable(const struct GraphicsModes *modes) -{ +void SetBothScreensModesAndDisable(const GraphicsModes *modes) { GX_SetGraphicsMode(modes->dispMode, modes->bgMode, modes->_2d3dMode); GXS_SetGraphicsMode(modes->subMode); GX_SetBGScrOffset(GX_BGSCROFFSET_0x00000); @@ -77,129 +113,119 @@ void SetBothScreensModesAndDisable(const struct GraphicsModes *modes) GX_DisableEngineBLayers(); } -void SetScreenModeAndDisable(const struct GraphicsModes *gfxModes, u32 whichScreen) -{ - if (whichScreen == 0) - { +void SetScreenModeAndDisable(const struct GraphicsModes *gfxModes, enum GFScreen screen) { + if (screen == SCREEN_MAIN) { GX_SetGraphicsMode(gfxModes->dispMode, gfxModes->bgMode, gfxModes->_2d3dMode); GX_DisableEngineALayers(); - } - else - { + } else { GXS_SetGraphicsMode(gfxModes->subMode); GX_DisableEngineBLayers(); } } -void InitBgFromTemplate( - struct BgConfig *bgConfig, u8 bgId, const struct BgTemplate *template, u8 bgMode) -{ +void InitBgFromTemplate(BgConfig *bgConfig, u8 bgId, const BgTemplate *template, u8 bgMode) { u8 screenSize = TranslateGFBgModePairToGXScreenSize((enum GFBgScreenSize)template->size, (enum GFBgType)bgMode); - switch (bgId) - { - case GF_BG_LYR_MAIN_0: - GX_EngineAToggleLayers(GF_BG_LYR_MAIN_0_F, GX_LAYER_TOGGLE_ON); - G2_SetBG0Control((GXBGScrSizeText)screenSize, (GXBGColorMode)template->colorMode, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase, (GXBGExtPltt)template->bgExtPltt); - G2_SetBG0Priority(template->priority); - G2_BG0Mosaic(template->mosaic); - break; - case GF_BG_LYR_MAIN_1: - GX_EngineAToggleLayers(GF_BG_LYR_MAIN_1_F, GX_LAYER_TOGGLE_ON); - G2_SetBG1Control((GXBGScrSizeText)screenSize, (GXBGColorMode)template->colorMode, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase, (GXBGExtPltt)template->bgExtPltt); - G2_SetBG1Priority(template->priority); - G2_BG1Mosaic(template->mosaic); - break; + switch (bgId) { + case GF_BG_LYR_MAIN_0: + GX_EngineAToggleLayers(GF_BG_LYR_MAIN_0_F, GX_LAYER_TOGGLE_ON); + G2_SetBG0Control((GXBGScrSizeText)screenSize, (GXBGColorMode)template->colorMode, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase, (GXBGExtPltt)template->bgExtPltt); + G2_SetBG0Priority(template->priority); + G2_BG0Mosaic(template->mosaic); + break; - case GF_BG_LYR_MAIN_2: - GX_EngineAToggleLayers(GF_BG_LYR_MAIN_2_F, GX_LAYER_TOGGLE_ON); - switch (bgMode) - { - default: - case GF_BG_TYPE_TEXT: - G2_SetBG2ControlText((GXBGScrSizeText)screenSize, (GXBGColorMode)template->colorMode, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); + case GF_BG_LYR_MAIN_1: + GX_EngineAToggleLayers(GF_BG_LYR_MAIN_1_F, GX_LAYER_TOGGLE_ON); + G2_SetBG1Control((GXBGScrSizeText)screenSize, (GXBGColorMode)template->colorMode, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase, (GXBGExtPltt)template->bgExtPltt); + G2_SetBG1Priority(template->priority); + G2_BG1Mosaic(template->mosaic); break; - case GF_BG_TYPE_AFFINE: - G2_SetBG2ControlAffine((GXBGScrSizeAffine)screenSize, (GXBGAreaOver)template->areaOver, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); - break; - case GF_BG_TYPE_256x16PLTT: - G2_SetBG2Control256x16Pltt((GXBGScrSize256x16Pltt)screenSize, (GXBGAreaOver)template->areaOver, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); - break; - } - G2_SetBG2Priority(template->priority); - G2_BG2Mosaic(template->mosaic); - break; - case GF_BG_LYR_MAIN_3: - GX_EngineAToggleLayers(GF_BG_LYR_MAIN_3_F, GX_LAYER_TOGGLE_ON); - switch (bgMode) - { - default: - case GF_BG_TYPE_TEXT: - G2_SetBG3ControlText((GXBGScrSizeText)screenSize, (GXBGColorMode)template->colorMode, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); + case GF_BG_LYR_MAIN_2: + GX_EngineAToggleLayers(GF_BG_LYR_MAIN_2_F, GX_LAYER_TOGGLE_ON); + switch (bgMode) { + default: + case GF_BG_TYPE_TEXT: + G2_SetBG2ControlText((GXBGScrSizeText)screenSize, (GXBGColorMode)template->colorMode, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); + break; + case GF_BG_TYPE_AFFINE: + G2_SetBG2ControlAffine((GXBGScrSizeAffine)screenSize, (GXBGAreaOver)template->areaOver, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); + break; + case GF_BG_TYPE_256x16PLTT: + G2_SetBG2Control256x16Pltt((GXBGScrSize256x16Pltt)screenSize, (GXBGAreaOver)template->areaOver, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); + break; + } + G2_SetBG2Priority(template->priority); + G2_BG2Mosaic(template->mosaic); break; - case GF_BG_TYPE_AFFINE: - G2_SetBG3ControlAffine((GXBGScrSizeAffine)screenSize, (GXBGAreaOver)template->areaOver, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); - break; - case GF_BG_TYPE_256x16PLTT: - G2_SetBG3Control256x16Pltt((GXBGScrSize256x16Pltt)screenSize, (GXBGAreaOver)template->areaOver, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); - break; - } - G2_SetBG3Priority(template->priority); - G2_BG3Mosaic(template->mosaic); - break; - case GF_BG_LYR_SUB_0: - GX_EngineBToggleLayers(GF_BG_LYR_SUB_0_F, GX_LAYER_TOGGLE_ON); - G2S_SetBG0Control((GXBGScrSizeText)screenSize, (GXBGColorMode)template->colorMode, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase, (GXBGExtPltt)template->bgExtPltt); - G2S_SetBG0Priority(template->priority); - G2S_BG0Mosaic(template->mosaic); - break; + case GF_BG_LYR_MAIN_3: + GX_EngineAToggleLayers(GF_BG_LYR_MAIN_3_F, GX_LAYER_TOGGLE_ON); + switch (bgMode) { + default: + case GF_BG_TYPE_TEXT: + G2_SetBG3ControlText((GXBGScrSizeText)screenSize, (GXBGColorMode)template->colorMode, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); + break; + case GF_BG_TYPE_AFFINE: + G2_SetBG3ControlAffine((GXBGScrSizeAffine)screenSize, (GXBGAreaOver)template->areaOver, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); + break; + case GF_BG_TYPE_256x16PLTT: + G2_SetBG3Control256x16Pltt((GXBGScrSize256x16Pltt)screenSize, (GXBGAreaOver)template->areaOver, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); + break; + } + G2_SetBG3Priority(template->priority); + G2_BG3Mosaic(template->mosaic); + break; - case GF_BG_LYR_SUB_1: - GX_EngineBToggleLayers(GF_BG_LYR_SUB_1_F, GX_LAYER_TOGGLE_ON); - G2S_SetBG1Control((GXBGScrSizeText)screenSize, (GXBGColorMode)template->colorMode, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase, (GXBGExtPltt)template->bgExtPltt); - G2S_SetBG1Priority(template->priority); - G2S_BG1Mosaic(template->mosaic); - break; + case GF_BG_LYR_SUB_0: + GX_EngineBToggleLayers(GF_BG_LYR_SUB_0_F, GX_LAYER_TOGGLE_ON); + G2S_SetBG0Control((GXBGScrSizeText)screenSize, (GXBGColorMode)template->colorMode, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase, (GXBGExtPltt)template->bgExtPltt); + G2S_SetBG0Priority(template->priority); + G2S_BG0Mosaic(template->mosaic); + break; - case GF_BG_LYR_SUB_2: - GX_EngineBToggleLayers(GF_BG_LYR_SUB_2_F, GX_LAYER_TOGGLE_ON); - switch (bgMode) - { - default: - case GF_BG_TYPE_TEXT: - G2S_SetBG2ControlText((GXBGScrSizeText)screenSize, (GXBGColorMode)template->colorMode, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); + case GF_BG_LYR_SUB_1: + GX_EngineBToggleLayers(GF_BG_LYR_SUB_1_F, GX_LAYER_TOGGLE_ON); + G2S_SetBG1Control((GXBGScrSizeText)screenSize, (GXBGColorMode)template->colorMode, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase, (GXBGExtPltt)template->bgExtPltt); + G2S_SetBG1Priority(template->priority); + G2S_BG1Mosaic(template->mosaic); break; - case GF_BG_TYPE_AFFINE: - G2S_SetBG2ControlAffine((GXBGScrSizeAffine)screenSize, (GXBGAreaOver)template->areaOver, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); - break; - case GF_BG_TYPE_256x16PLTT: - G2S_SetBG2Control256x16Pltt((GXBGScrSize256x16Pltt)screenSize, (GXBGAreaOver)template->areaOver, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); - break; - } - G2S_SetBG2Priority(template->priority); - G2S_BG2Mosaic(template->mosaic); - break; - case GF_BG_LYR_SUB_3: - GX_EngineBToggleLayers(GF_BG_LYR_SUB_3_F, GX_LAYER_TOGGLE_ON); - switch (bgMode) - { - default: - case GF_BG_TYPE_TEXT: - G2S_SetBG3ControlText((GXBGScrSizeText)screenSize, (GXBGColorMode)template->colorMode, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); + case GF_BG_LYR_SUB_2: + GX_EngineBToggleLayers(GF_BG_LYR_SUB_2_F, GX_LAYER_TOGGLE_ON); + switch (bgMode) { + default: + case GF_BG_TYPE_TEXT: + G2S_SetBG2ControlText((GXBGScrSizeText)screenSize, (GXBGColorMode)template->colorMode, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); + break; + case GF_BG_TYPE_AFFINE: + G2S_SetBG2ControlAffine((GXBGScrSizeAffine)screenSize, (GXBGAreaOver)template->areaOver, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); + break; + case GF_BG_TYPE_256x16PLTT: + G2S_SetBG2Control256x16Pltt((GXBGScrSize256x16Pltt)screenSize, (GXBGAreaOver)template->areaOver, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); + break; + } + G2S_SetBG2Priority(template->priority); + G2S_BG2Mosaic(template->mosaic); break; - case GF_BG_TYPE_AFFINE: - G2S_SetBG3ControlAffine((GXBGScrSizeAffine)screenSize, (GXBGAreaOver)template->areaOver, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); + + case GF_BG_LYR_SUB_3: + GX_EngineBToggleLayers(GF_BG_LYR_SUB_3_F, GX_LAYER_TOGGLE_ON); + switch (bgMode) { + default: + case GF_BG_TYPE_TEXT: + G2S_SetBG3ControlText((GXBGScrSizeText)screenSize, (GXBGColorMode)template->colorMode, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); + break; + case GF_BG_TYPE_AFFINE: + G2S_SetBG3ControlAffine((GXBGScrSizeAffine)screenSize, (GXBGAreaOver)template->areaOver, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); + break; + case GF_BG_TYPE_256x16PLTT: + G2S_SetBG3Control256x16Pltt((GXBGScrSize256x16Pltt)screenSize, (GXBGAreaOver)template->areaOver, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); + break; + } + G2S_SetBG3Priority(template->priority); + G2S_BG3Mosaic(template->mosaic); break; - case GF_BG_TYPE_256x16PLTT: - G2S_SetBG3Control256x16Pltt((GXBGScrSize256x16Pltt)screenSize, (GXBGAreaOver)template->areaOver, (GXBGScrBase)template->screenBase, (GXBGCharBase)template->charBase); - break; - } - G2S_SetBG3Priority(template->priority); - G2S_BG3Mosaic(template->mosaic); - break; } bgConfig->bgs[bgId].rotation = 0; @@ -208,17 +234,14 @@ void InitBgFromTemplate( bgConfig->bgs[bgId].centerX = 0; bgConfig->bgs[bgId].centerY = 0; - if (template->bufferSize != 0) - { + if (template->bufferSize != 0) { bgConfig->bgs[bgId].tilemapBuffer = AllocFromHeap(bgConfig->heapId, template->bufferSize); MI_CpuClear16(bgConfig->bgs[bgId].tilemapBuffer, template->bufferSize); bgConfig->bgs[bgId].bufferSize = template->bufferSize; bgConfig->bgs[bgId].baseTile = template->baseTile; - } - else - { + } else { bgConfig->bgs[bgId].tilemapBuffer = NULL; bgConfig->bgs[bgId].bufferSize = 0; bgConfig->bgs[bgId].baseTile = 0; @@ -228,581 +251,466 @@ void InitBgFromTemplate( bgConfig->bgs[bgId].mode = bgMode; bgConfig->bgs[bgId].colorMode = template->colorMode; - if (bgMode == GF_BG_TYPE_TEXT && template->colorMode == GX_BG_COLORMODE_16) - { + if (bgMode == GF_BG_TYPE_TEXT && template->colorMode == GX_BG_COLORMODE_16) { bgConfig->bgs[bgId].tileSize = 0x20; - } - else - { + } else { bgConfig->bgs[bgId].tileSize = 0x40; } - BgSetPosTextAndCommit(bgConfig, (enum GFBgLayer)bgId, BG_POS_OP_SET_X, template->x); - BgSetPosTextAndCommit(bgConfig, (enum GFBgLayer)bgId, BG_POS_OP_SET_Y, template->y); + BgSetPosTextAndCommit(bgConfig, bgId, BG_POS_OP_SET_X, template->x); + BgSetPosTextAndCommit(bgConfig, bgId, BG_POS_OP_SET_Y, template->y); } -void SetBgControlParam(struct BgConfig *config, u8 bgId, u32 attr, u8 value) -{ - if (attr == GF_BG_CNT_SET_COLOR_MODE) - { +void SetBgControlParam(BgConfig *config, u8 bgId, enum GFBgCntSet attr, u8 value) { + if (attr == GF_BG_CNT_SET_COLOR_MODE) { config->bgs[bgId].colorMode = value; } - switch (bgId) - { - case GF_BG_LYR_MAIN_0: - GXBg01Control bg0cnt = G2_GetBG0Control(); - if (attr == GF_BG_CNT_SET_SCREEN_BASE) - { - bg0cnt.screenBase = value; - } - else if (attr == GF_BG_CNT_SET_CHAR_BASE) - { - bg0cnt.charBase = value; - } - - G2_SetBG0Control((GXBGScrSizeText)bg0cnt.screenSize, (GXBGColorMode)config->bgs[bgId].colorMode, (GXBGScrBase)bg0cnt.screenBase, (GXBGCharBase)bg0cnt.charBase, (GXBGExtPltt)bg0cnt.bgExtPltt); - break; - case GF_BG_LYR_MAIN_1: - GXBg01Control bg1cnt = G2_GetBG1Control(); - if (attr == GF_BG_CNT_SET_SCREEN_BASE) - { - bg1cnt.screenBase = value; - } - else if (attr == GF_BG_CNT_SET_CHAR_BASE) - { - bg1cnt.charBase = value; - } - - G2_SetBG1Control((GXBGScrSizeText)bg1cnt.screenSize, (GXBGColorMode)config->bgs[bgId].colorMode, (GXBGScrBase)bg1cnt.screenBase, (GXBGCharBase)bg1cnt.charBase, (GXBGExtPltt)bg1cnt.bgExtPltt); - break; - case GF_BG_LYR_MAIN_2: - switch (config->bgs[bgId].mode) - { - default: - case GF_BG_TYPE_TEXT: - GXBg23ControlText bg2cnt_tx = G2_GetBG2ControlText(); - if (attr == GF_BG_CNT_SET_SCREEN_BASE) - { - bg2cnt_tx.screenBase = value; - } - else if (attr == GF_BG_CNT_SET_CHAR_BASE) - { - bg2cnt_tx.charBase = value; + switch (bgId) { + case GF_BG_LYR_MAIN_0: + GXBg01Control bg0cnt = G2_GetBG0Control(); + if (attr == GF_BG_CNT_SET_SCREEN_BASE) { + bg0cnt.screenBase = value; + } else if (attr == GF_BG_CNT_SET_CHAR_BASE) { + bg0cnt.charBase = value; } - G2_SetBG2ControlText((GXBGScrSizeText)bg2cnt_tx.screenSize, (GXBGColorMode)config->bgs[bgId].colorMode, (GXBGScrBase)bg2cnt_tx.screenBase, (GXBGCharBase)bg2cnt_tx.charBase); + G2_SetBG0Control((GXBGScrSizeText)bg0cnt.screenSize, (GXBGColorMode)config->bgs[bgId].colorMode, (GXBGScrBase)bg0cnt.screenBase, (GXBGCharBase)bg0cnt.charBase, (GXBGExtPltt)bg0cnt.bgExtPltt); break; - case GF_BG_TYPE_AFFINE: - GXBg23ControlAffine bg2cnt_aff = G2_GetBG2ControlAffine(); - if (attr == GF_BG_CNT_SET_SCREEN_BASE) - { - bg2cnt_aff.screenBase = value; - } - else if (attr == GF_BG_CNT_SET_CHAR_BASE) - { - bg2cnt_aff.charBase = value; + case GF_BG_LYR_MAIN_1: + GXBg01Control bg1cnt = G2_GetBG1Control(); + if (attr == GF_BG_CNT_SET_SCREEN_BASE) { + bg1cnt.screenBase = value; + } else if (attr == GF_BG_CNT_SET_CHAR_BASE) { + bg1cnt.charBase = value; } - G2_SetBG2ControlAffine((GXBGScrSizeAffine)bg2cnt_aff.screenSize, (GXBGAreaOver)bg2cnt_aff.areaOver, (GXBGScrBase)bg2cnt_aff.screenBase, (GXBGCharBase)bg2cnt_aff.charBase); + G2_SetBG1Control((GXBGScrSizeText)bg1cnt.screenSize, (GXBGColorMode)config->bgs[bgId].colorMode, (GXBGScrBase)bg1cnt.screenBase, (GXBGCharBase)bg1cnt.charBase, (GXBGExtPltt)bg1cnt.bgExtPltt); break; - case GF_BG_TYPE_256x16PLTT: - GXBg23Control256x16Pltt bg2cnt_256x16pltt = G2_GetBG2Control256x16Pltt(); - if (attr == GF_BG_CNT_SET_SCREEN_BASE) - { - bg2cnt_256x16pltt.screenBase = value; - } - else if (attr == GF_BG_CNT_SET_CHAR_BASE) - { - bg2cnt_256x16pltt.charBase = value; - } + case GF_BG_LYR_MAIN_2: + switch (config->bgs[bgId].mode) { + default: + case GF_BG_TYPE_TEXT: + GXBg23ControlText bg2cnt_tx = G2_GetBG2ControlText(); + if (attr == GF_BG_CNT_SET_SCREEN_BASE) { + bg2cnt_tx.screenBase = value; + } else if (attr == GF_BG_CNT_SET_CHAR_BASE) { + bg2cnt_tx.charBase = value; + } - G2_SetBG2Control256x16Pltt((GXBGScrSize256x16Pltt)bg2cnt_256x16pltt.screenSize, (GXBGAreaOver)bg2cnt_256x16pltt.areaOver, (GXBGScrBase)bg2cnt_256x16pltt.screenBase, (GXBGCharBase)bg2cnt_256x16pltt.charBase); + G2_SetBG2ControlText((GXBGScrSizeText)bg2cnt_tx.screenSize, (GXBGColorMode)config->bgs[bgId].colorMode, (GXBGScrBase)bg2cnt_tx.screenBase, (GXBGCharBase)bg2cnt_tx.charBase); + break; + case GF_BG_TYPE_AFFINE: + GXBg23ControlAffine bg2cnt_aff = G2_GetBG2ControlAffine(); + if (attr == GF_BG_CNT_SET_SCREEN_BASE) { + bg2cnt_aff.screenBase = value; + } else if (attr == GF_BG_CNT_SET_CHAR_BASE) { + bg2cnt_aff.charBase = value; + } + + G2_SetBG2ControlAffine((GXBGScrSizeAffine)bg2cnt_aff.screenSize, (GXBGAreaOver)bg2cnt_aff.areaOver, (GXBGScrBase)bg2cnt_aff.screenBase, (GXBGCharBase)bg2cnt_aff.charBase); + break; + case GF_BG_TYPE_256x16PLTT: + GXBg23Control256x16Pltt bg2cnt_256x16pltt = G2_GetBG2Control256x16Pltt(); + if (attr == GF_BG_CNT_SET_SCREEN_BASE) { + bg2cnt_256x16pltt.screenBase = value; + } else if (attr == GF_BG_CNT_SET_CHAR_BASE) { + bg2cnt_256x16pltt.charBase = value; + } + + G2_SetBG2Control256x16Pltt((GXBGScrSize256x16Pltt)bg2cnt_256x16pltt.screenSize, (GXBGAreaOver)bg2cnt_256x16pltt.areaOver, (GXBGScrBase)bg2cnt_256x16pltt.screenBase, (GXBGCharBase)bg2cnt_256x16pltt.charBase); + break; + } break; - } - break; - case GF_BG_LYR_MAIN_3: - switch (config->bgs[bgId].mode) - { - default: - case GF_BG_TYPE_TEXT: - GXBg23ControlText bg3cnt_tx = G2_GetBG3ControlText(); - if (attr == GF_BG_CNT_SET_SCREEN_BASE) - { - bg3cnt_tx.screenBase = value; - } - else if (attr == GF_BG_CNT_SET_CHAR_BASE) - { - bg3cnt_tx.charBase = value; - } + case GF_BG_LYR_MAIN_3: + switch (config->bgs[bgId].mode) { + default: + case GF_BG_TYPE_TEXT: + GXBg23ControlText bg3cnt_tx = G2_GetBG3ControlText(); + if (attr == GF_BG_CNT_SET_SCREEN_BASE) { + bg3cnt_tx.screenBase = value; + } else if (attr == GF_BG_CNT_SET_CHAR_BASE) { + bg3cnt_tx.charBase = value; + } - G2_SetBG3ControlText((GXBGScrSizeText)bg3cnt_tx.screenSize, (GXBGColorMode)config->bgs[bgId].colorMode, (GXBGScrBase)bg3cnt_tx.screenBase, (GXBGCharBase)bg3cnt_tx.charBase); + G2_SetBG3ControlText((GXBGScrSizeText)bg3cnt_tx.screenSize, (GXBGColorMode)config->bgs[bgId].colorMode, (GXBGScrBase)bg3cnt_tx.screenBase, (GXBGCharBase)bg3cnt_tx.charBase); + break; + case GF_BG_TYPE_AFFINE: + GXBg23ControlAffine bg3cnt_aff = G2_GetBG3ControlAffine(); + if (attr == GF_BG_CNT_SET_SCREEN_BASE) { + bg3cnt_aff.screenBase = value; + } else if (attr == GF_BG_CNT_SET_CHAR_BASE) { + bg3cnt_aff.charBase = value; + } + + G2_SetBG3ControlAffine((GXBGScrSizeAffine)bg3cnt_aff.screenSize, (GXBGAreaOver)bg3cnt_aff.areaOver, (GXBGScrBase)bg3cnt_aff.screenBase, (GXBGCharBase)bg3cnt_aff.charBase); + break; + case GF_BG_TYPE_256x16PLTT: + GXBg23Control256x16Pltt bg3cnt_256x16pltt = G2_GetBG3Control256x16Pltt(); + if (attr == GF_BG_CNT_SET_SCREEN_BASE) { + bg3cnt_256x16pltt.screenBase = value; + } else if (attr == GF_BG_CNT_SET_CHAR_BASE) { + bg3cnt_256x16pltt.charBase = value; + } + + G2_SetBG3Control256x16Pltt((GXBGScrSize256x16Pltt)bg3cnt_256x16pltt.screenSize, (GXBGAreaOver)bg3cnt_256x16pltt.areaOver, (GXBGScrBase)bg3cnt_256x16pltt.screenBase, (GXBGCharBase)bg3cnt_256x16pltt.charBase); + break; + } break; - case GF_BG_TYPE_AFFINE: - GXBg23ControlAffine bg3cnt_aff = G2_GetBG3ControlAffine(); - if (attr == GF_BG_CNT_SET_SCREEN_BASE) - { - bg3cnt_aff.screenBase = value; - } - else if (attr == GF_BG_CNT_SET_CHAR_BASE) - { - bg3cnt_aff.charBase = value; + case GF_BG_LYR_SUB_0: + GXBg01Control bg0cntsub = G2S_GetBG0Control(); + if (attr == GF_BG_CNT_SET_SCREEN_BASE) { + bg0cntsub.screenBase = value; + } else if (attr == GF_BG_CNT_SET_CHAR_BASE) { + bg0cntsub.charBase = value; } - G2_SetBG3ControlAffine((GXBGScrSizeAffine)bg3cnt_aff.screenSize, (GXBGAreaOver)bg3cnt_aff.areaOver, (GXBGScrBase)bg3cnt_aff.screenBase, (GXBGCharBase)bg3cnt_aff.charBase); + G2S_SetBG0Control((GXBGScrSizeText)bg0cntsub.screenSize, (GXBGColorMode)config->bgs[bgId].colorMode, (GXBGScrBase)bg0cntsub.screenBase, (GXBGCharBase)bg0cntsub.charBase, (GXBGExtPltt)bg0cntsub.bgExtPltt); break; - case GF_BG_TYPE_256x16PLTT: - GXBg23Control256x16Pltt bg3cnt_256x16pltt = G2_GetBG3Control256x16Pltt(); - if (attr == GF_BG_CNT_SET_SCREEN_BASE) - { - bg3cnt_256x16pltt.screenBase = value; - } - else if (attr == GF_BG_CNT_SET_CHAR_BASE) - { - bg3cnt_256x16pltt.charBase = value; + case GF_BG_LYR_SUB_1: + GXBg01Control bg1cntsub = G2S_GetBG1Control(); + if (attr == GF_BG_CNT_SET_SCREEN_BASE) { + bg1cntsub.screenBase = value; + } else if (attr == GF_BG_CNT_SET_CHAR_BASE) { + bg1cntsub.charBase = value; } - G2_SetBG3Control256x16Pltt((GXBGScrSize256x16Pltt)bg3cnt_256x16pltt.screenSize, (GXBGAreaOver)bg3cnt_256x16pltt.areaOver, (GXBGScrBase)bg3cnt_256x16pltt.screenBase, (GXBGCharBase)bg3cnt_256x16pltt.charBase); + G2S_SetBG1Control((GXBGScrSizeText)bg1cntsub.screenSize, (GXBGColorMode)config->bgs[bgId].colorMode, (GXBGScrBase)bg1cntsub.screenBase, (GXBGCharBase)bg1cntsub.charBase, (GXBGExtPltt)bg1cntsub.bgExtPltt); break; - } - break; - case GF_BG_LYR_SUB_0: - GXBg01Control bg0cntsub = G2S_GetBG0Control(); - if (attr == GF_BG_CNT_SET_SCREEN_BASE) - { - bg0cntsub.screenBase = value; - } - else if (attr == GF_BG_CNT_SET_CHAR_BASE) - { - bg0cntsub.charBase = value; - } + case GF_BG_LYR_SUB_2: + switch (config->bgs[bgId].mode) { + default: + case GF_BG_TYPE_TEXT: + GXBg23ControlText bg2cntsub_tx = G2S_GetBG2ControlText(); + if (attr == GF_BG_CNT_SET_SCREEN_BASE) { + bg2cntsub_tx.screenBase = value; + } else if (attr == GF_BG_CNT_SET_CHAR_BASE) { + bg2cntsub_tx.charBase = value; + } - G2S_SetBG0Control((GXBGScrSizeText)bg0cntsub.screenSize, (GXBGColorMode)config->bgs[bgId].colorMode, (GXBGScrBase)bg0cntsub.screenBase, (GXBGCharBase)bg0cntsub.charBase, (GXBGExtPltt)bg0cntsub.bgExtPltt); - break; - case GF_BG_LYR_SUB_1: - GXBg01Control bg1cntsub = G2S_GetBG1Control(); - if (attr == GF_BG_CNT_SET_SCREEN_BASE) - { - bg1cntsub.screenBase = value; - } - else if (attr == GF_BG_CNT_SET_CHAR_BASE) - { - bg1cntsub.charBase = value; - } + G2S_SetBG2ControlText((GXBGScrSizeText)bg2cntsub_tx.screenSize, (GXBGColorMode)config->bgs[bgId].colorMode, (GXBGScrBase)bg2cntsub_tx.screenBase, (GXBGCharBase)bg2cntsub_tx.charBase); + break; + case GF_BG_TYPE_AFFINE: + GXBg23ControlAffine bg2cntsub_aff = G2S_GetBG2ControlAffine(); + if (attr == GF_BG_CNT_SET_SCREEN_BASE) { + bg2cntsub_aff.screenBase = value; + } else if (attr == GF_BG_CNT_SET_CHAR_BASE) { + bg2cntsub_aff.charBase = value; + } - G2S_SetBG1Control((GXBGScrSizeText)bg1cntsub.screenSize, (GXBGColorMode)config->bgs[bgId].colorMode, (GXBGScrBase)bg1cntsub.screenBase, (GXBGCharBase)bg1cntsub.charBase, (GXBGExtPltt)bg1cntsub.bgExtPltt); - break; - case GF_BG_LYR_SUB_2: - switch (config->bgs[bgId].mode) - { - default: - case GF_BG_TYPE_TEXT: - GXBg23ControlText bg2cntsub_tx = G2S_GetBG2ControlText(); - if (attr == GF_BG_CNT_SET_SCREEN_BASE) - { - bg2cntsub_tx.screenBase = value; + G2S_SetBG2ControlAffine((GXBGScrSizeAffine)bg2cntsub_aff.screenSize, (GXBGAreaOver)bg2cntsub_aff.areaOver, (GXBGScrBase)bg2cntsub_aff.screenBase, (GXBGCharBase)bg2cntsub_aff.charBase); + break; + case GF_BG_TYPE_256x16PLTT: + GXBg23Control256x16Pltt bg2cntsub_256x16pltt = G2S_GetBG2Control256x16Pltt(); + if (attr == GF_BG_CNT_SET_SCREEN_BASE) { + bg2cntsub_256x16pltt.screenBase = value; + } else if (attr == GF_BG_CNT_SET_CHAR_BASE) { + bg2cntsub_256x16pltt.charBase = value; + } + + G2S_SetBG2Control256x16Pltt((GXBGScrSize256x16Pltt)bg2cntsub_256x16pltt.screenSize, (GXBGAreaOver)bg2cntsub_256x16pltt.areaOver, (GXBGScrBase)bg2cntsub_256x16pltt.screenBase, (GXBGCharBase)bg2cntsub_256x16pltt.charBase); + break; } - else if (attr == GF_BG_CNT_SET_CHAR_BASE) - { - bg2cntsub_tx.charBase = value; - } - - G2S_SetBG2ControlText((GXBGScrSizeText)bg2cntsub_tx.screenSize, (GXBGColorMode)config->bgs[bgId].colorMode, (GXBGScrBase)bg2cntsub_tx.screenBase, (GXBGCharBase)bg2cntsub_tx.charBase); break; - case GF_BG_TYPE_AFFINE: - GXBg23ControlAffine bg2cntsub_aff = G2S_GetBG2ControlAffine(); - if (attr == GF_BG_CNT_SET_SCREEN_BASE) - { - bg2cntsub_aff.screenBase = value; - } - else if (attr == GF_BG_CNT_SET_CHAR_BASE) - { - bg2cntsub_aff.charBase = value; - } + case GF_BG_LYR_SUB_3: + switch (config->bgs[bgId].mode) { + default: + case GF_BG_TYPE_TEXT: + GXBg23ControlText bg3cntsub_tx = G2S_GetBG3ControlText(); + if (attr == GF_BG_CNT_SET_SCREEN_BASE) { + bg3cntsub_tx.screenBase = value; + } else if (attr == GF_BG_CNT_SET_CHAR_BASE) { + bg3cntsub_tx.charBase = value; + } - G2S_SetBG2ControlAffine((GXBGScrSizeAffine)bg2cntsub_aff.screenSize, (GXBGAreaOver)bg2cntsub_aff.areaOver, (GXBGScrBase)bg2cntsub_aff.screenBase, (GXBGCharBase)bg2cntsub_aff.charBase); - break; - case GF_BG_TYPE_256x16PLTT: - GXBg23Control256x16Pltt bg2cntsub_256x16pltt = G2S_GetBG2Control256x16Pltt(); - if (attr == GF_BG_CNT_SET_SCREEN_BASE) - { - bg2cntsub_256x16pltt.screenBase = value; - } - else if (attr == GF_BG_CNT_SET_CHAR_BASE) - { - bg2cntsub_256x16pltt.charBase = value; - } + G2S_SetBG3ControlText((GXBGScrSizeText)bg3cntsub_tx.screenSize, (GXBGColorMode)config->bgs[bgId].colorMode, (GXBGScrBase)bg3cntsub_tx.screenBase, (GXBGCharBase)bg3cntsub_tx.charBase); + break; + case GF_BG_TYPE_AFFINE: + GXBg23ControlAffine bg3cntsub_aff = G2S_GetBG3ControlAffine(); + if (attr == GF_BG_CNT_SET_SCREEN_BASE) { + bg3cntsub_aff.screenBase = value; + } else if (attr == GF_BG_CNT_SET_CHAR_BASE) { + bg3cntsub_aff.charBase = value; + } - G2S_SetBG2Control256x16Pltt((GXBGScrSize256x16Pltt)bg2cntsub_256x16pltt.screenSize, (GXBGAreaOver)bg2cntsub_256x16pltt.areaOver, (GXBGScrBase)bg2cntsub_256x16pltt.screenBase, (GXBGCharBase)bg2cntsub_256x16pltt.charBase); - break; - } - break; - case GF_BG_LYR_SUB_3: - switch (config->bgs[bgId].mode) - { - default: - case GF_BG_TYPE_TEXT: - GXBg23ControlText bg3cntsub_tx = G2S_GetBG3ControlText(); - if (attr == GF_BG_CNT_SET_SCREEN_BASE) - { - bg3cntsub_tx.screenBase = value; - } - else if (attr == GF_BG_CNT_SET_CHAR_BASE) - { - bg3cntsub_tx.charBase = value; - } + G2S_SetBG3ControlAffine((GXBGScrSizeAffine)bg3cntsub_aff.screenSize, (GXBGAreaOver)bg3cntsub_aff.areaOver, (GXBGScrBase)bg3cntsub_aff.screenBase, (GXBGCharBase)bg3cntsub_aff.charBase); + break; + case GF_BG_TYPE_256x16PLTT: + GXBg23Control256x16Pltt bg3cntsub_256x16pltt = G2S_GetBG3Control256x16Pltt(); + if (attr == GF_BG_CNT_SET_SCREEN_BASE) { + bg3cntsub_256x16pltt.screenBase = value; + } else if (attr == GF_BG_CNT_SET_CHAR_BASE) { + bg3cntsub_256x16pltt.charBase = value; + } - G2S_SetBG3ControlText((GXBGScrSizeText)bg3cntsub_tx.screenSize, (GXBGColorMode)config->bgs[bgId].colorMode, (GXBGScrBase)bg3cntsub_tx.screenBase, (GXBGCharBase)bg3cntsub_tx.charBase); + G2S_SetBG3Control256x16Pltt((GXBGScrSize256x16Pltt)bg3cntsub_256x16pltt.screenSize, (GXBGAreaOver)bg3cntsub_256x16pltt.areaOver, (GXBGScrBase)bg3cntsub_256x16pltt.screenBase, (GXBGCharBase)bg3cntsub_256x16pltt.charBase); + break; + } break; - case GF_BG_TYPE_AFFINE: - GXBg23ControlAffine bg3cntsub_aff = G2S_GetBG3ControlAffine(); - if (attr == GF_BG_CNT_SET_SCREEN_BASE) - { - bg3cntsub_aff.screenBase = value; - } - else if (attr == GF_BG_CNT_SET_CHAR_BASE) - { - bg3cntsub_aff.charBase = value; - } - - G2S_SetBG3ControlAffine((GXBGScrSizeAffine)bg3cntsub_aff.screenSize, (GXBGAreaOver)bg3cntsub_aff.areaOver, (GXBGScrBase)bg3cntsub_aff.screenBase, (GXBGCharBase)bg3cntsub_aff.charBase); - break; - case GF_BG_TYPE_256x16PLTT: - GXBg23Control256x16Pltt bg3cntsub_256x16pltt = G2S_GetBG3Control256x16Pltt(); - if (attr == GF_BG_CNT_SET_SCREEN_BASE) - { - bg3cntsub_256x16pltt.screenBase = value; - } - else if (attr == GF_BG_CNT_SET_CHAR_BASE) - { - bg3cntsub_256x16pltt.charBase = value; - } - - G2S_SetBG3Control256x16Pltt((GXBGScrSize256x16Pltt)bg3cntsub_256x16pltt.screenSize, (GXBGAreaOver)bg3cntsub_256x16pltt.areaOver, (GXBGScrBase)bg3cntsub_256x16pltt.screenBase, (GXBGCharBase)bg3cntsub_256x16pltt.charBase); - break; - } - break; } } -u8 TranslateGFBgModePairToGXScreenSize(enum GFBgScreenSize size, enum GFBgType type) -{ - switch (type) - { - case GF_BG_TYPE_TEXT: +static u8 TranslateGFBgModePairToGXScreenSize(enum GFBgScreenSize size, enum GFBgType type) { + switch (type) { + case GF_BG_TYPE_TEXT: + if (size == GF_BG_SCR_SIZE_256x256) { + return GX_BG_SCRSIZE_TEXT_256x256; + } else if (size == GF_BG_SCR_SIZE_256x512) { + return GX_BG_SCRSIZE_TEXT_256x512; + } else if (size == GF_BG_SCR_SIZE_512x256) { + return GX_BG_SCRSIZE_TEXT_512x256; + } else if (size == GF_BG_SCR_SIZE_512x512) { + return GX_BG_SCRSIZE_TEXT_512x512; + } + break; - if (size == GF_BG_SCR_SIZE_256x256) - { - return GX_BG_SCRSIZE_TEXT_256x256; - } - else if (size == GF_BG_SCR_SIZE_256x512) - { - return GX_BG_SCRSIZE_TEXT_256x512; - } - else if (size == GF_BG_SCR_SIZE_512x256) - { - return GX_BG_SCRSIZE_TEXT_512x256; - } - else if (size == GF_BG_SCR_SIZE_512x512) - { - return GX_BG_SCRSIZE_TEXT_512x512; - } - break; + case GF_BG_TYPE_AFFINE: + if (size == GF_BG_SCR_SIZE_128x128) { + return GX_BG_SCRSIZE_AFFINE_128x128; + } else if (size == GF_BG_SCR_SIZE_256x256) { + return GX_BG_SCRSIZE_AFFINE_256x256; + } else if (size == GF_BG_SCR_SIZE_512x512) { + return GX_BG_SCRSIZE_AFFINE_512x512; + } else if (size == GF_BG_SCR_SIZE_1024x1024) { + return GX_BG_SCRSIZE_AFFINE_1024x1024; + } + break; - case GF_BG_TYPE_AFFINE: - - if (size == GF_BG_SCR_SIZE_128x128) - { - return GX_BG_SCRSIZE_AFFINE_128x128; - } - else if (size == GF_BG_SCR_SIZE_256x256) - { - return GX_BG_SCRSIZE_AFFINE_256x256; - } - else if (size == GF_BG_SCR_SIZE_512x512) - { - return GX_BG_SCRSIZE_AFFINE_512x512; - } - else if (size == GF_BG_SCR_SIZE_1024x1024) - { - return GX_BG_SCRSIZE_AFFINE_1024x1024; - } - break; - - case GF_BG_TYPE_256x16PLTT: - - if (size == GF_BG_SCR_SIZE_128x128) - { - return GX_BG_SCRSIZE_256x16PLTT_128x128; - } - else if (size == GF_BG_SCR_SIZE_256x256) - { - return GX_BG_SCRSIZE_256x16PLTT_256x256; - } - else if (size == GF_BG_SCR_SIZE_512x512) - { - return GX_BG_SCRSIZE_256x16PLTT_512x512; - } - else if (size == GF_BG_SCR_SIZE_1024x1024) - { - return GX_BG_SCRSIZE_256x16PLTT_1024x1024; - } - break; + case GF_BG_TYPE_256x16PLTT: + if (size == GF_BG_SCR_SIZE_128x128) { + return GX_BG_SCRSIZE_256x16PLTT_128x128; + } else if (size == GF_BG_SCR_SIZE_256x256) { + return GX_BG_SCRSIZE_256x16PLTT_256x256; + } else if (size == GF_BG_SCR_SIZE_512x512) { + return GX_BG_SCRSIZE_256x16PLTT_512x512; + } else if (size == GF_BG_SCR_SIZE_1024x1024) { + return GX_BG_SCRSIZE_256x16PLTT_1024x1024; + } + break; } return GX_BG_SCRSIZE_TEXT_256x256; // GX_BG_SCRSIZE_AFFINE_128x128; GX_BG_SCRSIZE_256x16PLTT_128x128; } -void GetBgScreenDimensions(u32 screenSize, u8 *width_p, u8 *height_p) -{ - switch (screenSize) - { - case GF_BG_SCR_SIZE_128x128: - *width_p = 0x10; - *height_p = 0x10; - break; - case GF_BG_SCR_SIZE_256x256: - *width_p = 0x20; - *height_p = 0x20; - break; - case GF_BG_SCR_SIZE_256x512: - *width_p = 0x20; - *height_p = 0x40; - break; - case GF_BG_SCR_SIZE_512x256: - *width_p = 0x40; - *height_p = 0x20; - break; - case GF_BG_SCR_SIZE_512x512: - *width_p = 0x40; - *height_p = 0x40; - break; - case GF_BG_SCR_SIZE_1024x1024: - *width_p = 0x80; - *height_p = 0x80; - break; +static void GetBgScreenDimensions(u32 screenSize, u8 *widthPtr, u8 *heightPtr) { + switch (screenSize) { + case GF_BG_SCR_SIZE_128x128: + *widthPtr = 0x10; + *heightPtr = 0x10; + break; + case GF_BG_SCR_SIZE_256x256: + *widthPtr = 0x20; + *heightPtr = 0x20; + break; + case GF_BG_SCR_SIZE_256x512: + *widthPtr = 0x20; + *heightPtr = 0x40; + break; + case GF_BG_SCR_SIZE_512x256: + *widthPtr = 0x40; + *heightPtr = 0x20; + break; + case GF_BG_SCR_SIZE_512x512: + *widthPtr = 0x40; + *heightPtr = 0x40; + break; + case GF_BG_SCR_SIZE_1024x1024: + *widthPtr = 0x80; + *heightPtr = 0x80; + break; } } -void FreeBgTilemapBuffer(struct BgConfig *bgConfig, u32 bgId) -{ - if (bgConfig->bgs[bgId].tilemapBuffer != NULL) - { +void FreeBgTilemapBuffer(BgConfig *bgConfig, u8 bgId) { + if (bgConfig->bgs[bgId].tilemapBuffer != NULL) { FreeToHeap(bgConfig->bgs[bgId].tilemapBuffer); bgConfig->bgs[bgId].tilemapBuffer = NULL; } } -void SetBgPriority(u32 bgId, u16 priority) -{ - switch (bgId) - { - case GF_BG_LYR_MAIN_0: - G2_SetBG0Priority(priority); - break; - case GF_BG_LYR_MAIN_1: - G2_SetBG1Priority(priority); - break; - case GF_BG_LYR_MAIN_2: - G2_SetBG2Priority(priority); - break; - case GF_BG_LYR_MAIN_3: - G2_SetBG3Priority(priority); - break; - case GF_BG_LYR_SUB_0: - G2S_SetBG0Priority(priority); - break; - case GF_BG_LYR_SUB_1: - G2S_SetBG1Priority(priority); - break; - case GF_BG_LYR_SUB_2: - G2S_SetBG2Priority(priority); - break; - case GF_BG_LYR_SUB_3: - G2S_SetBG3Priority(priority); - break; +void SetBgPriority(u8 bgId, u16 priority) { + switch (bgId) { + case GF_BG_LYR_MAIN_0: + G2_SetBG0Priority(priority); + break; + case GF_BG_LYR_MAIN_1: + G2_SetBG1Priority(priority); + break; + case GF_BG_LYR_MAIN_2: + G2_SetBG2Priority(priority); + break; + case GF_BG_LYR_MAIN_3: + G2_SetBG3Priority(priority); + break; + case GF_BG_LYR_SUB_0: + G2S_SetBG0Priority(priority); + break; + case GF_BG_LYR_SUB_1: + G2S_SetBG1Priority(priority); + break; + case GF_BG_LYR_SUB_2: + G2S_SetBG2Priority(priority); + break; + case GF_BG_LYR_SUB_3: + G2S_SetBG3Priority(priority); + break; } } -void ToggleBgLayer(u32 bgId, GX_LayerToggle toggle) +void ToggleBgLayer(u8 bgId, GXLayerToggle toggle) { - switch (bgId) - { - case GF_BG_LYR_MAIN_0: - GX_EngineAToggleLayers(GF_BG_LYR_MAIN_0_F, toggle); - break; - case GF_BG_LYR_MAIN_1: - GX_EngineAToggleLayers(GF_BG_LYR_MAIN_1_F, toggle); - break; - case GF_BG_LYR_MAIN_2: - GX_EngineAToggleLayers(GF_BG_LYR_MAIN_2_F, toggle); - break; - case GF_BG_LYR_MAIN_3: - GX_EngineAToggleLayers(GF_BG_LYR_MAIN_3_F, toggle); - break; - case GF_BG_LYR_SUB_0: - GX_EngineBToggleLayers(GF_BG_LYR_SUB_0_F, toggle); - break; - case GF_BG_LYR_SUB_1: - GX_EngineBToggleLayers(GF_BG_LYR_SUB_1_F, toggle); - break; - case GF_BG_LYR_SUB_2: - GX_EngineBToggleLayers(GF_BG_LYR_SUB_2_F, toggle); - break; - case GF_BG_LYR_SUB_3: - GX_EngineBToggleLayers(GF_BG_LYR_SUB_3_F, toggle); - break; + switch (bgId) { + case GF_BG_LYR_MAIN_0: + GX_EngineAToggleLayers(GF_BG_LYR_MAIN_0_F, toggle); + break; + case GF_BG_LYR_MAIN_1: + GX_EngineAToggleLayers(GF_BG_LYR_MAIN_1_F, toggle); + break; + case GF_BG_LYR_MAIN_2: + GX_EngineAToggleLayers(GF_BG_LYR_MAIN_2_F, toggle); + break; + case GF_BG_LYR_MAIN_3: + GX_EngineAToggleLayers(GF_BG_LYR_MAIN_3_F, toggle); + break; + case GF_BG_LYR_SUB_0: + GX_EngineBToggleLayers(GF_BG_LYR_SUB_0_F, toggle); + break; + case GF_BG_LYR_SUB_1: + GX_EngineBToggleLayers(GF_BG_LYR_SUB_1_F, toggle); + break; + case GF_BG_LYR_SUB_2: + GX_EngineBToggleLayers(GF_BG_LYR_SUB_2_F, toggle); + break; + case GF_BG_LYR_SUB_3: + GX_EngineBToggleLayers(GF_BG_LYR_SUB_3_F, toggle); + break; } } -void BgSetPosTextAndCommit(struct BgConfig *bgConfig, u32 bgId, u32 op, fx32 val) //seems to apply to more than just text? name? -{ +void BgSetPosTextAndCommit(BgConfig *bgConfig, u8 bgId, enum BgPosAdjustOp op, fx32 val) { Bg_SetPosText(&bgConfig->bgs[bgId], op, val); u32 x = (u32)bgConfig->bgs[bgId].hOffset; u32 y = (u32)bgConfig->bgs[bgId].vOffset; - switch (bgId) - { - case GF_BG_LYR_MAIN_0: - G2_SetBG0Offset(x, y); - break; - case GF_BG_LYR_MAIN_1: - G2_SetBG1Offset(x, y); - break; - case GF_BG_LYR_MAIN_2: - if (bgConfig->bgs[GF_BG_LYR_MAIN_2].mode == 0) - { - G2_SetBG2Offset(x, y); - } - else - { - BgAffineReset(bgConfig, GF_BG_LYR_MAIN_2); - } + switch (bgId) { + case GF_BG_LYR_MAIN_0: + G2_SetBG0Offset(x, y); + break; + case GF_BG_LYR_MAIN_1: + G2_SetBG1Offset(x, y); + break; + case GF_BG_LYR_MAIN_2: + if (bgConfig->bgs[GF_BG_LYR_MAIN_2].mode == 0) { + G2_SetBG2Offset(x, y); + } else { + BgAffineReset(bgConfig, GF_BG_LYR_MAIN_2); + } break; - case GF_BG_LYR_MAIN_3: - if (bgConfig->bgs[GF_BG_LYR_MAIN_3].mode == 0) - { - G2_SetBG3Offset(x, y); - } - else - { - BgAffineReset(bgConfig, GF_BG_LYR_MAIN_3); - } - break; - case GF_BG_LYR_SUB_0: - G2S_SetBG0Offset(x, y); - break; - case GF_BG_LYR_SUB_1: - G2S_SetBG1Offset(x, y); - break; - case GF_BG_LYR_SUB_2: - if (bgConfig->bgs[GF_BG_LYR_SUB_2].mode == 0) - { - G2S_SetBG2Offset(x, y); - } - else - { - BgAffineReset(bgConfig, GF_BG_LYR_SUB_2); - } - break; - case GF_BG_LYR_SUB_3: - if (bgConfig->bgs[GF_BG_LYR_SUB_3].mode == 0) - { - G2S_SetBG3Offset(x, y); - } - else - { - BgAffineReset(bgConfig, GF_BG_LYR_SUB_3); - } - break; + case GF_BG_LYR_MAIN_3: + if (bgConfig->bgs[GF_BG_LYR_MAIN_3].mode == 0) { + G2_SetBG3Offset(x, y); + } else { + BgAffineReset(bgConfig, GF_BG_LYR_MAIN_3); + } + break; + case GF_BG_LYR_SUB_0: + G2S_SetBG0Offset(x, y); + break; + case GF_BG_LYR_SUB_1: + G2S_SetBG1Offset(x, y); + break; + case GF_BG_LYR_SUB_2: + if (bgConfig->bgs[GF_BG_LYR_SUB_2].mode == 0) { + G2S_SetBG2Offset(x, y); + } else { + BgAffineReset(bgConfig, GF_BG_LYR_SUB_2); + } + break; + case GF_BG_LYR_SUB_3: + if (bgConfig->bgs[GF_BG_LYR_SUB_3].mode == 0) { + G2S_SetBG3Offset(x, y); + } else { + BgAffineReset(bgConfig, GF_BG_LYR_SUB_3); + } + break; } } -fx32 Bg_GetXpos(struct BgConfig *bgConfig, u32 bgId) -{ +fx32 Bg_GetXpos(const BgConfig *bgConfig, enum GFBgLayer bgId) { return bgConfig->bgs[bgId].hOffset; } -fx32 Bg_GetYpos(struct BgConfig *bgConfig, u32 bgId) -{ +fx32 Bg_GetYpos(BgConfig *bgConfig, enum GFBgLayer bgId) { return bgConfig->bgs[bgId].vOffset; } -void Bg_SetTextDimAndAffineParams(struct BgConfig *bgConfig, - u32 bgId, - u32 txOp, - fx32 txVal, - struct Mtx22 *mtx, - fx32 centerX, - fx32 centerY) -{ - Bg_SetPosText(&bgConfig->bgs[bgId], txOp, txVal); +void Bg_SetTextDimAndAffineParams(BgConfig *bgConfig, u8 bgId, enum BgPosAdjustOp op, fx32 value, MtxFx22 *mtx, fx32 centerX, fx32 centerY) { + Bg_SetPosText(&bgConfig->bgs[bgId], op, value); SetBgAffine(bgConfig, bgId, mtx, centerX, centerY); } -void Bg_SetPosText(struct Bg *bg, u32 op, fx32 val) -{ - switch (op) - { - case BG_POS_OP_SET_X: - bg->hOffset = val; - break; - case BG_POS_OP_ADD_X: - bg->hOffset += val; - break; - case BG_POS_OP_SUB_X: - bg->hOffset -= val; - break; - case BG_POS_OP_SET_Y: - bg->vOffset = val; - break; - case BG_POS_OP_ADD_Y: - bg->vOffset += val; - break; - case BG_POS_OP_SUB_Y: - bg->vOffset -= val; - break; +static void Bg_SetPosText(Background *bg, enum BgPosAdjustOp op, fx32 val) { + switch (op) { + case BG_POS_OP_SET_X: + bg->hOffset = val; + break; + case BG_POS_OP_ADD_X: + bg->hOffset += val; + break; + case BG_POS_OP_SUB_X: + bg->hOffset -= val; + break; + case BG_POS_OP_SET_Y: + bg->vOffset = val; + break; + case BG_POS_OP_ADD_Y: + bg->vOffset += val; + break; + case BG_POS_OP_SUB_Y: + bg->vOffset -= val; + break; } } -void SetBgAffine( - struct BgConfig *bgConfig, u32 bgId, struct Mtx22 *mtx, fx32 centerX, fx32 centerY) -{ - switch (bgId) - { - case GF_BG_LYR_MAIN_2: - G2_SetBG2Affine(mtx, centerX, centerY, bgConfig->bgs[bgId].hOffset, bgConfig->bgs[bgId].vOffset); - break; - case GF_BG_LYR_MAIN_3: - G2_SetBG3Affine(mtx, centerX, centerY, bgConfig->bgs[bgId].hOffset, bgConfig->bgs[bgId].vOffset); - break; - case GF_BG_LYR_SUB_2: - G2S_SetBG2Affine(mtx, centerX, centerY, bgConfig->bgs[bgId].hOffset, bgConfig->bgs[bgId].vOffset); - break; - case GF_BG_LYR_SUB_3: - G2S_SetBG3Affine(mtx, centerX, centerY, bgConfig->bgs[bgId].hOffset, bgConfig->bgs[bgId].vOffset); - break; +void SetBgAffine(BgConfig *bgConfig, u8 bgId, MtxFx22 *mtx, fx32 centerX, fx32 centerY) { + switch (bgId) { + case GF_BG_LYR_MAIN_0: + break; + case GF_BG_LYR_MAIN_1: + break; + case GF_BG_LYR_MAIN_2: + G2_SetBG2Affine(mtx, centerX, centerY, bgConfig->bgs[bgId].hOffset, bgConfig->bgs[bgId].vOffset); + break; + case GF_BG_LYR_MAIN_3: + G2_SetBG3Affine(mtx, centerX, centerY, bgConfig->bgs[bgId].hOffset, bgConfig->bgs[bgId].vOffset); + break; + case GF_BG_LYR_SUB_0: + break; + case GF_BG_LYR_SUB_1: + break; + case GF_BG_LYR_SUB_2: + G2S_SetBG2Affine(mtx, centerX, centerY, bgConfig->bgs[bgId].hOffset, bgConfig->bgs[bgId].vOffset); + break; + case GF_BG_LYR_SUB_3: + G2S_SetBG3Affine(mtx, centerX, centerY, bgConfig->bgs[bgId].hOffset, bgConfig->bgs[bgId].vOffset); + break; } } -void BgAffineReset(struct BgConfig *bgConfig, u32 bgId) -{ - struct Mtx22 mtx; +static void BgAffineReset(BgConfig *bgConfig, u8 bgId) { + MtxFx22 mtx; MTX22_2DAffine(&mtx, 0, FX32_ONE, FX32_ONE, 0); SetBgAffine(bgConfig, bgId, &mtx, 0, 0); } -void CopyOrUncompressTilemapData(const void *src, void *dest, u32 size) -{ - if (size == 0) - { +static void CopyOrUncompressTilemapData(const void *src, void *dest, u32 size) { + if (size == 0) { MI_UncompressLZ8(src, dest); return; } - if (((u32)src % 4) == 0 && ((u32)dest % 4) == 0 && ((u16)size % 4) == 0) - { + if (((u32)src % 4) == 0 && ((u32)dest % 4) == 0 && ((u16)size % 4) == 0) { MI_CpuCopy32(src, dest, size); return; } @@ -810,177 +718,145 @@ void CopyOrUncompressTilemapData(const void *src, void *dest, u32 size) MI_CpuCopy16(src, dest, size); } -void BgCommitTilemapBufferToVram(struct BgConfig *bgConfig, u32 bgId) -{ - BgCopyOrUncompressTilemapBufferRangeToVram(bgConfig, - bgId, - bgConfig->bgs[bgId].tilemapBuffer, - bgConfig->bgs[bgId].bufferSize, - bgConfig->bgs[bgId].baseTile); +void BgCommitTilemapBufferToVram(BgConfig *bgConfig, u8 bgId) { + BgCopyOrUncompressTilemapBufferRangeToVram(bgConfig, bgId, bgConfig->bgs[bgId].tilemapBuffer, bgConfig->bgs[bgId].bufferSize, bgConfig->bgs[bgId].baseTile); } -void BgCopyOrUncompressTilemapBufferRangeToVram( - struct BgConfig *bgConfig, u32 bgId, u32 *src, u32 size, u32 tileOffset) -{ - if (size == 0) - { +void BgCopyOrUncompressTilemapBufferRangeToVram(BgConfig *bgConfig, u8 bgId, const void *buffer, u32 bufferSize, u32 baseTile) { + if (bufferSize == 0) { void *tilemapBuffer = bgConfig->bgs[bgId].tilemapBuffer; - if (tilemapBuffer != 0) - { - CopyOrUncompressTilemapData(src, tilemapBuffer, size); + if (tilemapBuffer != NULL) { + CopyOrUncompressTilemapData(buffer, tilemapBuffer, bufferSize); LoadBgVramScr(bgId, tilemapBuffer, bgConfig->bgs[bgId].baseTile * 2, bgConfig->bgs[bgId].bufferSize); return; } - u32 uncompSize = src[0] >> 8; + u32 uncompSize = MI_GetUncompressedSize(buffer); void *ptr = AllocFromHeapAtEnd(bgConfig->heapId, uncompSize); - CopyOrUncompressTilemapData(src, ptr, size); - LoadBgVramScr(bgId, ptr, tileOffset * 2, uncompSize); + CopyOrUncompressTilemapData(buffer, ptr, bufferSize); + LoadBgVramScr(bgId, ptr, baseTile * 2, uncompSize); FreeToHeap(ptr); return; } - LoadBgVramScr(bgId, src, tileOffset * 2, size); + LoadBgVramScr(bgId, buffer, baseTile * 2, bufferSize); } -void LoadBgVramScr(u32 bgId, void *buffer_p, u32 offset, u32 size) -{ - DC_FlushRange(buffer_p, size); - - switch (bgId) - { - case 0: - GX_LoadBG0Scr(buffer_p, offset, size); - break; - case 1: - GX_LoadBG1Scr(buffer_p, offset, size); - break; - case 2: - GX_LoadBG2Scr(buffer_p, offset, size); - break; - case 3: - GX_LoadBG3Scr(buffer_p, offset, size); - break; - case 4: - GXS_LoadBG0Scr(buffer_p, offset, size); - break; - case 5: - GXS_LoadBG1Scr(buffer_p, offset, size); - break; - case 6: - GXS_LoadBG2Scr(buffer_p, offset, size); - break; - case 7: - GXS_LoadBG3Scr(buffer_p, offset, size); - break; +static void LoadBgVramScr(u8 bgId, const void *data, u32 offset, u32 size) { + DC_FlushRange(data, size); + switch (bgId) { + case GF_BG_LYR_MAIN_0: + GX_LoadBG0Scr(data, offset, size); + break; + case GF_BG_LYR_MAIN_1: + GX_LoadBG1Scr(data, offset, size); + break; + case GF_BG_LYR_MAIN_2: + GX_LoadBG2Scr(data, offset, size); + break; + case GF_BG_LYR_MAIN_3: + GX_LoadBG3Scr(data, offset, size); + break; + case GF_BG_LYR_SUB_0: + GXS_LoadBG0Scr(data, offset, size); + break; + case GF_BG_LYR_SUB_1: + GXS_LoadBG1Scr(data, offset, size); + break; + case GF_BG_LYR_SUB_2: + GXS_LoadBG2Scr(data, offset, size); + break; + case GF_BG_LYR_SUB_3: + GXS_LoadBG3Scr(data, offset, size); + break; } } -void BG_LoadScreenTilemapData( - struct BgConfig *bgConfig, u32 bgId, void *src, u32 numTiles) -{ - CopyOrUncompressTilemapData(src, bgConfig->bgs[bgId].tilemapBuffer, numTiles); +void BG_LoadScreenTilemapData(BgConfig *bgConfig, u8 bgId, const void *data, u32 size) { + CopyOrUncompressTilemapData(data, bgConfig->bgs[bgId].tilemapBuffer, size); } -void BG_LoadCharTilesData( - struct BgConfig *bgConfig, u32 bgId, u32 *charData, u32 offset, u32 numTiles) -{ - if (bgConfig->bgs[bgId].colorMode == GX_BG_COLORMODE_16) - { - BG_LoadCharPixelData(bgConfig, bgId, charData, offset, numTiles << 5); +void BG_LoadCharTilesData(BgConfig *bgConfig, u8 bgId, const void *data, u32 size, u32 tileStart) { + if (bgConfig->bgs[bgId].colorMode == GX_BG_COLORMODE_16) { + BG_LoadCharPixelData(bgConfig, bgId, data, size, tileStart * TILE_SIZE_4BPP); return; } - BG_LoadCharPixelData(bgConfig, bgId, charData, offset, numTiles << 6); + BG_LoadCharPixelData(bgConfig, bgId, data, size, tileStart * TILE_SIZE_8BPP); } -void BG_LoadCharPixelData( - struct BgConfig *bgConfig, u32 bgId, u32 *charData, u32 size, u32 offset) -{ - if (size == 0) - { - - u32 uncompressedSize = charData[0] >> 8; - void *ptr = AllocFromHeapAtEnd(bgConfig->heapId, uncompressedSize); - CopyOrUncompressTilemapData(charData, ptr, size); - LoadBgVramChar(bgId, ptr, offset, uncompressedSize); - FreeToHeap(ptr); +static void BG_LoadCharPixelData(BgConfig *bgConfig, u8 bgId, const void *buffer, u32 size, u32 offset) { + if (size == 0) { + u32 uncompressedSize = MI_GetUncompressedSize(buffer); + void *uncompressedBuffer = AllocFromHeapAtEnd(bgConfig->heapId, uncompressedSize); + CopyOrUncompressTilemapData(buffer, uncompressedBuffer, size); + LoadBgVramChar(bgId, uncompressedBuffer, offset, uncompressedSize); + FreeToHeap(uncompressedBuffer); return; } - LoadBgVramChar(bgId, charData, offset, size); + LoadBgVramChar(bgId, buffer, offset, size); } -void LoadBgVramChar(u32 bgId, void *buffer_p, u32 offset, u32 size) -{ - DC_FlushRange(buffer_p, size); - - switch (bgId) - { - case GF_BG_LYR_MAIN_0: - GX_LoadBG0Char(buffer_p, offset, size); - break; - case GF_BG_LYR_MAIN_1: - GX_LoadBG1Char(buffer_p, offset, size); - break; - case GF_BG_LYR_MAIN_2: - GX_LoadBG2Char(buffer_p, offset, size); - break; - case GF_BG_LYR_MAIN_3: - GX_LoadBG3Char(buffer_p, offset, size); - break; - case GF_BG_LYR_SUB_0: - GXS_LoadBG0Char(buffer_p, offset, size); - break; - case GF_BG_LYR_SUB_1: - GXS_LoadBG1Char(buffer_p, offset, size); - break; - case GF_BG_LYR_SUB_2: - GXS_LoadBG2Char(buffer_p, offset, size); - break; - case GF_BG_LYR_SUB_3: - GXS_LoadBG3Char(buffer_p, offset, size); - break; +static void LoadBgVramChar(u8 bgId, const void *data, u32 offset, u32 size) { + DC_FlushRange(data, size); + switch (bgId) { + case GF_BG_LYR_MAIN_0: + GX_LoadBG0Char(data, offset, size); + break; + case GF_BG_LYR_MAIN_1: + GX_LoadBG1Char(data, offset, size); + break; + case GF_BG_LYR_MAIN_2: + GX_LoadBG2Char(data, offset, size); + break; + case GF_BG_LYR_MAIN_3: + GX_LoadBG3Char(data, offset, size); + break; + case GF_BG_LYR_SUB_0: + GXS_LoadBG0Char(data, offset, size); + break; + case GF_BG_LYR_SUB_1: + GXS_LoadBG1Char(data, offset, size); + break; + case GF_BG_LYR_SUB_2: + GXS_LoadBG2Char(data, offset, size); + break; + case GF_BG_LYR_SUB_3: + GXS_LoadBG3Char(data, offset, size); + break; } } -void BG_ClearCharDataRange(u32 bgId, u32 size, u32 offset, HeapID heapId) -{ - void *ptr = AllocFromHeapAtEnd(heapId, size); - memset(ptr, 0, size); +void BG_ClearCharDataRange(u8 bgId, u32 size, u32 offset, HeapID heapId) { + void *buffer = AllocFromHeapAtEnd(heapId, size); + memset(buffer, 0, size); - LoadBgVramChar(bgId, ptr, offset, size); - FreeToHeapExplicit(heapId, ptr); + LoadBgVramChar(bgId, buffer, offset, size); + FreeToHeapExplicit(heapId, buffer); } -void BG_FillCharDataRange( - struct BgConfig *param0, u32 bgId, u32 fillValue, u32 count, u32 offset) -{ - void *st4; - u32 size = count * param0->bgs[bgId].tileSize; - u32 r5 = fillValue; - st4 = AllocFromHeapAtEnd(param0->heapId, size); +void BG_FillCharDataRange(BgConfig *bgConfig, enum GFBgLayer bgId, u32 fillValue, u32 ntiles, u32 offset) { + void *buffer; + u32 size = ntiles * bgConfig->bgs[bgId].tileSize; + u32 value = fillValue; + buffer = AllocFromHeapAtEnd(bgConfig->heapId, size); - if (param0->bgs[bgId].tileSize == 0x20) - { - r5 = (r5 << 0xc | r5 << 0x8 | r5 << 0x4 | r5); - r5 |= r5 << 0x10; - } - else - { - r5 = r5 << 0x18 | r5 << 0x10 | r5 << 8 | r5; + if (bgConfig->bgs[bgId].tileSize == TILE_SIZE_4BPP) { + value = (value << 12) | (value << 8) | (value << 4) | (value << 0); + value |= value << 16; + } else { + value = (value << 24) | (value << 16) | (value << 8) | (value << 0); } - MI_CpuFillFast(st4, r5, size); + MI_CpuFillFast(buffer, value, size); - LoadBgVramChar((u8)bgId, st4, param0->bgs[bgId].tileSize * offset, size); - FreeToHeap(st4); + LoadBgVramChar((u8)bgId, buffer, bgConfig->bgs[bgId].tileSize * offset, size); + FreeToHeap(buffer); } -void BG_LoadPlttData(u32 location, void *plttData, u32 size, enum GFPalSlotOffset offset) -{ +void BG_LoadPlttData(u32 location, void *plttData, u32 size, enum GFPalSlotOffset offset) { DC_FlushRange(plttData, size); - if (location < GF_PAL_LOCATION_SUB_BG) - { + if (location < GF_PAL_LOCATION_SUB_BG) { GX_LoadBGPltt(plttData, offset, size); return; } @@ -988,205 +864,102 @@ void BG_LoadPlttData(u32 location, void *plttData, u32 size, enum GFPalSlotOffse GXS_LoadBGPltt(plttData, offset, size); } -void BG_SetMaskColor(u32 bgId, u32 value) -{ - BG_LoadPlttData(bgId, &value, 2, GF_PAL_SLOT_OFFSET_0); +void BG_SetMaskColor(u8 bgId, u16 value) { + BG_LoadPlttData(bgId, &value, sizeof(u16), GF_PAL_SLOT_OFFSET_0); } -u16 GetTileMapIndexFromCoords(u8 x, u8 y, u8 screenSize) -{ - switch (screenSize) - { - case GF_BG_SCR_SIZE_128x128: - return (u16)(x + (y << 4)); - case GF_BG_SCR_SIZE_256x256: - case GF_BG_SCR_SIZE_256x512: - return (u16)(x + (y << 5)); - case GF_BG_SCR_SIZE_512x256: - return (u16)((x & 0x1f) + ((y + (x & ~0x1f)) << 5)); - case GF_BG_SCR_SIZE_512x512: - u16 res = (u16)(((u16)((x >> 5) + (y >> 5) * 2)) << 10); - res += (x & 0x1f) + ((y & 0x1f) << 5); - return res; - case GF_BG_SCR_SIZE_1024x1024: - return 0; +static u16 GetTileMapIndexFromCoords(u8 x, u8 y, u8 size) { + switch (size) { + case GF_BG_SCR_SIZE_128x128: + return (u16)(x + (y << 4)); + case GF_BG_SCR_SIZE_256x256: + case GF_BG_SCR_SIZE_256x512: + return (u16)(x + (y << 5)); + case GF_BG_SCR_SIZE_512x256: + return (u16)((x & 0x1f) + ((y + (x & ~0x1f)) << 5)); + case GF_BG_SCR_SIZE_512x512: + u16 res = (u16)(((u16)((x >> 5) + (y >> 5) * 2)) << 10); + res += (x & 0x1f) + ((y & 0x1f) << 5); + return res; + case GF_BG_SCR_SIZE_1024x1024: + return 0; } return x; } -u16 GetSrcTileMapIndexFromCoords(u8 x, u8 y, u8 width, u8 height) -{ +static u16 GetSrcTileMapIndexFromCoords(u8 x, u8 y, u8 width, u8 height) { u8 coordType = 0; - u16 r3 = 0; - s16 r4 = (s16)(width - 32); - s16 r5 = (s16)(height - 32); + u16 tilemapIndex = 0; + s16 adjustedWidth = width - 32; + s16 adjustedHeight = height - 32; - if (((u32)x >> 5) != 0) - { + if (x / 32) { coordType++; } - if (((u32)y >> 5) != 0) - { + if (y / 32) { coordType += 2; } - switch (coordType) - { - case 0: - if (r4 >= 0) - { - r3 += x + (y << 5); - } - else - { - r3 += x + y * width; - } - break; - case 1: - if (r5 >= 0) - { - r3 += 0x400; - } - else - { - r3 += (height << 5); - } - - r3 += (x & 0x1f) + y * r4; - break; - case 2: - r3 += width << 5; - if (r4 >= 0) - { - r3 += x + ((y & 0x1f) << 5); - } - else - { - r3 += x + (y & 0x1f) * width; - } - break; - case 3: - r3 += (width + r5) << 5; - r3 += (x & 0x1f) + (y & 0x1f) * r4; - break; + switch (coordType) { + case 0: + if (adjustedWidth >= 0) + { + tilemapIndex += y * 32 + x; + } else { + tilemapIndex += y * width + x; + } + break; + case 1: + if (adjustedHeight >= 0) { + tilemapIndex += 1024; + } else { + tilemapIndex += height * 32; + } + tilemapIndex += y * adjustedWidth + (x & 0x1f); + break; + case 2: + tilemapIndex += width * 32; + if (adjustedWidth >= 0) { + tilemapIndex += (y & 0x1f) * 32 + x; + } else { + tilemapIndex += (y & 0x1f) * width + x; + } + break; + case 3: + tilemapIndex += width * 32 + adjustedHeight * 32; + tilemapIndex += (y & 0x1f) * adjustedWidth + (x & 0x1f); + break; } - return r3; + return tilemapIndex; } -void LoadRectToBgTilemapRect(struct BgConfig *bgConfig, - u32 bgId, - void *src, - u8 dstX, - u8 dstY, - u8 width, - u8 height) -{ - CopyToBgTilemapRect(bgConfig, bgId, dstX, dstY, width, height, src, 0, 0, width, height); +void LoadRectToBgTilemapRect(BgConfig *bgConfig, u8 bgId, const void *buffer, u8 destX, u8 destY, u8 width, u8 height) { + CopyToBgTilemapRect(bgConfig, bgId, destX, destY, width, height, buffer, 0, 0, width, height); } -void CopyToBgTilemapRect(struct BgConfig *bgConfig, - u32 bgId, - u8 dstX, - u8 dstY, - u8 dstWidth, - u8 dstHeight, - void *src, - u8 srcX, - u8 srcY, - u8 srcWidth, - u8 srcHeight) -{ - if (bgConfig->bgs[bgId].mode != 1) - { - CopyBgTilemapRectText(&bgConfig->bgs[bgId], - dstX, - dstY, - dstWidth, - dstHeight, - (u16 *) src, - srcX, - srcY, - srcWidth, - srcHeight, - 0); - } - else - { - CopyBgTilemapRectAffine(&bgConfig->bgs[bgId], - dstX, - dstY, - dstWidth, - dstHeight, - (u8 *) src, - srcX, - srcY, - srcWidth, - srcHeight, - 0); +void CopyToBgTilemapRect(BgConfig *bgConfig, u8 bgId, u8 destX, u8 destY, u8 destWidth, u8 destHeight, const void *buffer, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight) { + if (bgConfig->bgs[bgId].mode != GF_BG_TYPE_AFFINE) { + CopyToBgTilemapRectText(&bgConfig->bgs[bgId], destX, destY, destWidth, destHeight, buffer, srcX, srcY, srcWidth, srcHeight, TILEMAP_COPY_SRC_FLAT); + } else { + CopyBgTilemapRectAffine(&bgConfig->bgs[bgId], destX, destY, destWidth, destHeight, buffer, srcX, srcY, srcWidth, srcHeight, TILEMAP_COPY_SRC_FLAT); } } -void CopyRectToBgTilemapRect(struct BgConfig *bgConfig, - u32 bgId, - u8 dstX, - u8 dstY, - u8 dstWidth, - u8 dstHeight, - void *src, - u8 srcX, - u8 srcY, - u8 srcWidth, - u8 srcHeight) -{ - if (bgConfig->bgs[bgId].mode != 1) - { - CopyBgTilemapRectText(&bgConfig->bgs[bgId], - dstX, - dstY, - dstWidth, - dstHeight, - (u16 *) src, - srcX, - srcY, - srcWidth, - srcHeight, - TRUE); - } - else - { - CopyBgTilemapRectAffine(&bgConfig->bgs[bgId], - dstX, - dstY, - dstWidth, - dstHeight, - (u8 *) src, - srcX, - srcY, - srcWidth, - srcHeight, - TRUE); +void CopyRectToBgTilemapRect(BgConfig *bgConfig, u8 bgId, u8 destX, u8 destY, u8 destWidth, u8 destHeight, const void *buffer, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight) { + if (bgConfig->bgs[bgId].mode != GF_BG_TYPE_AFFINE) { + CopyToBgTilemapRectText(&bgConfig->bgs[bgId], destX, destY, destWidth, destHeight, buffer, srcX, srcY, srcWidth, srcHeight, TILEMAP_COPY_SRC_RECT); + } else { + CopyBgTilemapRectAffine(&bgConfig->bgs[bgId], destX, destY, destWidth, destHeight, buffer, srcX, srcY, srcWidth, srcHeight, TILEMAP_COPY_SRC_RECT); } } -void CopyBgTilemapRectText(struct Bg *bg, - u8 dstX, - u8 dstY, - u8 dstWidth, - u8 dstHeight, - u16 *src, - u8 srcX, - u8 srcY, - u8 srcWidth, - u8 srcHeight, - u8 adjustForSrcDims) -{ +static void CopyToBgTilemapRectText(Background *bg, u8 destX, u8 destY, u8 destWidth, u8 destHeight, const u16 *buffer, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 mode) { u16 *tilemapBuffer = bg->tilemapBuffer; - if (tilemapBuffer == 0) - { + if (tilemapBuffer == NULL) { return; } @@ -1196,90 +969,37 @@ void CopyBgTilemapRectText(struct Bg *bg, u8 i; u8 j; - if (adjustForSrcDims == 0) - { - for (i = 0; i < dstHeight; i++) - { - - if (dstY + i >= screenHeight) - { + if (mode == TILEMAP_COPY_SRC_FLAT) { + for (i = 0; i < destHeight; i++) { + if (destY + i >= screenHeight || srcY + i >= srcHeight) { break; } - - if (srcY + i >= srcHeight) - { - break; - } - - for (j = 0; j < dstWidth; j++) - { - - if (dstX + j >= screenWidth) - { + for (j = 0; j < destWidth; j++) { + if (destX + j >= screenWidth || srcX + j >= srcWidth) { break; } - - if (srcX + j >= srcWidth) - { - break; - } - - ((u16 *)tilemapBuffer)[GetTileMapIndexFromCoords((u8) (dstX + j), (u8) (dstY + i), bg->size)] = - src[srcX + srcWidth * (srcY + i) + j]; + tilemapBuffer[GetTileMapIndexFromCoords(destX + j, destY + i, bg->size)] = buffer[(srcY + i) * srcWidth + srcX +j]; } } - } - else - { - for (i = 0; i < dstHeight; i++) - { - - if (dstY + i >= screenHeight) - { + } else { + for (i = 0; i < destHeight; i++) { + if (destY + i >= screenHeight || srcY + i >= srcHeight) { break; } - - if (srcY + i >= srcHeight) - { - break; - } - - for (j = 0; j < dstWidth; j++) - { - - if (dstX + j >= screenWidth) - { + for (j = 0; j < destWidth; j++) { + if (destX + j >= screenWidth || srcX + j >= srcWidth) { break; } - - if (srcX + j >= srcWidth) - { - break; - } - - ((u16 *)tilemapBuffer)[GetTileMapIndexFromCoords((u8) (dstX + j), (u8) (dstY + i), bg->size)] = - src[GetSrcTileMapIndexFromCoords((u8) (srcX + j), (u8) (srcY + i), srcWidth, srcHeight)]; + tilemapBuffer[GetTileMapIndexFromCoords(destX + j, destY + i, bg->size)] = buffer[GetSrcTileMapIndexFromCoords(srcX + j, srcY + i, srcWidth, srcHeight)]; } } } } -void CopyBgTilemapRectAffine(struct Bg *bg, - u8 dstX, - u8 dstY, - u8 dstWidth, - u8 dstHeight, - u8 *src, - u8 srcX, - u8 srcY, - u8 srcWidth, - u8 srcHeight, - u8 adjustForSrcDims) -{ - void *tilemapBuffer = bg->tilemapBuffer; +static void CopyBgTilemapRectAffine(Background *bg, u8 destX, u8 destY, u8 destWidth, u8 destHeight, const u8 *buffer, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 mode) { + u8 *tilemapBuffer = bg->tilemapBuffer; - if (tilemapBuffer == 0) - { + if (tilemapBuffer == NULL) { return; } @@ -1289,292 +1009,187 @@ void CopyBgTilemapRectAffine(struct Bg *bg, u8 i; u8 j; - if (adjustForSrcDims == 0) - { - for (i = 0; i < dstHeight; i++) - { - - if (dstY + i >= screenHeight) - { + if (mode == TILEMAP_COPY_SRC_FLAT) { + for (i = 0; i < destHeight; i++) { + if (destY + i >= screenHeight || srcY + i >= srcHeight) { break; } - - if (srcY + i >= srcHeight) - { - break; - } - - for (j = 0; j < dstWidth; j++) - { - - if (dstX + j >= screenWidth) - { + for (j = 0; j < destWidth; j++) { + if (destX + j >= screenWidth || srcX + j >= srcWidth) { break; } - - if (srcX + j >= srcWidth) - { - break; - } - - ((u8 *)tilemapBuffer)[GetTileMapIndexFromCoords((u8) (dstX + j), (u8) (dstY + i), bg->size)] = - src[srcX + srcWidth * (srcY + i) + j]; + tilemapBuffer[GetTileMapIndexFromCoords(destX + j, destY + i, bg->size)] = buffer[(srcY + i) * srcWidth + srcX + j]; } } - } - else - { - for (i = 0; i < dstHeight; i++) - { - - if (dstY + i >= screenHeight) - { + } else { + for (i = 0; i < destHeight; i++) { + if (destY + i >= screenHeight || srcY + i >= srcHeight) { break; } - - if (srcY + i >= srcHeight) - { - break; - } - - for (j = 0; j < dstWidth; j++) - { - - if (dstX + j >= screenWidth) - { + for (j = 0; j < destWidth; j++) { + if (destX + j >= screenWidth || srcX + j >= srcWidth) { break; } - - if (srcX + j >= srcWidth) - { - break; - } - - ((u8 *)tilemapBuffer)[GetTileMapIndexFromCoords((u8) (dstX + j), (u8) (dstY + i), bg->size)] = - src[GetSrcTileMapIndexFromCoords((u8) (srcX + j), (u8) (srcY + i), srcWidth, srcHeight)]; + tilemapBuffer[GetTileMapIndexFromCoords(destX + j, destY + i, bg->size)] = buffer[GetSrcTileMapIndexFromCoords(srcX + j, srcY + i, srcWidth, srcHeight)]; } } } } -void FillBgTilemapRect(struct BgConfig *bgConfig, - u8 bgId, - u16 fillValue, - u8 x, - u8 y, - u8 width, - u8 height, - u8 paletteNum) -{ - if (bgConfig->bgs[bgId].mode != 1) - { - - FillBgTilemapRectText(&bgConfig->bgs[bgId], fillValue, x, y, width, height, paletteNum); - } - else - { - FillBgTilemapRectAffine(&bgConfig->bgs[bgId], (u8) fillValue, x, y, width, height); +void FillBgTilemapRect(BgConfig *bgConfig, u8 bgId, u16 fillValue, u8 x, u8 y, u8 width, u8 height, u8 mode) { + if (bgConfig->bgs[bgId].mode != GF_BG_TYPE_AFFINE) { + FillBgTilemapRectText(&bgConfig->bgs[bgId], fillValue, x, y, width, height, mode); + } else { + FillBgTilemapRectAffine(&bgConfig->bgs[bgId], fillValue, x, y, width, height); } } -void FillBgTilemapRectText(struct Bg *bg, - u16 fillValue, - u8 x, - u8 y, - u8 width, - u8 height, - u8 paletteNum) -{ - void *tilemapBuffer = bg->tilemapBuffer; +static void FillBgTilemapRectText(Background *bg, u16 fillValue, u8 x, u8 y, u8 width, u8 height, u8 mode) { + u16 *tilemapBuffer = bg->tilemapBuffer; - if (tilemapBuffer != 0) - { + if (tilemapBuffer == NULL) { + return; + } - u8 screenWidth; - u8 screenHeight; - GetBgScreenDimensions(bg->size, &screenWidth, &screenHeight); + u8 screenWidth; + u8 screenHeight; + GetBgScreenDimensions(bg->size, &screenWidth, &screenHeight); - u8 i; - u8 j; - for (i = y; i < y + height; i++) - { - if (i >= screenHeight) - { + u8 i; + u8 j; + for (i = y; i < y + height; i++) { + if (i >= screenHeight) { + break; + } + for (j = x; j < x + width; j++) { + if (j >= screenWidth) { break; } - - for (j = x; j < x + width; j++) - { - if (j >= screenWidth) - { - break; - } - - u16 idx = GetTileMapIndexFromCoords(j, i, bg->size); - - if (paletteNum == 0x11) - { - ((u16 *)tilemapBuffer)[idx] = fillValue; - } - else if (paletteNum == 0x10) - { - ((u16 *)tilemapBuffer)[idx] = (u16)((((u16 *)tilemapBuffer)[idx] & 0xF000) + fillValue); - } - else - { - ((u16 *)tilemapBuffer)[idx] = (u16)((paletteNum << 0xc) + fillValue); - } + u16 pos = GetTileMapIndexFromCoords(j, i, bg->size); + if (mode == TILEMAP_FILL_OVWT_PAL) { + tilemapBuffer[pos] = fillValue; + } else if (mode == TILEMAP_FILL_KEEP_PAL) { + tilemapBuffer[pos] = (tilemapBuffer[pos] & 0xF000) + (fillValue); + } else { + tilemapBuffer[pos] = (mode << 12) + (fillValue); } } } } -void FillBgTilemapRectAffine( - struct Bg *bg, u8 fillValue, u8 x, u8 y, u8 width, u8 height) -{ - void *tilemapBuffer = bg->tilemapBuffer; +static void FillBgTilemapRectAffine(Background *bg, u8 fillValue, u8 x, u8 y, u8 width, u8 height) { + u8 *tilemapBuffer = bg->tilemapBuffer; - if (tilemapBuffer != 0) - { + if (tilemapBuffer == NULL) { + return; + } - u8 screenWidth; - u8 screenHeight; - GetBgScreenDimensions(bg->size, &screenWidth, &screenHeight); + u8 screenWidth; + u8 screenHeight; + GetBgScreenDimensions(bg->size, &screenWidth, &screenHeight); - u8 i; - u8 j; - for (i = y; i < y + height; i++) - { - if (i >= screenHeight) - { + u8 i; + u8 j; + for (i = y; i < y + height; i++) { + if (i >= screenHeight) { + break; + } + for (j = x; j < x + width; j++) { + if (j >= screenWidth) { break; } - - for (j = x; j < x + width; j++) - { - if (j >= screenWidth) - { - break; - } - - ((u8 *)tilemapBuffer)[GetTileMapIndexFromCoords(j, i, bg->size)] = fillValue; - } + tilemapBuffer[GetTileMapIndexFromCoords(j, i, bg->size)] = fillValue; } } } -void BgTilemapRectChangePalette(struct BgConfig *bgConfig, - u32 bgId, - u8 x, - u8 y, - u8 width, - u8 height, - u8 paletteNum) -{ - void *tilemapBuffer = bgConfig->bgs[bgId].tilemapBuffer; +void BgTilemapRectChangePalette(BgConfig *bgConfig, u8 bgId, u8 x, u8 y, u8 width, u8 height, u8 palette) { + u16 *tilemapBuffer = bgConfig->bgs[bgId].tilemapBuffer; - if (tilemapBuffer != NULL) - { - u8 screenWidth; - u8 screenHeight; - GetBgScreenDimensions(bgConfig->bgs[bgId].size, &screenWidth, &screenHeight); + if (tilemapBuffer == NULL) { + return; + } - u8 i; - u8 j; - for (i = y; i < y + height; i++) - { - if (i >= screenHeight) - { + u8 screenWidth; + u8 screenHeight; + GetBgScreenDimensions(bgConfig->bgs[bgId].size, &screenWidth, &screenHeight); + + u8 i; + u8 j; + for (i = y; i < y + height; i++) { + if (i >= screenHeight) { + break; + } + for (j = x; j < x + width; j++) { + if (j >= screenWidth) { break; } - - for (j = x; j < x + width; j++) - { - if (j >= screenWidth) - { - break; - } - - u16 idx = GetTileMapIndexFromCoords(j, i, bgConfig->bgs[bgId].size); - ((u16 *)tilemapBuffer)[idx] = (u16)((((u16 *)tilemapBuffer)[idx] & 0xfff) | (paletteNum << 0xc)); - } + u16 pos = GetTileMapIndexFromCoords(j, i, bgConfig->bgs[bgId].size); + tilemapBuffer[pos] = (tilemapBuffer[pos] & 0xFFF) | (palette << 12); } } } -void BgClearTilemapBufferAndCommit(struct BgConfig *bgConfig, u32 bgId) -{ - if (bgConfig->bgs[bgId].tilemapBuffer != NULL) - { +void BgClearTilemapBufferAndCommit(BgConfig *bgConfig, u8 bgId) { + if (bgConfig->bgs[bgId].tilemapBuffer != NULL) { MI_CpuClear16(bgConfig->bgs[bgId].tilemapBuffer, bgConfig->bgs[bgId].bufferSize); BgCommitTilemapBufferToVram(bgConfig, bgId); } } -void BgFillTilemapBufferAndCommit(struct BgConfig *bgConfig, u32 bgId, u16 fillValue) -{ - if (bgConfig->bgs[bgId].tilemapBuffer != NULL) - { +void BgFillTilemapBufferAndCommit(BgConfig *bgConfig, u8 bgId, u16 fillValue) { + if (bgConfig->bgs[bgId].tilemapBuffer != NULL) { MI_CpuFill16(bgConfig->bgs[bgId].tilemapBuffer, fillValue, bgConfig->bgs[bgId].bufferSize); BgCommitTilemapBufferToVram(bgConfig, bgId); } } -void BgFillTilemapBufferAndSchedule(struct BgConfig *bgConfig, u32 bgId, u16 fillValue) -{ - if (bgConfig->bgs[bgId].tilemapBuffer != NULL) - { +void BgFillTilemapBufferAndSchedule(BgConfig *bgConfig, u8 bgId, u16 fillValue) { + if (bgConfig->bgs[bgId].tilemapBuffer != NULL) { MI_CpuFill16(bgConfig->bgs[bgId].tilemapBuffer, fillValue, bgConfig->bgs[bgId].bufferSize); ScheduleBgTilemapBufferTransfer(bgConfig, bgId); } } -void *BgGetCharPtr(u32 bgId) -{ - switch (bgId) - { - case GF_BG_LYR_MAIN_0: - return G2_GetBG0CharPtr(); - case GF_BG_LYR_MAIN_1: - return G2_GetBG1CharPtr(); - case GF_BG_LYR_MAIN_2: - return G2_GetBG2CharPtr(); - case GF_BG_LYR_MAIN_3: - return G2_GetBG3CharPtr(); - case GF_BG_LYR_SUB_0: - return G2S_GetBG0CharPtr(); - case GF_BG_LYR_SUB_1: - return G2S_GetBG1CharPtr(); - case GF_BG_LYR_SUB_2: - return G2S_GetBG2CharPtr(); - case GF_BG_LYR_SUB_3: - return G2S_GetBG3CharPtr(); +void *BgGetCharPtr(u8 bgId) { + switch (bgId) { + case GF_BG_LYR_MAIN_0: + return G2_GetBG0CharPtr(); + case GF_BG_LYR_MAIN_1: + return G2_GetBG1CharPtr(); + case GF_BG_LYR_MAIN_2: + return G2_GetBG2CharPtr(); + case GF_BG_LYR_MAIN_3: + return G2_GetBG3CharPtr(); + case GF_BG_LYR_SUB_0: + return G2S_GetBG0CharPtr(); + case GF_BG_LYR_SUB_1: + return G2S_GetBG1CharPtr(); + case GF_BG_LYR_SUB_2: + return G2S_GetBG2CharPtr(); + case GF_BG_LYR_SUB_3: + return G2S_GetBG3CharPtr(); } return NULL; } -void Convert4bppTo8bppInternal(u8 *src4bpp, u32 size, u8 (*dest8bpp), u8 paletteNum) -{ +static void Convert4bppTo8bppInternal(u8 *src4bpp, u32 size, u8 *dest8bpp, u8 paletteNum) { paletteNum <<= 4; - for (u32 i = 0; i < size; i++) - { + for (u32 i = 0; i < size; i++) { dest8bpp[i * 2 + 0] = (u8)(src4bpp[i] & 0xf); - if (dest8bpp[i * 2 + 0] != 0) - { + if (dest8bpp[i * 2 + 0] != 0) { dest8bpp[i * 2 + 0] += paletteNum; } dest8bpp[i * 2 + 1] = (u8)((src4bpp[i] >> 4) & 0xf); - if (dest8bpp[i * 2 + 1] != 0) - { + if (dest8bpp[i * 2 + 1] != 0) { dest8bpp[i * 2 + 1] += paletteNum; } } } -u8 *Convert4bppTo8bpp(u8 *src4Bpp, u32 size, u8 paletteNum, HeapID heapId) -{ +u8 *Convert4bppTo8bpp(u8 *src4Bpp, u32 size, u8 paletteNum, HeapID heapId) { u8 *ptr = (u8*)AllocFromHeap(heapId, size * 2); Convert4bppTo8bppInternal(src4Bpp, size, ptr, paletteNum); @@ -1582,78 +1197,68 @@ u8 *Convert4bppTo8bpp(u8 *src4Bpp, u32 size, u8 paletteNum, HeapID heapId) return ptr; } -void *GetBgTilemapBuffer(struct BgConfig *bgConfig, u8 bgId) -{ +void *GetBgTilemapBuffer(BgConfig *bgConfig, u8 bgId) { return bgConfig->bgs[bgId].tilemapBuffer; } -u16 GetBgAffineRotation(struct BgConfig *bgConfig, u32 bgId) -{ +u16 GetBgRotation(BgConfig *bgConfig, u8 bgId) { return bgConfig->bgs[bgId].rotation; } -u8 GetBgPriority(struct BgConfig *bgConfig, u32 bgId) -{ - switch (bgId) - { - case GF_BG_LYR_MAIN_0: - return G2_GetBG0Control().priority; - case GF_BG_LYR_MAIN_1: - return G2_GetBG1Control().priority; - case GF_BG_LYR_MAIN_2: - switch (bgConfig->bgs[bgId].mode) - { - default: - case GF_BG_TYPE_TEXT: - return G2_GetBG2ControlText().priority; - case GF_BG_TYPE_AFFINE: - return G2_GetBG2ControlAffine().priority; - case GF_BG_TYPE_256x16PLTT: - return G2_GetBG2Control256x16Pltt().priority; - } - break; - case GF_BG_LYR_MAIN_3: - switch (bgConfig->bgs[bgId].mode) - { - default: - case GF_BG_TYPE_TEXT: - return G2_GetBG3ControlText().priority; - case GF_BG_TYPE_AFFINE: - return G2_GetBG3ControlAffine().priority; - case GF_BG_TYPE_256x16PLTT: - return G2_GetBG3Control256x16Pltt().priority; - } - break; - - case GF_BG_LYR_SUB_0: - return G2S_GetBG0Control().priority; - case GF_BG_LYR_SUB_1: - return G2S_GetBG1Control().priority; - - case GF_BG_LYR_SUB_2: - switch (bgConfig->bgs[bgId].mode) - { - default: - case GF_BG_TYPE_TEXT: - return G2S_GetBG2ControlText().priority; - case GF_BG_TYPE_AFFINE: - return G2S_GetBG2ControlAffine().priority; - case GF_BG_TYPE_256x16PLTT: - return G2S_GetBG2Control256x16Pltt().priority; - } - break; - case GF_BG_LYR_SUB_3: - switch (bgConfig->bgs[bgId].mode) - { - default: - case GF_BG_TYPE_TEXT: - return G2S_GetBG3ControlText().priority; - case GF_BG_TYPE_AFFINE: - return G2S_GetBG3ControlAffine().priority; - case GF_BG_TYPE_256x16PLTT: - return G2S_GetBG3Control256x16Pltt().priority; - } - break; +u8 GetBgPriority(BgConfig *bgConfig, u8 bgId) { + switch (bgId) { + case GF_BG_LYR_MAIN_0: + return G2_GetBG0Control().priority; + case GF_BG_LYR_MAIN_1: + return G2_GetBG1Control().priority; + case GF_BG_LYR_MAIN_2: + switch (bgConfig->bgs[bgId].mode) { + default: + case GF_BG_TYPE_TEXT: + return G2_GetBG2ControlText().priority; + case GF_BG_TYPE_AFFINE: + return G2_GetBG2ControlAffine().priority; + case GF_BG_TYPE_256x16PLTT: + return G2_GetBG2Control256x16Pltt().priority; + } + break; + case GF_BG_LYR_MAIN_3: + switch (bgConfig->bgs[bgId].mode) { + default: + case GF_BG_TYPE_TEXT: + return G2_GetBG3ControlText().priority; + case GF_BG_TYPE_AFFINE: + return G2_GetBG3ControlAffine().priority; + case GF_BG_TYPE_256x16PLTT: + return G2_GetBG3Control256x16Pltt().priority; + } + break; + case GF_BG_LYR_SUB_0: + return G2S_GetBG0Control().priority; + case GF_BG_LYR_SUB_1: + return G2S_GetBG1Control().priority; + case GF_BG_LYR_SUB_2: + switch (bgConfig->bgs[bgId].mode) { + default: + case GF_BG_TYPE_TEXT: + return G2S_GetBG2ControlText().priority; + case GF_BG_TYPE_AFFINE: + return G2S_GetBG2ControlAffine().priority; + case GF_BG_TYPE_256x16PLTT: + return G2S_GetBG2Control256x16Pltt().priority; + } + break; + case GF_BG_LYR_SUB_3: + switch (bgConfig->bgs[bgId].mode) { + default: + case GF_BG_TYPE_TEXT: + return G2S_GetBG3ControlText().priority; + case GF_BG_TYPE_AFFINE: + return G2S_GetBG3ControlAffine().priority; + case GF_BG_TYPE_256x16PLTT: + return G2S_GetBG3Control256x16Pltt().priority; + } + break; } return 0; @@ -1663,210 +1268,155 @@ u8 GetBgPriority(struct BgConfig *bgConfig, u32 bgId) #define GetPixelAddressFromBlit8bpp(ptr, x, y, width) ((u8 *)((ptr) + ((x) & 7) + (((x) << 3) & 0x7FC0) + ((((y) << 3) & 0x7FC0) * (width)) + (((u32)(((y) << 3) & 0x38))))) #define ConvertPixelsToTiles(x) (((x) + ((x) & 7)) >> 3) -void BlitBitmapRect4Bit(const struct Bitmap *src, - const struct Bitmap *dst, - u16 srcX, - u16 srcY, - u16 dstX, - u16 dstY, - u16 width, - u16 height, - u16 colorKey) -{ +void BlitBitmapRect4Bit(const Bitmap *src, const Bitmap *dest, u16 srcX, u16 srcY, u16 destX, u16 destY, u16 width, u16 height, u16 colorKey) { int xEnd, yEnd; - int multiplierSrcY, multiplierDstY; - int loopSrcY, loopDstY; - int loopSrcX, loopDstX; + int multiplierSrcY, multiplierDestY; + int loopSrcY, loopDestY; + int loopSrcX, loopDestX; int toOrr, toShift; - u8 * pixelsSrc, * pixelsDst; + u8 *pixelsSrc, *pixelsDest; - if (dst->width - dstX < width) - xEnd = dst->width - dstX + srcX; - else + if (dest->width - destX < width) { + xEnd = dest->width - destX + srcX; + } else { xEnd = width + srcX; - if (dst->height - dstY < height) - yEnd = dst->height - dstY + srcY; - else + } + if (dest->height - destY < height) { + yEnd = dest->height - destY + srcY; + } else { yEnd = height + srcY; + } multiplierSrcY = ConvertPixelsToTiles(src->width); - multiplierDstY = ConvertPixelsToTiles(dst->width); + multiplierDestY = ConvertPixelsToTiles(dest->width); - if (colorKey == 0xFFFF) - { - for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++) - { - for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++) - { + if (colorKey == 0xFFFF) { + for (loopSrcY = srcY, loopDestY = destY; loopSrcY < yEnd; loopSrcY++, loopDestY++) { + for (loopSrcX = srcX, loopDestX = destX; loopSrcX < xEnd; loopSrcX++, loopDestX++) { pixelsSrc = GetPixelAddressFromBlit4bpp(src->pixels, loopSrcX, loopSrcY, multiplierSrcY); - pixelsDst = GetPixelAddressFromBlit4bpp(dst->pixels, loopDstX, loopDstY, multiplierDstY); + pixelsDest = GetPixelAddressFromBlit4bpp(dest->pixels, loopDestX, loopDestY, multiplierDestY); toOrr = (*pixelsSrc >> ((loopSrcX & 1) * 4)) & 0xF; - toShift = (loopDstX & 1) * 4; - *pixelsDst = ((toOrr << toShift) | (*pixelsDst & (0xF0 >> toShift))); + toShift = (loopDestX & 1) * 4; + *pixelsDest = ((toOrr << toShift) | (*pixelsDest & (0xF0 >> toShift))); } } - } - else - { - for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++) - { - for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++) - { + } else { + for (loopSrcY = srcY, loopDestY = destY; loopSrcY < yEnd; loopSrcY++, loopDestY++) { + for (loopSrcX = srcX, loopDestX = destX; loopSrcX < xEnd; loopSrcX++, loopDestX++) { pixelsSrc = GetPixelAddressFromBlit4bpp(src->pixels, loopSrcX, loopSrcY, multiplierSrcY); - pixelsDst = GetPixelAddressFromBlit4bpp(dst->pixels, loopDstX, loopDstY, multiplierDstY); + pixelsDest = GetPixelAddressFromBlit4bpp(dest->pixels, loopDestX, loopDestY, multiplierDestY); toOrr = (*pixelsSrc >> ((loopSrcX & 1) * 4)) & 0xF; - if (toOrr != colorKey) - { - toShift = (loopDstX & 1) * 4; - *pixelsDst = (u8) ((toOrr << toShift) | (*pixelsDst & (0xF0 >> toShift))); + if (toOrr != colorKey) { + toShift = (loopDestX & 1) * 4; + *pixelsDest = (u8) ((toOrr << toShift) | (*pixelsDest & (0xF0 >> toShift))); } } } } } -void BlitBitmapRect8Bit(const struct Bitmap *src, - const struct Bitmap *dst, - u16 srcX, - u16 srcY, - u16 dstX, - u16 dstY, - u16 width, - u16 height, - u16 colorKey) -{ +static void BlitBitmapRect8Bit(const struct Bitmap *src, const struct Bitmap *dest, u16 srcX, u16 srcY, u16 destX, u16 destY, u16 width, u16 height, u16 colorKey) { int xEnd, yEnd; - int multiplierSrcY, multiplierDstY; - int loopSrcY, loopDstY; - int loopSrcX, loopDstX; - u8 * pixelsSrc, * pixelsDst; + int multiplierSrcY, multiplierDestY; + int loopSrcY, loopDestY; + int loopSrcX, loopDestX; + u8 *pixelsSrc, *pixelsDest; - if (dst->width - dstX < width) - xEnd = dst->width - dstX + srcX; - else + if (dest->width - destX < width) { + xEnd = dest->width - destX + srcX; + } else { xEnd = width + srcX; - if (dst->height - dstY < height) - yEnd = dst->height - dstY + srcY; - else + } + if (dest->height - destY < height) { + yEnd = dest->height - destY + srcY; + } else { yEnd = height + srcY; + } multiplierSrcY = ConvertPixelsToTiles(src->width); - multiplierDstY = ConvertPixelsToTiles(dst->width); + multiplierDestY = ConvertPixelsToTiles(dest->width); - if (colorKey == 0xFFFF) - { - for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++) - { - for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++) - { + if (colorKey == 0xFFFF) { + for (loopSrcY = srcY, loopDestY = destY; loopSrcY < yEnd; loopSrcY++, loopDestY++) { + for (loopSrcX = srcX, loopDestX = destX; loopSrcX < xEnd; loopSrcX++, loopDestX++) { pixelsSrc = GetPixelAddressFromBlit8bpp(src->pixels, loopSrcX, loopSrcY, multiplierSrcY); - pixelsDst = GetPixelAddressFromBlit8bpp(dst->pixels, loopDstX, loopDstY, multiplierDstY); + pixelsDest = GetPixelAddressFromBlit8bpp(dest->pixels, loopDestX, loopDestY, multiplierDestY); - *pixelsDst = *pixelsSrc; + *pixelsDest = *pixelsSrc; } } - } - else - { - for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++) - { - for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++) - { + } else { + for (loopSrcY = srcY, loopDestY = destY; loopSrcY < yEnd; loopSrcY++, loopDestY++) { + for (loopSrcX = srcX, loopDestX = destX; loopSrcX < xEnd; loopSrcX++, loopDestX++) { pixelsSrc = GetPixelAddressFromBlit8bpp(src->pixels, loopSrcX, loopSrcY, multiplierSrcY); - pixelsDst = GetPixelAddressFromBlit8bpp(dst->pixels, loopDstX, loopDstY, multiplierDstY); + pixelsDest = GetPixelAddressFromBlit8bpp(dest->pixels, loopDestX, loopDestY, multiplierDestY); - if (*pixelsSrc != colorKey) - *pixelsDst = *pixelsSrc; + if (*pixelsSrc != colorKey) { + *pixelsDest = *pixelsSrc; + } } } } } -void FillBitmapRect4Bit( - struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue) -{ - - int r6 = x + width; - if (r6 > surface->width) - { - r6 = surface->width; +static void FillBitmapRect4Bit(const Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue) { + int xEnd = x + width; + if (xEnd > surface->width) { + xEnd = surface->width; } - int r12 = y + height; - if (r12 > surface->height) - { - r12 = surface->height; + int yEnd = y + height; + if (yEnd > surface->height) { + yEnd = surface->height; } - int lr = ConvertPixelsToTiles(surface->width); + int blitWidth = ConvertPixelsToTiles(surface->width); - for (int loopY = y; loopY < r12; loopY++) - { + for (int i = y; i < yEnd; i++) { + for (int j = x; j < xEnd; j++) { + u8 *pixels = GetPixelAddressFromBlit4bpp(surface->pixels, j, i, blitWidth); - for (int loopX = x; loopX < r6; loopX++) - { - - u8 *pixelAddr = GetPixelAddressFromBlit4bpp(surface->pixels, loopX, loopY, lr); - - if ((loopX & 1) != 0) - { - *pixelAddr &= 0xf; - *pixelAddr |= (fillValue << 4); - } - else - { - *pixelAddr &= 0xf0; - *pixelAddr |= fillValue; + if ((j & 1) != 0) { + *pixels &= 0xf; + *pixels |= (fillValue << 4); + } else { + *pixels &= 0xf0; + *pixels |= fillValue; } } } } -void FillBitmapRect8Bit( - struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue) -{ - - int r6 = x + width; - if (r6 > surface->width) - { - r6 = surface->width; +void FillBitmapRect8Bit(const Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue) { + int xEnd = x + width; + if (xEnd > surface->width) { + xEnd = surface->width; } - int r12 = y + height; - if (r12 > surface->height) - { - r12 = surface->height; + int yEnd = y + height; + if (yEnd > surface->height) { + yEnd = surface->height; } - int lr = ConvertPixelsToTiles(surface->width); + int blitWidth = ConvertPixelsToTiles(surface->width); - for (int loopY = y; loopY < r12; loopY++) - { - - for (int loopX = x; loopX < r6; loopX++) - { - - u8 *pixelAddr = GetPixelAddressFromBlit8bpp(surface->pixels, loopX, loopY, lr); - - *pixelAddr = fillValue; + for (int i = y; i < yEnd; i++) { + for (int j = x; j < xEnd; j++) { + u8 *pixels = GetPixelAddressFromBlit8bpp(surface->pixels, j, i, blitWidth); + *pixels = fillValue; } } } -struct Window *AllocWindows(HeapID heapId, s32 size) -{ - struct Window *ptr = AllocFromHeap(heapId, (u32)(size << 4)); - - for (u16 i = 0; i < size; i++) - { - InitWindow(&ptr[i]); +Window *AllocWindows(HeapID heapId, s32 num) { + Window *ret = AllocFromHeap(heapId, num * sizeof(Window)); + for (u16 i = 0; i < num; i++) { + InitWindow(&ret[i]); } - - return ptr; + return ret; } -void InitWindow(struct Window *window) -{ +void InitWindow(Window *window) { window->bgConfig = NULL; window->bgId = GF_BG_LYR_UNALLOC; window->tilemapLeft = 0; @@ -1874,75 +1424,51 @@ void InitWindow(struct Window *window) window->width = 0; window->height = 0; window->paletteNum = 0; - window->baseTile = 0; window->pixelBuffer = NULL; - window->colorMode = GF_BG_CLR_4BPP; } -BOOL WindowIsInUse(struct Window *window) -{ - if (window->bgConfig == NULL || window->bgId == 0xff || window->pixelBuffer == NULL) - { +BOOL WindowIsInUse(const Window *window) { + if (window->bgConfig == NULL || window->bgId == 0xFF || window->pixelBuffer == NULL) { return FALSE; } return TRUE; } -void AddWindowParameterized(struct BgConfig *param0, - struct Window *window, - u8 bgId, - u8 tilemapLeft, - u8 tilemapTop, - u8 width, - u8 height, - u8 paletteNum, - u16 baseTile) -{ - if (param0->bgs[bgId].tilemapBuffer == NULL) - { +void AddWindowParameterized(BgConfig *bgConfig, Window *window, u8 bgId, u8 x, u8 y, u8 width, u8 height, u8 paletteNum, u16 baseTile) { + if (bgConfig->bgs[bgId].tilemapBuffer == NULL) { return; } - void *ptr = AllocFromHeap(param0->heapId, (u32)(width * height * param0->bgs[bgId].tileSize)); + void *buffer = AllocFromHeap(bgConfig->heapId, width * height * bgConfig->bgs[bgId].tileSize); - if (ptr == NULL) - { + if (buffer == NULL) { return; } - window->bgConfig = param0; + window->bgConfig = bgConfig; window->bgId = bgId; - window->tilemapLeft = tilemapLeft; - window->tilemapTop = tilemapTop; + window->tilemapLeft = x; + window->tilemapTop = y; window->width = width; window->height = height; window->paletteNum = paletteNum; - window->baseTile = baseTile; - window->pixelBuffer = ptr; - - window->colorMode = param0->bgs[bgId].colorMode == GX_BG_COLORMODE_16 ? GF_BG_CLR_4BPP : GF_BG_CLR_8BPP; + window->pixelBuffer = buffer; + window->colorMode = bgConfig->bgs[bgId].colorMode == GX_BG_COLORMODE_16 ? GF_BG_CLR_4BPP : GF_BG_CLR_8BPP; } -void AddTextWindowTopLeftCorner(struct BgConfig *param0, - struct Window *window, - u8 width, - u8 height, - u16 baseTile, - u8 paletteNum) -{ - u32 size = (u32)(width * height * 32); +void AddTextWindowTopLeftCorner(BgConfig *bgConfig, Window *window, u8 width, u8 height, u16 baseTile, u8 paletteNum) { + u32 size = width * height * 32; - void *ptr = AllocFromHeap(param0->heapId, size); + void *ptr = AllocFromHeap(bgConfig->heapId, size); paletteNum |= (paletteNum * 16); - memset(ptr, paletteNum, size); + memset(ptr, paletteNum, size); // could cause a data protection abort if below is true - if (ptr != NULL) - { - window->bgConfig = param0; + if (ptr != NULL) { + window->bgConfig = bgConfig; window->width = width; window->height = height; window->baseTile = baseTile; @@ -1951,27 +1477,15 @@ void AddTextWindowTopLeftCorner(struct BgConfig *param0, } } -void AddWindow( - struct BgConfig *bgConfig, struct Window *window, const struct WindowTemplate *template) -{ - - AddWindowParameterized(bgConfig, - window, - template->bgId, - template->tilemapLeft, - template->tilemapTop, - template->width, - template->height, - template->paletteNum, - template->baseTile); +void AddWindow(BgConfig *bgConfig, Window *window, const WindowTemplate *template) { + AddWindowParameterized(bgConfig, window, template->bgId, template->left, template->top, template->width, template->height, template->palette, template->baseTile); } -void RemoveWindow(struct Window *window) -{ +void RemoveWindow(Window *window) { FreeToHeap(window->pixelBuffer); window->bgConfig = NULL; - window->bgId = 0xff; + window->bgId = GF_BG_LYR_UNALLOC; window->tilemapLeft = 0; window->tilemapTop = 0; window->width = 0; @@ -1981,12 +1495,9 @@ void RemoveWindow(struct Window *window) window->pixelBuffer = NULL; } -void WindowArray_Delete(struct Window *windows, int count) -{ - for (u16 i = 0; i < count; i++) - { - if (windows[i].pixelBuffer != NULL) - { +void WindowArray_Delete(Window *windows, s32 count) { + for (u16 i = 0; i < count; i++) { + if (windows[i].pixelBuffer != NULL) { FreeToHeap(windows[i].pixelBuffer); } } @@ -1994,35 +1505,27 @@ void WindowArray_Delete(struct Window *windows, int count) FreeToHeap(windows); } -void CopyWindowToVram(struct Window *window) -{ - +void CopyWindowToVram(Window *window) { GF_ASSERT(window != NULL); GF_ASSERT(window->bgConfig != NULL); - GF_ASSERT(window->bgId < NELEMS(window->bgConfig->bgs)); - GF_ASSERT(window->bgConfig->bgs[window->bgId].mode < NELEMS(sCopyWindowToVramFuncs)); - + GF_ASSERT(window->bgId < GF_BG_LYR_MAX); + GF_ASSERT(window->bgConfig->bgs[window->bgId].mode < GF_BG_TYPE_MAX); sCopyWindowToVramFuncs[window->bgConfig->bgs[window->bgId].mode](window); } -void ScheduleWindowCopyToVram(struct Window *window) -{ - - GF_ASSERT(window); - GF_ASSERT(window->bgConfig); - GF_ASSERT(window->bgId < NELEMS(window->bgConfig->bgs)); - GF_ASSERT(window->bgConfig->bgs[window->bgId].mode < NELEMS(sScheduleWindowCopyToVramFuncs)); - +void ScheduleWindowCopyToVram(Window *window) { + GF_ASSERT(window != NULL); + GF_ASSERT(window->bgConfig != NULL); + GF_ASSERT(window->bgId < GF_BG_LYR_MAX); + GF_ASSERT(window->bgConfig->bgs[window->bgId].mode < GF_BG_TYPE_MAX); sScheduleWindowCopyToVramFuncs[window->bgConfig->bgs[window->bgId].mode](window); } -void PutWindowTilemap(struct Window *window) -{ +void PutWindowTilemap(Window *window) { sPutWindowTilemapFuncs[window->bgConfig->bgs[window->bgId].mode](window); } -void PutWindowTilemapRectAnchoredTopLeft(struct Window *window, u8 width, u8 height) -{ +void PutWindowTilemapRectAnchoredTopLeft(Window *window, u8 width, u8 height) { u8 widthBak = window->width; u8 heightBak = window->height; @@ -2034,293 +1537,197 @@ void PutWindowTilemapRectAnchoredTopLeft(struct Window *window, u8 width, u8 hei window->height = heightBak; } -void ClearWindowTilemap(struct Window *window) -{ +void ClearWindowTilemap(Window *window) { sClearWindowTilemapFuncs[window->bgConfig->bgs[window->bgId].mode](window); } -void PutWindowTilemap_TextMode(struct Window *param0) -{ +static void PutWindowTilemap_TextMode(Window *window) { u32 i, j; - u32 r3; - u32 iCount, jCount; - u16 *st4 = param0->bgConfig->bgs[param0->bgId].tilemapBuffer; + u32 tile; + u32 tilemapBottom, tilemapRight; + u16 *tilemap = window->bgConfig->bgs[window->bgId].tilemapBuffer; - if (st4 == NULL) - { + if (tilemap == NULL) { return; } - r3 = param0->baseTile; - jCount = (u32)(param0->tilemapLeft + param0->width); - iCount = (u32)(param0->tilemapTop + param0->height); + tile = window->baseTile; + tilemapRight = window->tilemapLeft + window->width; + tilemapBottom = window->tilemapTop + window->height; - for (i = param0->tilemapTop; i < iCount; i++) - { - for (j = param0->tilemapLeft; j < jCount; j++) - { - st4[((i & 0x20) * 32) + ((j & 0x20) * 32) + ((i & 0x1f) << 5) + (j & 0x1f)] = - (u16)(r3 | (param0->paletteNum << 12)); - - r3++; + for (i = window->tilemapTop; i < tilemapBottom; i++) { + for (j = window->tilemapLeft; j < tilemapRight; j++) { + tilemap[((i & 0x20) * 32) + ((j & 0x20) * 32) + ((i & 0x1f) << 5) + (j & 0x1f)] = tile | (window->paletteNum << 12); + tile++; } } } -void PutWindowTilemap_AffineMode(struct Window *window) -{ +static void PutWindowTilemap_AffineMode(Window *window) { int j, i; - u8 *dst; + u8 *tilemap; - int tileId; + int tile; int tilemapWidth; - if (window->bgConfig->bgs[window->bgId].tilemapBuffer == NULL) - { + if (window->bgConfig->bgs[window->bgId].tilemapBuffer == NULL) { return; } tilemapWidth = sTilemapWidthByBufferSize[window->bgConfig->bgs[window->bgId].size]; - dst = window->bgConfig->bgs[window->bgId].tilemapBuffer + window->tilemapTop * tilemapWidth + window->tilemapLeft; - tileId = window->baseTile; + tilemap = window->bgConfig->bgs[window->bgId].tilemapBuffer + window->tilemapTop * tilemapWidth + window->tilemapLeft; + tile = window->baseTile; - for (i = 0; i < window->height; i++) - { - for (j = 0; j < window->width; j++) - { - dst[j] = (u8)tileId; - tileId++; + for (i = 0; i < window->height; i++) { + for (j = 0; j < window->width; j++) { + tilemap[j] = tile++; } - dst += tilemapWidth; + tilemap += tilemapWidth; } } -void ClearWindowTilemapText(struct Window *window) -{ - +static void ClearWindowTilemapText(Window *window) { u32 i, j; - - u32 yEnd, xEnd; + u32 tilemapBottom, tilemapRight; u32 tilemapWidth; + u16 *tilemap; - u16 *dst; - - if (window->bgConfig->bgs[window->bgId].tilemapBuffer == NULL) - { + if (window->bgConfig->bgs[window->bgId].tilemapBuffer == NULL) { return; } - dst = window->bgConfig->bgs[window->bgId].tilemapBuffer; - + tilemap = window->bgConfig->bgs[window->bgId].tilemapBuffer; tilemapWidth = sTilemapWidthByBufferSize[window->bgConfig->bgs[window->bgId].size]; - xEnd = (u32)(window->tilemapLeft + window->width); - yEnd = (u32)(window->tilemapTop + window->height); - - for (i = window->tilemapTop; i < yEnd; i++) - { - for (j = window->tilemapLeft; j < xEnd; j++) - { - dst[((i & 0x20) * 32) + ((j & 0x20) * 32) + ((i & 0x1f) * tilemapWidth) + (j & 0x1f)] = 0; + tilemapRight = window->tilemapLeft + window->width; + tilemapBottom = window->tilemapTop + window->height; + for (i = window->tilemapTop; i < tilemapBottom; i++) { + for (j = window->tilemapLeft; j < tilemapRight; j++) { + tilemap[((i & 0x20) * 32) + ((j & 0x20) * 32) + ((i & 0x1f) * tilemapWidth) + (j & 0x1f)] = 0; } } } -void ClearWindowTilemapAffine(struct Window *window) -{ - +static void ClearWindowTilemapAffine(Window *window) { int j, i; - u8 *dstPos; - + u8 *tilemap; int tilemapWidth; - if (window->bgConfig->bgs[window->bgId].tilemapBuffer == NULL) - { + if (window->bgConfig->bgs[window->bgId].tilemapBuffer == NULL) { return; } tilemapWidth = sTilemapWidthByBufferSize[window->bgConfig->bgs[window->bgId].size]; - dstPos = window->bgConfig->bgs[window->bgId].tilemapBuffer + window->tilemapTop * tilemapWidth + window->tilemapLeft; - - for (i = 0; i < window->height; i++) - { - for (j = 0; j < window->width; j++) - { - dstPos[j] = 0; + tilemap = window->bgConfig->bgs[window->bgId].tilemapBuffer + window->tilemapTop * tilemapWidth + window->tilemapLeft; + for (i = 0; i < window->height; i++) { + for (j = 0; j < window->width; j++) { + tilemap[j] = 0; } - dstPos += tilemapWidth; + tilemap += tilemapWidth; } } -void CopyWindowToVram_TextMode(struct Window *window) -{ +static void CopyWindowToVram_TextMode(Window *window) { PutWindowTilemap_TextMode(window); CopyWindowPixelsToVram_TextMode(window); - BgCopyOrUncompressTilemapBufferRangeToVram(window->bgConfig, - window->bgId, - window->bgConfig->bgs[window->bgId].tilemapBuffer, - window->bgConfig->bgs[window->bgId].bufferSize, - window->bgConfig->bgs[window->bgId].baseTile); + BgCopyOrUncompressTilemapBufferRangeToVram(window->bgConfig, window->bgId, window->bgConfig->bgs[window->bgId].tilemapBuffer, window->bgConfig->bgs[window->bgId].bufferSize, window->bgConfig->bgs[window->bgId].baseTile); } -void ScheduleWindowCopyToVram_TextMode(struct Window *window) -{ +static void ScheduleWindowCopyToVram_TextMode(Window *window) { PutWindowTilemap_TextMode(window); ScheduleBgTilemapBufferTransfer(window->bgConfig, window->bgId); CopyWindowPixelsToVram_TextMode(window); } -void CopyWindowToVram_AffineMode(struct Window *window) -{ +static void CopyWindowToVram_AffineMode(Window *window) { PutWindowTilemap_AffineMode(window); - BgCopyOrUncompressTilemapBufferRangeToVram(window->bgConfig, - window->bgId, - window->bgConfig->bgs[window->bgId].tilemapBuffer, - window->bgConfig->bgs[window->bgId].bufferSize, - window->bgConfig->bgs[window->bgId].baseTile); - - BG_LoadCharTilesData(window->bgConfig, - window->bgId, - window->pixelBuffer, - (u32)(window->width * window->height * 64), - window->baseTile); + BgCopyOrUncompressTilemapBufferRangeToVram(window->bgConfig, window->bgId, window->bgConfig->bgs[window->bgId].tilemapBuffer, window->bgConfig->bgs[window->bgId].bufferSize, window->bgConfig->bgs[window->bgId].baseTile); + BG_LoadCharTilesData(window->bgConfig, window->bgId, window->pixelBuffer, window->width * window->height * TILE_SIZE_8BPP, window->baseTile); } -void ScheduleWindowCopyToVram_AffineMode(struct Window *window) -{ +static void ScheduleWindowCopyToVram_AffineMode(Window *window) { PutWindowTilemap_AffineMode(window); ScheduleBgTilemapBufferTransfer(window->bgConfig, window->bgId); - BG_LoadCharTilesData(window->bgConfig, - window->bgId, - window->pixelBuffer, - (u32)(window->width * window->height * 64), - window->baseTile); + BG_LoadCharTilesData(window->bgConfig, window->bgId, window->pixelBuffer, window->width * window->height * TILE_SIZE_8BPP, window->baseTile); } -void CopyWindowPixelsToVram_TextMode(struct Window *window) -{ - BG_LoadCharTilesData(window->bgConfig, - window->bgId, - window->pixelBuffer, - (u32)(window->width * window->height * window->bgConfig->bgs[window->bgId].tileSize), - window->baseTile); +void CopyWindowPixelsToVram_TextMode(Window *window) { + BG_LoadCharTilesData(window->bgConfig, window->bgId, window->pixelBuffer, window->width * window->height * window->bgConfig->bgs[window->bgId].tileSize, window->baseTile); } -void ClearWindowTilemapAndCopyToVram(struct Window *window) -{ +void ClearWindowTilemapAndCopyToVram(Window *window) { sClearWindowTilemapAndCopyToVramFuncs[window->bgConfig->bgs[window->bgId].mode](window); } -void ClearWindowTilemapAndScheduleTransfer(struct Window *window) -{ +void ClearWindowTilemapAndScheduleTransfer(Window *window) { sClearWindowTilemapAndScheduleTransferFuncs[window->bgConfig->bgs[window->bgId].mode](window); } -void ClearWindowTilemapAndCopyToVram_TextMode(struct Window *window) -{ +static void ClearWindowTilemapAndCopyToVram_TextMode(Window *window) { ClearWindowTilemapText(window); - BgCopyOrUncompressTilemapBufferRangeToVram(window->bgConfig, - window->bgId, - window->bgConfig->bgs[window->bgId].tilemapBuffer, - window->bgConfig->bgs[window->bgId].bufferSize, - window->bgConfig->bgs[window->bgId].baseTile); + BgCopyOrUncompressTilemapBufferRangeToVram(window->bgConfig, window->bgId, window->bgConfig->bgs[window->bgId].tilemapBuffer, window->bgConfig->bgs[window->bgId].bufferSize, window->bgConfig->bgs[window->bgId].baseTile); } -void ClearWindowTilemapAndScheduleTransfer_TextMode(struct Window *window) -{ +static void ClearWindowTilemapAndScheduleTransfer_TextMode(Window *window) { ClearWindowTilemapText(window); ScheduleBgTilemapBufferTransfer(window->bgConfig, window->bgId); } -void ClearWindowTilemapAndCopyToVram_AffineMode(struct Window *window) -{ +static void ClearWindowTilemapAndCopyToVram_AffineMode(Window *window) { ClearWindowTilemapAffine(window); - BgCopyOrUncompressTilemapBufferRangeToVram(window->bgConfig, - window->bgId, - window->bgConfig->bgs[window->bgId].tilemapBuffer, - window->bgConfig->bgs[window->bgId].bufferSize, - window->bgConfig->bgs[window->bgId].baseTile); + BgCopyOrUncompressTilemapBufferRangeToVram(window->bgConfig, window->bgId, window->bgConfig->bgs[window->bgId].tilemapBuffer, window->bgConfig->bgs[window->bgId].bufferSize, window->bgConfig->bgs[window->bgId].baseTile); } -void ClearWindowTilemapAndScheduleTransfer_AffineMode(struct Window *window) -{ +static void ClearWindowTilemapAndScheduleTransfer_AffineMode(Window *window) { ClearWindowTilemapAffine(window); ScheduleBgTilemapBufferTransfer(window->bgConfig, window->bgId); } -void FillWindowPixelBuffer(struct Window *window, u8 param1) -{ - if (window->bgConfig->bgs[window->bgId].tileSize == 0x20) - { - param1 |= param1 << 4; +void FillWindowPixelBuffer(Window *window, u8 fillValue) { + if (window->bgConfig->bgs[window->bgId].tileSize == 0x20) { + fillValue |= fillValue << 4; } - MI_CpuFillFast( - window->pixelBuffer, - (u32)((param1 << 0x18) | (param1 << 0x10) | (param1 << 0x8) | param1), - (u32)(window->bgConfig->bgs[window->bgId].tileSize * window->width * window->height)); + MI_CpuFillFast(window->pixelBuffer, ((fillValue << 0x18) | (fillValue << 0x10) | (fillValue << 0x8) | fillValue), window->bgConfig->bgs[window->bgId].tileSize * window->width * window->height); } -void BlitBitmapRectToWindow(struct Window *window, - const void *src, - u16 srcX, - u16 srcY, - u16 srcWidth, - u16 srcHeight, - u16 dstX, - u16 dstY, - u16 dstWidth, - u16 dstHeight) -{ - BlitBitmapRect( - window, src, srcX, srcY, srcWidth, srcHeight, dstX, dstY, dstWidth, dstHeight, 0); +void BlitBitmapRectToWindow(Window *window, void *src, u16 srcX, u16 srcY, u16 srcWidth, u16 srcHeight, u16 destX, u16 destY, u16 destWidth, u16 destHeight) { + BlitBitmapRect(window, src, srcX, srcY, srcWidth, srcHeight, destX, destY, destWidth, destHeight, 0); } -void BlitBitmapRect(struct Window *window, - void *param1, - u16 param2, - u16 param3, - u16 param4, - u16 param5, - u16 param6, - u16 param7, - u16 param8, - u16 param9, - u16 param10) -{ - struct Bitmap st1c = { param1, param4, param5 }; - struct Bitmap st14 = { - window->pixelBuffer, (u16)(window->width << 3), (u16)(window->height << 3) - }; +void BlitBitmapRect(Window *window, void *src, u16 srcX, u16 srcY, u16 srcWidth, u16 srcHeight, u16 destX, u16 destY, u16 destWidth, u16 destHeight, u16 colorKey) { + Bitmap bmpSrc, bmpDest; - if (window->bgConfig->bgs[window->bgId].colorMode == GX_BG_COLORMODE_16) - { - BlitBitmapRect4Bit(&st1c, &st14, param2, param3, param6, param7, param8, param9, param10); - } - else - { - BlitBitmapRect8Bit(&st1c, &st14, param2, param3, param6, param7, param8, param9, param10); + bmpSrc.pixels = src; + bmpSrc.width = srcWidth; + bmpSrc.height = srcHeight; + + bmpDest.pixels = window->pixelBuffer; + bmpDest.width = window->width * 8; + bmpDest.height = window->height * 8; + + if (window->bgConfig->bgs[window->bgId].colorMode == GF_BG_CLR_4BPP) { + BlitBitmapRect4Bit(&bmpSrc, &bmpDest, srcX, srcY, destX, destY, destWidth, destHeight, colorKey); + } else { + BlitBitmapRect8Bit(&bmpSrc, &bmpDest, srcX, srcY, destX, destY, destWidth, destHeight, colorKey); } } -void FillWindowPixelRect( - struct Window *window, u8 fillValue, u16 x, u16 y, u16 width, u16 height) -{ - struct Bitmap st8 = { - window->pixelBuffer, (u16)(window->width << 3), (u16)(window->height << 3) - }; +void FillWindowPixelRect(Window *window, u8 fillValue, u16 x, u16 y, u16 width, u16 height) { + Bitmap bmp; - if (window->bgConfig->bgs[window->bgId].colorMode == GX_BG_COLORMODE_16) - { - FillBitmapRect4Bit(&st8, x, y, width, height, fillValue); - } - else - { - FillBitmapRect8Bit(&st8, x, y, width, height, fillValue); + bmp.pixels = window->pixelBuffer; + bmp.width = window->width * 8; + bmp.height = window->height * 8; + + if (window->bgConfig->bgs[window->bgId].colorMode == GF_BG_CLR_4BPP) { + FillBitmapRect4Bit(&bmp, x, y, width, height, fillValue); + } else { + FillBitmapRect8Bit(&bmp, x, y, width, height, fillValue); } } #define GLYPH_COPY_4BPP(glyphPixels, srcX, srcY, srcWidth, srcHeight, windowPixels, destX, destY, destWidth, table) { \ - int srcJ, dstJ, srcI, dstI, bits; \ + int srcJ, destJ, srcI, destI, bits; \ u8 toOrr; \ u8 tableFlag; \ u8 tableBit; \ @@ -2330,13 +1737,13 @@ void FillWindowPixelRect( \ src = glyphPixels + (srcY / 8 * 64) + (srcX / 8 * 32); \ if (srcY == 0) { \ - dstI = destY + srcY; \ + destI = destY + srcY; \ tableBit = table & 0xFF; \ } else { \ - dstI = destY + srcY; \ + destI = destY + srcY; \ for (srcI = 0; srcI < 8; srcI++) { \ if (((table >> srcI) & 1) != 0) { \ - dstI++; \ + destI++; \ } \ } \ tableBit = table >> 8; \ @@ -2344,30 +1751,30 @@ void FillWindowPixelRect( for (srcI = 0; srcI < srcHeight; srcI++) { \ pixelData = *(u32 *)src; \ tableFlag = (tableBit >> srcI) & 1; \ - for (srcJ = 0, dstJ = destX + srcX; srcJ < srcWidth; srcJ++, dstJ++) { \ - dest = GetPixelAddressFromBlit4bpp(windowPixels, dstJ, dstI, destWidth); \ + for (srcJ = 0, destJ = destX + srcX; srcJ < srcWidth; srcJ++, destJ++) { \ + dest = GetPixelAddressFromBlit4bpp(windowPixels, destJ, destI, destWidth); \ toOrr = (pixelData >> (srcJ * 4)) & 0xF; \ if (toOrr != 0) { \ - bits = (dstJ & 1) * 4; \ + bits = (destJ & 1) * 4; \ toOrr = (toOrr << bits) | (*dest & (0xF0 >> bits)); \ *dest = toOrr; \ if (tableFlag) { \ - dest = GetPixelAddressFromBlit4bpp(windowPixels, dstJ, dstI + 1, destWidth); \ + dest = GetPixelAddressFromBlit4bpp(windowPixels, destJ, destI + 1, destWidth); \ *dest = toOrr; \ } \ } \ } \ if (tableFlag) { \ - dstI += 2; \ + destI += 2; \ } else { \ - dstI += 1; \ + destI += 1; \ } \ src += 4; \ } \ } #define GLYPH_COPY_8BPP(glyphPixels, srcX, srcY, srcWidth, srcHeight, windowPixels, destX, destY, destWidth, table) { \ - int srcJ, dstJ, srcI, dstI; \ + int srcJ, destJ, srcI, destI; \ u8 toOrr; \ u8 tableFlag; \ u8 tableBit; \ @@ -2377,13 +1784,13 @@ void FillWindowPixelRect( \ src = glyphPixels + (srcY / 8 * 128) + (srcX / 8 * 64); \ if (srcY == 0) { \ - dstI = destY + srcY; \ + destI = destY + srcY; \ tableBit = table & 0xFF; \ } else { \ - dstI = destY + srcY; \ + destI = destY + srcY; \ for (srcI = 0; srcI < 8; srcI++) { \ if (((table >> srcI) & 1) != 0) { \ - dstI++; \ + destI++; \ } \ } \ tableBit = table >> 8; \ @@ -2391,28 +1798,27 @@ void FillWindowPixelRect( for (srcI = 0; srcI < srcHeight; srcI++) { \ pixelData = (u8 *)src; \ tableFlag = (tableBit >> srcI) & 1; \ - for (srcJ = 0, dstJ = destX + srcX; srcJ < srcWidth; srcJ++, dstJ++) { \ - dest = GetPixelAddressFromBlit8bpp(windowPixels, dstJ, dstI, destWidth); \ + for (srcJ = 0, destJ = destX + srcX; srcJ < srcWidth; srcJ++, destJ++) { \ + dest = GetPixelAddressFromBlit8bpp(windowPixels, destJ, destI, destWidth); \ toOrr = pixelData[srcJ]; \ if (toOrr != 0) { \ *dest = toOrr; \ if (tableFlag) { \ - dest = GetPixelAddressFromBlit8bpp(windowPixels, dstJ, dstI + 1, destWidth); \ + dest = GetPixelAddressFromBlit8bpp(windowPixels, destJ, destI + 1, destWidth); \ *dest = toOrr; \ } \ } \ } \ if (tableFlag) { \ - dstI += 2; \ + destI += 2; \ } else { \ - dstI += 1; \ + destI += 1; \ } \ src += 8; \ } \ } -void CopyGlyphToWindow(struct Window *window, u8 *glyphPixels, u16 srcWidth, u16 srcHeight, u16 dstX, u16 dstY, u16 table) -{ +void CopyGlyphToWindow(Window *window, u8 *glyphPixels, u16 srcWidth, u16 srcHeight, u16 destX, u16 destY, u16 table) { u8 *windowPixels; u16 destWidth, destHeight; int srcRight, srcBottom; @@ -2423,13 +1829,13 @@ void CopyGlyphToWindow(struct Window *window, u8 *glyphPixels, u16 srcWidth, u16 destHeight = (u16)(window->height * 8); // Don't overflow the window - if (destWidth - dstX < srcWidth) { - srcRight = destWidth - dstX; + if (destWidth - destX < srcWidth) { + srcRight = destWidth - destX; } else { srcRight = srcWidth; } - if (destHeight - dstY < srcHeight) { - srcBottom = destHeight - dstY; + if (destHeight - destY < srcHeight) { + srcBottom = destHeight - destY; } else { srcBottom = srcHeight; } @@ -2447,24 +1853,24 @@ void CopyGlyphToWindow(struct Window *window, u8 *glyphPixels, u16 srcWidth, u16 if (window->colorMode == GF_BG_CLR_4BPP) { switch (glyphSizeParam) { case 0: // 1x1 - GLYPH_COPY_4BPP(glyphPixels, 0, 0, srcRight, srcBottom, windowPixels, dstX, dstY, ConvertPixelsToTiles(destWidth), table); + GLYPH_COPY_4BPP(glyphPixels, 0, 0, srcRight, srcBottom, windowPixels, destX, destY, ConvertPixelsToTiles(destWidth), table); return; case 1: // 2x1 - GLYPH_COPY_4BPP(glyphPixels, 0, 0, 8, srcBottom, windowPixels, dstX, dstY, ConvertPixelsToTiles(destWidth), table); - GLYPH_COPY_4BPP(glyphPixels, 8, 0, srcRight - 8, srcBottom, windowPixels, dstX, dstY, ConvertPixelsToTiles(destWidth), table); + GLYPH_COPY_4BPP(glyphPixels, 0, 0, 8, srcBottom, windowPixels, destX, destY, ConvertPixelsToTiles(destWidth), table); + GLYPH_COPY_4BPP(glyphPixels, 8, 0, srcRight - 8, srcBottom, windowPixels, destX, destY, ConvertPixelsToTiles(destWidth), table); return; case 2: // 1x2 - GLYPH_COPY_4BPP(glyphPixels, 0, 0, srcRight, 8, windowPixels, dstX, dstY, ConvertPixelsToTiles(destWidth), table); - GLYPH_COPY_4BPP(glyphPixels, 0, 8, srcRight, srcBottom - 8, windowPixels, dstX, dstY, ConvertPixelsToTiles(destWidth), table); + GLYPH_COPY_4BPP(glyphPixels, 0, 0, srcRight, 8, windowPixels, destX, destY, ConvertPixelsToTiles(destWidth), table); + GLYPH_COPY_4BPP(glyphPixels, 0, 8, srcRight, srcBottom - 8, windowPixels, destX, destY, ConvertPixelsToTiles(destWidth), table); return; case 3: // 2x2 - GLYPH_COPY_4BPP(glyphPixels, 0, 0, 8, 8, windowPixels, dstX, dstY, ConvertPixelsToTiles(destWidth), table); - GLYPH_COPY_4BPP(glyphPixels, 8, 0, srcRight - 8, 8, windowPixels, dstX, dstY, ConvertPixelsToTiles(destWidth), table); - GLYPH_COPY_4BPP(glyphPixels, 0, 8, 8, srcBottom - 8, windowPixels, dstX, dstY, ConvertPixelsToTiles(destWidth), table); - GLYPH_COPY_4BPP(glyphPixels, 8, 8, srcRight - 8, srcBottom - 8, windowPixels, dstX, dstY, ConvertPixelsToTiles(destWidth), table); + GLYPH_COPY_4BPP(glyphPixels, 0, 0, 8, 8, windowPixels, destX, destY, ConvertPixelsToTiles(destWidth), table); + GLYPH_COPY_4BPP(glyphPixels, 8, 0, srcRight - 8, 8, windowPixels, destX, destY, ConvertPixelsToTiles(destWidth), table); + GLYPH_COPY_4BPP(glyphPixels, 0, 8, 8, srcBottom - 8, windowPixels, destX, destY, ConvertPixelsToTiles(destWidth), table); + GLYPH_COPY_4BPP(glyphPixels, 8, 8, srcRight - 8, srcBottom - 8, windowPixels, destX, destY, ConvertPixelsToTiles(destWidth), table); return; } } else { // 8bpp @@ -2472,237 +1878,184 @@ void CopyGlyphToWindow(struct Window *window, u8 *glyphPixels, u16 srcWidth, u16 convertedSrc = Convert4bppTo8bpp(glyphPixels, srcWidth * 4 * srcHeight * 8, window->paletteNum, window->bgConfig->heapId); switch (glyphSizeParam) { case 0: // 1x1 - GLYPH_COPY_8BPP(convertedSrc, 0, 0, srcRight, srcBottom, windowPixels, dstX, dstY, ConvertPixelsToTiles(destWidth), table); + GLYPH_COPY_8BPP(convertedSrc, 0, 0, srcRight, srcBottom, windowPixels, destX, destY, ConvertPixelsToTiles(destWidth), table); break; case 1: // 2x1 - GLYPH_COPY_8BPP(convertedSrc, 0, 0, 8, srcBottom, windowPixels, dstX, dstY, ConvertPixelsToTiles(destWidth), table); - GLYPH_COPY_8BPP(convertedSrc, 8, 0, srcRight - 8, srcBottom, windowPixels, dstX, dstY, ConvertPixelsToTiles(destWidth), table); + GLYPH_COPY_8BPP(convertedSrc, 0, 0, 8, srcBottom, windowPixels, destX, destY, ConvertPixelsToTiles(destWidth), table); + GLYPH_COPY_8BPP(convertedSrc, 8, 0, srcRight - 8, srcBottom, windowPixels, destX, destY, ConvertPixelsToTiles(destWidth), table); break; case 2: // 1x2 - GLYPH_COPY_8BPP(convertedSrc, 0, 0, srcRight, 8, windowPixels, dstX, dstY, ConvertPixelsToTiles(destWidth), table); - GLYPH_COPY_8BPP(convertedSrc, 0, 8, srcRight, srcBottom - 8, windowPixels, dstX, dstY, ConvertPixelsToTiles(destWidth), table); + GLYPH_COPY_8BPP(convertedSrc, 0, 0, srcRight, 8, windowPixels, destX, destY, ConvertPixelsToTiles(destWidth), table); + GLYPH_COPY_8BPP(convertedSrc, 0, 8, srcRight, srcBottom - 8, windowPixels, destX, destY, ConvertPixelsToTiles(destWidth), table); break; case 3: // 2x2 - GLYPH_COPY_8BPP(convertedSrc, 0, 0, 8, 8, windowPixels, dstX, dstY, ConvertPixelsToTiles(destWidth), table); - GLYPH_COPY_8BPP(convertedSrc, 8, 0, srcRight - 8, 8, windowPixels, dstX, dstY, ConvertPixelsToTiles(destWidth), table); - GLYPH_COPY_8BPP(convertedSrc, 0, 8, 8, srcBottom - 8, windowPixels, dstX, dstY, ConvertPixelsToTiles(destWidth), table); - GLYPH_COPY_8BPP(convertedSrc, 8, 8, srcRight - 8, srcBottom - 8, windowPixels, dstX, dstY, ConvertPixelsToTiles(destWidth), table); + GLYPH_COPY_8BPP(convertedSrc, 0, 0, 8, 8, windowPixels, destX, destY, ConvertPixelsToTiles(destWidth), table); + GLYPH_COPY_8BPP(convertedSrc, 8, 0, srcRight - 8, 8, windowPixels, destX, destY, ConvertPixelsToTiles(destWidth), table); + GLYPH_COPY_8BPP(convertedSrc, 0, 8, 8, srcBottom - 8, windowPixels, destX, destY, ConvertPixelsToTiles(destWidth), table); + GLYPH_COPY_8BPP(convertedSrc, 8, 8, srcRight - 8, srcBottom - 8, windowPixels, destX, destY, ConvertPixelsToTiles(destWidth), table); break; } FreeToHeap(convertedSrc); } } -void ScrollWindow(struct Window *window, u32 param1, u8 param2, u8 param3) -{ - if (window->bgConfig->bgs[window->bgId].colorMode == GX_BG_COLORMODE_16) - { - ScrollWindow4bpp(window, param1, param2, param3); - } - else - { - ScrollWindow8bpp(window, param1, param2, param3); +void ScrollWindow(Window *window, u8 direction, u8 y, u8 fillValue) { + if (window->bgConfig->bgs[window->bgId].colorMode == GF_BG_CLR_4BPP) { + ScrollWindow4bpp(window, direction, y, fillValue); + } else { + ScrollWindow8bpp(window, direction, y, fillValue); } } -void ScrollWindow4bpp(struct Window *window, u32 param1, u8 param2, u8 fillValue) -{ - void *r2; - int r5, r1, r3; - int st4, stc; - u32 st8; +static void ScrollWindow4bpp(Window *window, u8 direction, u8 y, u8 fillValue) { + u8 *pixelBuffer; + int y0, y1, y2; + int fillWord, size; + u32 width; int i, j; - r2 = window->pixelBuffer; - st4 = (fillValue << 0x18) | (fillValue << 0x10) | (fillValue << 0x8) | fillValue; - stc = window->height * window->width * 32; - st8 = window->width; + pixelBuffer = window->pixelBuffer; + fillWord = (fillValue << 24) | (fillValue << 16) | (fillValue << 8) | (fillValue << 0); + size = window->height * window->width * TILE_SIZE_4BPP; + width = window->width; - switch (param1) - { - case 0: - for (i = 0; i < stc; i += 32) - { - r3 = param2; - for (j = 0; j < 8; j++) - { - r5 = i + (j << 2); - r1 = i + (int)(((st8 * (r3 & ~7)) | (r3 & 7)) << 2); - - if (r1 < stc) - { - *(u32 *)(r2 + r5) = *(u32 *)(r2 + r1); + switch (direction) { + case 0: // up + for (i = 0; i < size; i += TILE_SIZE_4BPP) { + y0 = y; + for (j = 0; j < 8; j++) { + y1 = i + (j << 2); + y2 = i + (((width * (y0 & ~7)) | (y0 & 7)) << 2); + if (y2 < size) { + *(u32 *)(pixelBuffer + y1) = *(u32 *)(pixelBuffer + y2); + } else { + *(u32 *)(pixelBuffer + y1) = fillWord; + } + y0++; } - else - { - *(u32 *)(r2 + r5) = (u32)st4; - } - - r3++; } - } - - break; - case 1: - r2 += stc - 4; - for (i = 0; i < stc; i += 32) - { - r3 = param2; - for (j = 0; j < 8; j++) - { - r5 = i + (j << 2); - r1 = i + (int)(((st8 * (r3 & ~7)) | (r3 & 7)) << 2); - - if (r1 < stc) - { - *(u32 *)(r2 - r5) = *(u32 *)(r2 - r1); + break; + case 1: // down + pixelBuffer += size - 4; + for (i = 0; i < size; i += TILE_SIZE_4BPP) { + y0 = y; + for (j = 0; j < 8; j++) { + y1 = i + (j << 2); + y2 = i + (((width * (y0 & ~7)) | (y0 & 7)) << 2); + if (y2 < size) { + *(u32 *)(pixelBuffer - y1) = *(u32 *)(pixelBuffer - y2); + } else { + *(u32 *)(pixelBuffer - y1) = fillWord; + } + y0++; } - else - { - *(u32 *)(r2 - r5) = (u32)st4; - } - - r3++; } - } - - break; - case 2: - case 3: - break; + break; + case 2: // left + case 3: // right + break; } } -void ScrollWindow8bpp(struct Window *window, u32 param1, u8 param2, u8 fillValue) -{ - - void *pixelBuffer; - int dstOffs, srcOffs, r3; - int st4, size; - u32 srcWidth; +static void ScrollWindow8bpp(Window *window, u8 direction, u8 y, u8 fillValue) { + u8 *pixelBuffer; + int y0, y1, y2; + int fillWord, size; + u32 width; int i, j; - pixelBuffer = (u8 *)window->pixelBuffer; - st4 = (fillValue << 0x18) | (fillValue << 0x10) | (fillValue << 0x8) | fillValue; - size = window->height * window->width * 64; - srcWidth = window->width; + pixelBuffer = window->pixelBuffer; + fillWord = (fillValue << 24) | (fillValue << 16) | (fillValue << 8) | (fillValue << 0); + size = window->height * window->width * TILE_SIZE_8BPP; + width = window->width; - switch (param1) - { - case 0: - for (i = 0; i < size; i += 64) - { - r3 = param2; - for (j = 0; j < 8; j++) - { - dstOffs = i + (j << 3); - srcOffs = i + (int)(((srcWidth * (r3 & ~7)) | (r3 & 7)) << 3); - - if (srcOffs < size) - { - *(u32 *)(pixelBuffer + dstOffs) = *(u32 *)(pixelBuffer + srcOffs); + switch (direction) { + case 0: // up + for (i = 0; i < size; i += TILE_SIZE_8BPP) { + y0 = y; + for (j = 0; j < 8; j++) { + y1 = i + (j << 3); + y2 = i + (((width * (y0 & ~7)) | (y0 & 7)) << 3); + if (y2 < size) { + *(u32 *)(pixelBuffer + y1) = *(u32 *)(pixelBuffer + y2); + } else { + *(u32 *)(pixelBuffer + y1) = fillWord; + } + y1 += 4; + y2 += 4; + if (y2 < size + 4) { + *(u32 *)(pixelBuffer + y1) = *(u32 *)(pixelBuffer + y2); + } else { + *(u32 *)(pixelBuffer + y1) = fillWord; + } + y0++; } - else - { - *(u32 *)(pixelBuffer + dstOffs) = (u32)st4; - } - - dstOffs += 4; - srcOffs += 4; - if (srcOffs < size + 4) - { - *(u32 *)(pixelBuffer + dstOffs) = *(u32 *)(pixelBuffer + srcOffs); - } - else - { - *(u32 *)(pixelBuffer + dstOffs) = (u32)st4; - } - - r3++; } - } - - break; - case 1: - pixelBuffer += size - 8; - for (i = 0; i < size; i += 64) - { - r3 = param2; - for (j = 0; j < 8; j++) - { - dstOffs = i + (j << 3); - srcOffs = i + (int)(((srcWidth * (r3 & ~7)) | (r3 & 7)) << 3); - - if (srcOffs < size) - { - *(u32 *)(pixelBuffer - dstOffs) = *(u32 *)(pixelBuffer - srcOffs); + break; + case 1: // down + pixelBuffer += size - 8; + for (i = 0; i < size; i += TILE_SIZE_8BPP) { + y0 = y; + for (j = 0; j < 8; j++) { + y1 = i + (j << 3); + y2 = i + (((width * (y0 & ~7)) | (y0 & 7)) << 3); + if (y2 < size) { + *(u32 *)(pixelBuffer - y1) = *(u32 *)(pixelBuffer - y2); + } else { + *(u32 *)(pixelBuffer - y1) = fillWord; + } + y1 -= 4; + y2 -= 4; + if (y2 < size - 4) { + *(u32 *)(pixelBuffer - y1) = *(u32 *)(pixelBuffer - y2); + } else { + *(u32 *)(pixelBuffer - y1) = fillWord; + } + y0++; } - else - { - *(u32 *)(pixelBuffer - dstOffs) = (u32)st4; - } - - dstOffs -= 4; - srcOffs -= 4; - if (srcOffs < size - 4) - { - *(u32 *)(pixelBuffer - dstOffs) = *(u32 *)(pixelBuffer - srcOffs); - } - else - { - *(u32 *)(pixelBuffer - dstOffs) = (u32)st4; - } - - r3++; } - } - - break; - case 2: - case 3: - break; + break; + case 2: // left + case 3: // right + break; } } -u8 GetWindowBgId(struct Window *window) -{ +u8 GetWindowBgId(Window *window) { return window->bgId; } -u8 GetWindowWidth(struct Window *window) -{ +u8 GetWindowWidth(Window *window) { return window->width; } -u8 GetWindowHeight(struct Window *window) -{ + +u8 GetWindowHeight(Window *window) { return window->height; } -u8 GetWindowX(struct Window *window) -{ + +u8 GetWindowX(Window *window) { return window->tilemapLeft; } -u8 GetWindowY(struct Window *window) -{ + +u8 GetWindowY(Window *window) { return window->tilemapTop; } -void MoveWindowX(struct Window *window, u8 x) -{ + +void SetWindowX(Window *window, u8 x) { window->tilemapLeft = x; } -void MoveWindowY(struct Window *window, u8 y) -{ + +void SetWindowY(Window *window, u8 y) { window->tilemapTop = y; } -void SetWindowPaletteNum(struct Window *window, u8 paletteNum) -{ +void SetWindowPaletteNum(Window *window, u8 paletteNum) { window->paletteNum = paletteNum; } -NNSG2dCharacterData * LoadCharacterDataFromFile(void **char_ret, HeapID heapId, const char *path) -{ +NNSG2dCharacterData *LoadCharacterDataFromFile(void **char_ret, HeapID heapId, const char *path) { void *ptr = AllocAndReadFile(heapId, path); *char_ret = ptr; NNSG2dCharacterData *st0; @@ -2711,8 +2064,7 @@ NNSG2dCharacterData * LoadCharacterDataFromFile(void **char_ret, HeapID heapId, return st0; } -NNSG2dPaletteData * LoadPaletteDataFromFile(void **pltt_ret, HeapID heapId, const char *path) -{ +NNSG2dPaletteData *LoadPaletteDataFromFile(void **pltt_ret, HeapID heapId, const char *path) { void *ptr = AllocAndReadFile(heapId, path); *pltt_ret = ptr; NNSG2dPaletteData *st0; @@ -2721,341 +2073,221 @@ NNSG2dPaletteData * LoadPaletteDataFromFile(void **pltt_ret, HeapID heapId, cons return st0; } -void DoScheduledBgGpuUpdates(struct BgConfig *bgConfig) -{ - ApplyScheduledBgPosUpdate(bgConfig); - DoScheduledBgTilemapBufferTransfers(bgConfig); - +void DoScheduledBgGpuUpdates(BgConfig *bgConfig) { + BgConfig_HandleScheduledScrolls(bgConfig); + BgConfig_HandleScheduledBufferTransfers(bgConfig); bgConfig->scrollScheduled = 0; bgConfig->bufferTransferScheduled = 0; } -void DoScheduledBgTilemapBufferTransfers(struct BgConfig *bgConfig) -{ - if ((bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_MAIN_0)) != 0) - { +static void BgConfig_HandleScheduledBufferTransfers(BgConfig *bgConfig) { + if (bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_MAIN_0)) { LoadBgVramScr(GF_BG_LYR_MAIN_0, bgConfig->bgs[GF_BG_LYR_MAIN_0].tilemapBuffer, bgConfig->bgs[GF_BG_LYR_MAIN_0].baseTile * 2, bgConfig->bgs[GF_BG_LYR_MAIN_0].bufferSize); } - - if ((bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_MAIN_1)) != 0) - { + if (bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_MAIN_1)) { LoadBgVramScr(GF_BG_LYR_MAIN_1, bgConfig->bgs[GF_BG_LYR_MAIN_1].tilemapBuffer, bgConfig->bgs[GF_BG_LYR_MAIN_1].baseTile * 2, bgConfig->bgs[GF_BG_LYR_MAIN_1].bufferSize); } - - if ((bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_MAIN_2)) != 0) - { + if (bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_MAIN_2)) { LoadBgVramScr(GF_BG_LYR_MAIN_2, bgConfig->bgs[GF_BG_LYR_MAIN_2].tilemapBuffer, bgConfig->bgs[GF_BG_LYR_MAIN_2].baseTile * 2, bgConfig->bgs[GF_BG_LYR_MAIN_2].bufferSize); } - - if ((bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_MAIN_3)) != 0) - { + if (bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_MAIN_3)) { LoadBgVramScr(GF_BG_LYR_MAIN_3, bgConfig->bgs[GF_BG_LYR_MAIN_3].tilemapBuffer, bgConfig->bgs[GF_BG_LYR_MAIN_3].baseTile * 2, bgConfig->bgs[GF_BG_LYR_MAIN_3].bufferSize); } - - if ((bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_SUB_0)) != 0) - { + if (bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_SUB_0)) { LoadBgVramScr(GF_BG_LYR_SUB_0, bgConfig->bgs[GF_BG_LYR_SUB_0].tilemapBuffer, bgConfig->bgs[GF_BG_LYR_SUB_0].baseTile * 2, bgConfig->bgs[GF_BG_LYR_SUB_0].bufferSize); } - - if ((bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_SUB_1)) != 0) - { + if (bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_SUB_1)) { LoadBgVramScr(GF_BG_LYR_SUB_1, bgConfig->bgs[GF_BG_LYR_SUB_1].tilemapBuffer, bgConfig->bgs[GF_BG_LYR_SUB_1].baseTile * 2, bgConfig->bgs[GF_BG_LYR_SUB_1].bufferSize); } - - if ((bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_SUB_2)) != 0) - { + if (bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_SUB_2)) { LoadBgVramScr(GF_BG_LYR_SUB_2, bgConfig->bgs[GF_BG_LYR_SUB_2].tilemapBuffer, bgConfig->bgs[GF_BG_LYR_SUB_2].baseTile * 2, bgConfig->bgs[GF_BG_LYR_SUB_2].bufferSize); } - - if ((bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_SUB_3)) != 0) + if (bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_SUB_3)) { LoadBgVramScr(GF_BG_LYR_SUB_3, bgConfig->bgs[GF_BG_LYR_SUB_3].tilemapBuffer, bgConfig->bgs[GF_BG_LYR_SUB_3].baseTile * 2, bgConfig->bgs[GF_BG_LYR_SUB_3].bufferSize); } } -void ScheduleBgTilemapBufferTransfer(struct BgConfig *bgConfig, u32 bgId) -{ +void ScheduleBgTilemapBufferTransfer(BgConfig *bgConfig, u8 bgId) { bgConfig->bufferTransferScheduled |= 1 << bgId; } -void ApplyScheduledBgPosUpdate(struct BgConfig *bgConfig) -{ - if ((bgConfig->scrollScheduled & (1 << GF_BG_LYR_MAIN_0)) != 0) - { +static void BgConfig_HandleScheduledScrolls(BgConfig *bgConfig) { + if (bgConfig->scrollScheduled & (1 << GF_BG_LYR_MAIN_0)) { G2_SetBG0Offset(bgConfig->bgs[GF_BG_LYR_MAIN_0].hOffset, bgConfig->bgs[GF_BG_LYR_MAIN_0].vOffset); } - - if ((bgConfig->scrollScheduled & (1 << GF_BG_LYR_MAIN_1)) != 0) - { + if (bgConfig->scrollScheduled & (1 << GF_BG_LYR_MAIN_1)) { G2_SetBG1Offset(bgConfig->bgs[GF_BG_LYR_MAIN_1].hOffset, bgConfig->bgs[GF_BG_LYR_MAIN_1].vOffset); } - - if ((bgConfig->scrollScheduled & (1 << GF_BG_LYR_MAIN_2)) != 0) - { - if (bgConfig->bgs[GF_BG_LYR_MAIN_2].mode == 0) - { + if (bgConfig->scrollScheduled & (1 << GF_BG_LYR_MAIN_2)) { + if (bgConfig->bgs[GF_BG_LYR_MAIN_2].mode == GF_BG_TYPE_TEXT) { G2_SetBG2Offset(bgConfig->bgs[GF_BG_LYR_MAIN_2].hOffset, bgConfig->bgs[GF_BG_LYR_MAIN_2].vOffset); - } - else - { - struct Mtx22 st38; - MTX22_2DAffine( - &st38, bgConfig->bgs[GF_BG_LYR_MAIN_2].rotation, bgConfig->bgs[GF_BG_LYR_MAIN_2].xScale, bgConfig->bgs[GF_BG_LYR_MAIN_2].yScale, 2); - G2_SetBG2Affine( - &st38, - bgConfig->bgs[GF_BG_LYR_MAIN_2].centerX, - bgConfig->bgs[GF_BG_LYR_MAIN_2].centerY, - bgConfig->bgs[GF_BG_LYR_MAIN_2].hOffset, - bgConfig->bgs[GF_BG_LYR_MAIN_2].vOffset); + } else { + MtxFx22 mtx; + MTX22_2DAffine(&mtx, bgConfig->bgs[GF_BG_LYR_MAIN_2].rotation, bgConfig->bgs[GF_BG_LYR_MAIN_2].xScale, bgConfig->bgs[GF_BG_LYR_MAIN_2].yScale, 2); + G2_SetBG2Affine(&mtx, bgConfig->bgs[GF_BG_LYR_MAIN_2].centerX, bgConfig->bgs[GF_BG_LYR_MAIN_2].centerY, bgConfig->bgs[GF_BG_LYR_MAIN_2].hOffset, bgConfig->bgs[GF_BG_LYR_MAIN_2].vOffset); } } - - if ((bgConfig->scrollScheduled & (1 << GF_BG_LYR_MAIN_3)) != 0) - { - if (bgConfig->bgs[GF_BG_LYR_MAIN_3].mode == 0) - { + if (bgConfig->scrollScheduled & (1 << GF_BG_LYR_MAIN_3)) { + if (bgConfig->bgs[GF_BG_LYR_MAIN_3].mode == GF_BG_TYPE_TEXT) { G2_SetBG3Offset(bgConfig->bgs[GF_BG_LYR_MAIN_3].hOffset, bgConfig->bgs[GF_BG_LYR_MAIN_3].vOffset); - } - else - { - struct Mtx22 st28; - MTX22_2DAffine( - &st28, bgConfig->bgs[GF_BG_LYR_MAIN_3].rotation, bgConfig->bgs[GF_BG_LYR_MAIN_3].xScale, bgConfig->bgs[GF_BG_LYR_MAIN_3].yScale, 2); - G2_SetBG3Affine( - &st28, - bgConfig->bgs[GF_BG_LYR_MAIN_3].centerX, - bgConfig->bgs[GF_BG_LYR_MAIN_3].centerY, - bgConfig->bgs[GF_BG_LYR_MAIN_3].hOffset, - bgConfig->bgs[GF_BG_LYR_MAIN_3].vOffset); + } else { + MtxFx22 mtx; + MTX22_2DAffine(&mtx, bgConfig->bgs[GF_BG_LYR_MAIN_3].rotation, bgConfig->bgs[GF_BG_LYR_MAIN_3].xScale, bgConfig->bgs[GF_BG_LYR_MAIN_3].yScale, 2); + G2_SetBG3Affine(&mtx, bgConfig->bgs[GF_BG_LYR_MAIN_3].centerX, bgConfig->bgs[GF_BG_LYR_MAIN_3].centerY, bgConfig->bgs[GF_BG_LYR_MAIN_3].hOffset, bgConfig->bgs[GF_BG_LYR_MAIN_3].vOffset); } } - - if ((bgConfig->scrollScheduled & (1 << GF_BG_LYR_SUB_0)) != 0) - { + if (bgConfig->scrollScheduled & (1 << GF_BG_LYR_SUB_0)) { G2S_SetBG0Offset(bgConfig->bgs[GF_BG_LYR_SUB_0].hOffset, bgConfig->bgs[GF_BG_LYR_SUB_0].vOffset); } - - if ((bgConfig->scrollScheduled & (1 << GF_BG_LYR_SUB_1)) != 0) - { + if (bgConfig->scrollScheduled & (1 << GF_BG_LYR_SUB_1)) { G2S_SetBG1Offset(bgConfig->bgs[GF_BG_LYR_SUB_1].hOffset, bgConfig->bgs[GF_BG_LYR_SUB_1].vOffset); } - - if ((bgConfig->scrollScheduled & (1 << GF_BG_LYR_SUB_2)) != 0) - { - if (bgConfig->bgs[GF_BG_LYR_SUB_2].mode == 0) - { + if (bgConfig->scrollScheduled & (1 << GF_BG_LYR_SUB_2)) { + if (bgConfig->bgs[GF_BG_LYR_SUB_2].mode == GF_BG_TYPE_TEXT) { G2S_SetBG2Offset(bgConfig->bgs[GF_BG_LYR_SUB_2].hOffset, bgConfig->bgs[GF_BG_LYR_SUB_2].vOffset); - } - else - { - struct Mtx22 st18; - MTX22_2DAffine( - &st18, bgConfig->bgs[GF_BG_LYR_SUB_2].rotation, bgConfig->bgs[GF_BG_LYR_SUB_2].xScale, bgConfig->bgs[GF_BG_LYR_SUB_2].yScale, 2); - G2S_SetBG2Affine( - &st18, - bgConfig->bgs[GF_BG_LYR_SUB_2].centerX, - bgConfig->bgs[GF_BG_LYR_SUB_2].centerY, - bgConfig->bgs[GF_BG_LYR_SUB_2].hOffset, - bgConfig->bgs[GF_BG_LYR_SUB_2].vOffset); + } else { + MtxFx22 mtx; + MTX22_2DAffine(&mtx, bgConfig->bgs[GF_BG_LYR_SUB_2].rotation, bgConfig->bgs[GF_BG_LYR_SUB_2].xScale, bgConfig->bgs[GF_BG_LYR_SUB_2].yScale, 2); + G2S_SetBG2Affine(&mtx, bgConfig->bgs[GF_BG_LYR_SUB_2].centerX, bgConfig->bgs[GF_BG_LYR_SUB_2].centerY, bgConfig->bgs[GF_BG_LYR_SUB_2].hOffset, bgConfig->bgs[GF_BG_LYR_SUB_2].vOffset); } } - - if ((bgConfig->scrollScheduled & (1 << GF_BG_LYR_SUB_3)) != 0) - { - if (bgConfig->bgs[GF_BG_LYR_SUB_3].mode == 0) - { + if (bgConfig->scrollScheduled & (1 << GF_BG_LYR_SUB_3)) { + if (bgConfig->bgs[GF_BG_LYR_SUB_3].mode == GF_BG_TYPE_TEXT) { G2S_SetBG3Offset(bgConfig->bgs[GF_BG_LYR_SUB_3].hOffset, bgConfig->bgs[GF_BG_LYR_SUB_3].vOffset); - } - else - { - struct Mtx22 st08; - MTX22_2DAffine( - &st08, bgConfig->bgs[GF_BG_LYR_SUB_3].rotation, bgConfig->bgs[GF_BG_LYR_SUB_3].xScale, bgConfig->bgs[GF_BG_LYR_SUB_3].yScale, 2); - G2S_SetBG3Affine( - &st08, - bgConfig->bgs[GF_BG_LYR_SUB_3].centerX, - bgConfig->bgs[GF_BG_LYR_SUB_3].centerY, - bgConfig->bgs[GF_BG_LYR_SUB_3].hOffset, - bgConfig->bgs[GF_BG_LYR_SUB_3].vOffset); + } else { + MtxFx22 mtx; + MTX22_2DAffine(&mtx, bgConfig->bgs[GF_BG_LYR_SUB_3].rotation, bgConfig->bgs[GF_BG_LYR_SUB_3].xScale, bgConfig->bgs[GF_BG_LYR_SUB_3].yScale, 2); + G2S_SetBG3Affine(&mtx, bgConfig->bgs[GF_BG_LYR_SUB_3].centerX, bgConfig->bgs[GF_BG_LYR_SUB_3].centerY, bgConfig->bgs[GF_BG_LYR_SUB_3].hOffset, bgConfig->bgs[GF_BG_LYR_SUB_3].vOffset); } } } -void ScheduleSetBgPosText( - struct BgConfig *bgConfig, u32 bgId, u32 op, fx32 value) -{ +void ScheduleSetBgPosText(BgConfig *bgConfig, u8 bgId, enum BgPosAdjustOp op, fx32 value) { Bg_SetPosText(&bgConfig->bgs[bgId], op, value); bgConfig->scrollScheduled |= 1 << bgId; } -void ScheduleSetBgAffineRotation( - struct BgConfig *bgConfig, u32 bgId, u32 op, u16 value) -{ +void ScheduleSetBgAffineRotation( BgConfig *bgConfig, u8 bgId, enum BgPosAdjustOp op, u16 value) { Bg_SetAffineRotation(&bgConfig->bgs[bgId], op, value); bgConfig->scrollScheduled |= 1 << bgId; } -void Bg_SetAffineRotation(struct Bg *bg, u32 op, u16 val) -{ - switch (op) - { - case BG_POS_OP_SET_ROT: - bg->rotation = val; - break; - case BG_POS_OP_ADD_ROT: - bg->rotation += val; - break; - case BG_POS_OP_SUB_ROT: - bg->rotation -= val; - break; +static void Bg_SetAffineRotation(Background *bg, enum BgPosAdjustOp op, u16 val) { + switch (op) { + case BG_POS_OP_SET_ROT: + bg->rotation = val; + break; + case BG_POS_OP_ADD_ROT: + bg->rotation += val; + break; + case BG_POS_OP_SUB_ROT: + bg->rotation -= val; + break; } } -void ScheduleSetBgAffinePos( - struct BgConfig *bgConfig, u32 bgId, u32 op, fx32 value) -{ +void ScheduleSetBgAffinePos(BgConfig *bgConfig, u8 bgId, enum BgPosAdjustOp op, fx32 value) { Bg_SetAffinePos(&bgConfig->bgs[bgId], op, value); bgConfig->scrollScheduled |= 1 << bgId; } -void Bg_SetAffinePos(struct Bg *bg, u32 op, fx32 val) -{ - switch (op) - { - case BG_POS_OP_SET_CENTERX: - bg->centerX = val; - break; - case BG_POS_OP_ADD_CENTERX: - bg->centerX += val; - break; - case BG_POS_OP_SUB_CENTERX: - bg->centerX -= val; - break; - case BG_POS_OP_SET_CENTERY: - bg->centerY = val; - break; - case BG_POS_OP_ADD_CENTERY: - bg->centerY += val; - break; - case BG_POS_OP_SUB_CENTERY: - bg->centerY -= val; - break; +static void Bg_SetAffinePos(Background *bg, enum BgPosAdjustOp op, fx32 val) { + switch (op) { + case BG_POS_OP_SET_CENTERX: + bg->centerX = val; + break; + case BG_POS_OP_ADD_CENTERX: + bg->centerX += val; + break; + case BG_POS_OP_SUB_CENTERX: + bg->centerX -= val; + break; + case BG_POS_OP_SET_CENTERY: + bg->centerY = val; + break; + case BG_POS_OP_ADD_CENTERY: + bg->centerY += val; + break; + case BG_POS_OP_SUB_CENTERY: + bg->centerY -= val; + break; } } -u32 DoesPixelAtScreenXYMatchPtrVal( - struct BgConfig *bgConfig, u8 bgId, u8 x, u8 y, u16 *src) -{ - void *bgCharPtr; +BOOL DoesPixelAtScreenXYMatchPtrVal(BgConfig *bgConfig, u8 bgId, u8 x, u8 y, u16 *src) { + u8 *bgCharPtr; u16 tilemapIdx; u8 xPixOffs; u8 yPixOffs; u8 pixelValue; u8 i; - - if (bgConfig->bgs[bgId].tilemapBuffer == NULL) - { - return 0; + if (bgConfig->bgs[bgId].tilemapBuffer == NULL) { + return FALSE; } - tilemapIdx = GetTileMapIndexFromCoords((u8) (x >> 3), (u8) (y >> 3), bgConfig->bgs[bgId].size); + tilemapIdx = GetTileMapIndexFromCoords(x >> 3, y >> 3, bgConfig->bgs[bgId].size); bgCharPtr = BgGetCharPtr(bgId); - - xPixOffs = (u8)(x & 7); - yPixOffs = (u8)(y & 7); - - if (bgConfig->bgs[bgId].colorMode == GX_BG_COLORMODE_16) - { + xPixOffs = x & 7; + yPixOffs = y & 7; + if (bgConfig->bgs[bgId].colorMode == GX_BG_COLORMODE_16) { u16 *tilemapBuffer = bgConfig->bgs[bgId].tilemapBuffer; - u8 *ptr = AllocFromHeapAtEnd(bgConfig->heapId, 0x40); + u8 *tile = AllocFromHeapAtEnd(bgConfig->heapId, 0x40); - bgCharPtr += ((tilemapBuffer[tilemapIdx] & 0x3ff) << 5); - for (i = 0; i < 0x20; i++) - { - ptr[(i << 1)] = (u8)(((u8 *)bgCharPtr)[i] & 0xf); - ptr[(i << 1) + 1] = (u8)(((u8 *)bgCharPtr)[i] >> 4); + bgCharPtr += (tilemapBuffer[tilemapIdx] & 0x3FF) * TILE_SIZE_4BPP; + for (i = 0; i < TILE_SIZE_4BPP; i++) { + tile[i * 2] = bgCharPtr[i] & 0xF; + tile[i * 2 + 1] = bgCharPtr[i] >> 4; } - - ApplyFlipFlagsToTile(bgConfig, (u8)((tilemapBuffer[tilemapIdx] >> 0xa) & 3), ptr); - - pixelValue = ptr[xPixOffs + (yPixOffs << 3)]; - FreeToHeap(ptr); - - if ((src[0] & (1 << pixelValue)) != 0) - { - return 1; + ApplyFlipFlagsToTile(bgConfig, (tilemapBuffer[tilemapIdx] >> 10) & 3, tile); + pixelValue = tile[xPixOffs + yPixOffs * 8]; + FreeToHeap(tile); + if ((src[0] & (1 << pixelValue)) != 0) { + return TRUE; } - } - else - { - if (bgConfig->bgs[bgId].mode != GF_BG_TYPE_AFFINE) - { + } else { + if (bgConfig->bgs[bgId].mode != GF_BG_TYPE_AFFINE) { u16 *tilemapBuffer = bgConfig->bgs[bgId].tilemapBuffer; - u8 *ptr = AllocFromHeapAtEnd(bgConfig->heapId, 0x40); + u8 *tile = AllocFromHeapAtEnd(bgConfig->heapId, 0x40); - memcpy(ptr, bgCharPtr + ((tilemapBuffer[tilemapIdx] & 0x3ff) << 6), 0x40); - - ApplyFlipFlagsToTile(bgConfig, (u8)((tilemapBuffer[tilemapIdx] >> 0xa) & 3), ptr); - - pixelValue = ptr[xPixOffs + (yPixOffs << 3)]; - FreeToHeap(ptr); + memcpy(tile, bgCharPtr + (tilemapBuffer[tilemapIdx] & 0x3FF) * TILE_SIZE_8BPP, TILE_SIZE_8BPP); + ApplyFlipFlagsToTile(bgConfig, (tilemapBuffer[tilemapIdx] >> 10) & 3, tile); + pixelValue = tile[xPixOffs + yPixOffs * 8]; + FreeToHeap(tile); + } else { + pixelValue = bgCharPtr[((u8 *)bgConfig->bgs[bgId].tilemapBuffer)[tilemapIdx] * TILE_SIZE_8BPP + xPixOffs + yPixOffs * 8]; } - else - { - pixelValue = ((u8 *)bgCharPtr)[(((u8 *)bgConfig->bgs[bgId].tilemapBuffer)[tilemapIdx] << 6) + xPixOffs + (yPixOffs << 3)]; - } - // BUG: Infinite loop - while (TRUE) - { - if (src[0] == 0xffff) - { + while (TRUE) { + if (src[0] == 0xFFFF) { break; } - if (pixelValue == (u8)(src[0])) - { - return 1; + if (pixelValue == (u8)(src[0])) { + return TRUE; } } } - return 0; + return FALSE; } -void ApplyFlipFlagsToTile(struct BgConfig *bgConfig, u8 flag, u8 *src) -{ +static void ApplyFlipFlagsToTile(BgConfig *bgConfig, u8 flags, u8 *tile) { u8 i, j; - if (flag != 0) - { - u8 *ptr = AllocFromHeapAtEnd(bgConfig->heapId, 0x40); - - if ((flag & 1) != 0) - { - for (i = 0; i < 8; i++) - { - for (j = 0; j < 8; j++) - { - ptr[i * 8 + j] = src[i * 8 + (7 - j)]; + if (flags != 0) { + u8 *buffer = AllocFromHeapAtEnd(bgConfig->heapId, 0x40); + if ((flags & 1) != 0) { // hflip + for (i = 0; i < 8; i++) { + for (j = 0; j < 8; j++) { + buffer[i * 8 + j] = tile[i * 8 + (7 - j)]; } } - - memcpy(src, ptr, 0x40); + memcpy(tile, buffer, 0x40); } - - if ((flag & 2) != 0) - { - for (i = 0; i < 8; i++) - { - u8 *r3 = &ptr[i * 8]; - u8 *r2 = &src[(7 - i) * 8]; - for (u32 j = 8; j > 0; j--) - { - *r3++ = *r2++; - } + if ((flags & 2) != 0) { // vflip + for (i = 0; i < 8; i++) { + memcpy(&buffer[i * 8], &tile[(7 - i) * 8], 8); } - - memcpy(src, ptr, 0x40); + memcpy(tile, buffer, 0x40); } - - FreeToHeap(ptr); + FreeToHeap(buffer); } } diff --git a/arm9/src/communication_error.c b/arm9/src/communication_error.c index c6ed3ee13..45b8bc6ae 100644 --- a/arm9/src/communication_error.c +++ b/arm9/src/communication_error.c @@ -15,11 +15,11 @@ extern void sub_0200E3A0(BOOL set_brightness_on_bottom_screen, s32); static const struct WindowTemplate sCommunicationErrorWindowTemplate = { .bgId = GF_BG_LYR_MAIN_0, - .tilemapLeft = 3, - .tilemapTop = 3, + .left = 3, + .top = 3, .width = 26, .height = 18, - .paletteNum = 0x01, + .palette = 1, .baseTile = 0x23, }; diff --git a/arm9/src/error_message_reset.c b/arm9/src/error_message_reset.c index d3bd43015..e1bcb8570 100644 --- a/arm9/src/error_message_reset.c +++ b/arm9/src/error_message_reset.c @@ -15,11 +15,11 @@ static const struct WindowTemplate sErrorMessageWindowTemplate = { .bgId = GF_BG_LYR_MAIN_0, - .tilemapLeft = 3, - .tilemapTop = 3, + .left = 3, + .top = 3, .width = 26, .height = 18, - .paletteNum = 1, + .palette = 1, .baseTile = 0x23 }; diff --git a/arm9/src/render_window.c b/arm9/src/render_window.c index af491c7aa..fff162664 100644 --- a/arm9/src/render_window.c +++ b/arm9/src/render_window.c @@ -326,7 +326,7 @@ void sub_0200D18C(struct Window *window, u16 fill_value) u8 bg_id = GetWindowBgId(window); void *ptr = AllocFromHeap(heapId, 0x180); - void *charptr = BgGetCharPtr(bg_id); + void *charptr = BgGetCharPtr((u8)bg_id); NNSG2dCharacterData *pCharData; void *st30; @@ -344,7 +344,7 @@ void sub_0200D18C(struct Window *window, u16 fill_value) } BlitRect4Bit(st30, 4, 0, 12, 0x30, ptr, 12, 0x30, 1, 0, 12, 0x30); - BG_LoadCharTilesData(window->bgConfig, bg_id, ptr, 0x180, (u32)(fill_value + 18)); + BG_LoadCharTilesData(window->bgConfig, (u8)bg_id, ptr, 0x180, (u32)(fill_value + 18)); sub_02002840(fill_value); FreeToHeap(st2c); FreeToHeap(ptr); diff --git a/arm9/src/save_data_read_error.c b/arm9/src/save_data_read_error.c index aae4d9de4..348eb5e16 100644 --- a/arm9/src/save_data_read_error.c +++ b/arm9/src/save_data_read_error.c @@ -15,11 +15,11 @@ extern void sub_0200E3A0(BOOL set_brightness_on_bottom_screen, s32); static const struct WindowTemplate sSaveDataReadErrorWindowTemplate = { .bgId = GF_BG_LYR_MAIN_0, - .tilemapLeft = 3, - .tilemapTop = 3, + .left = 3, + .top = 3, .width = 26, .height = 18, - .paletteNum = 0x01, + .palette = 1, .baseTile = 0x23, }; diff --git a/arm9/src/save_data_write_error.c b/arm9/src/save_data_write_error.c index 3d814f400..d4c15f00c 100644 --- a/arm9/src/save_data_write_error.c +++ b/arm9/src/save_data_write_error.c @@ -15,11 +15,11 @@ extern void sub_0200E3A0(BOOL set_brightness_on_bottom_screen, s32); static const struct WindowTemplate sSaveDataWriteErrorWindowTemplate = { .bgId = GF_BG_LYR_MAIN_0, - .tilemapLeft = 3, - .tilemapTop = 3, + .left = 3, + .top = 3, .width = 26, .height = 18, - .paletteNum = 0x01, + .palette = 1, .baseTile = 0x23, }; diff --git a/arm9/src/wfc_user_info_warning.c b/arm9/src/wfc_user_info_warning.c index 8059210da..34cad2345 100644 --- a/arm9/src/wfc_user_info_warning.c +++ b/arm9/src/wfc_user_info_warning.c @@ -20,11 +20,11 @@ extern void sub_0200E3A0(BOOL set_brightness_on_bottom_screen, s32); static const struct WindowTemplate sWFCWarningMsgWindowTemplate = { .bgId = GF_BG_LYR_MAIN_0, - .tilemapLeft = 3, - .tilemapTop = 3, + .left = 3, + .top = 3, .width = 26, .height = 18, - .paletteNum = 0x01, + .palette = 1, .baseTile = 0x23, }; diff --git a/include/GX_layers.h b/include/GX_layers.h index 6c99d80d8..e988216b4 100644 --- a/include/GX_layers.h +++ b/include/GX_layers.h @@ -9,7 +9,7 @@ typedef enum { GX_LAYER_TOGGLE_OFF, GX_LAYER_TOGGLE_ON, -} GX_LayerToggle; +} GXLayerToggle; struct GraphicsBanks { @@ -25,19 +25,19 @@ struct GraphicsBanks s32 texpltt; }; -struct GraphicsModes { +typedef struct GraphicsModes { GXDispMode dispMode; GXBGMode bgMode; GXBGMode subMode; GXBG0As _2d3dMode; -}; +} GraphicsModes; void GX_SetBanks(const struct GraphicsBanks *banks); void GX_DisableEngineALayers(void); -void GX_EngineAToggleLayers(u32 layer_mask, GX_LayerToggle layer_toggle); +void GX_EngineAToggleLayers(u32 layer_mask, GXLayerToggle layer_toggle); void GX_SetEngineALayers(u32 layer_mask); void GX_DisableEngineBLayers(void); -void GX_EngineBToggleLayers(u32 layer_mask, GX_LayerToggle layer_toggle); +void GX_EngineBToggleLayers(u32 layer_mask, GXLayerToggle layer_toggle); void GX_BothDispOn(void); void GX_SwapDisplay(void); u32 GX_GetEngineALayers(void); diff --git a/include/bg_window.h b/include/bg_window.h index 795d48ac5..8246f4c93 100644 --- a/include/bg_window.h +++ b/include/bg_window.h @@ -1,5 +1,5 @@ -#ifndef POKEDIAMOND_UNK_02016B94_H -#define POKEDIAMOND_UNK_02016B94_H +#ifndef POKEDIAMOND_BG_WINDOW_H +#define POKEDIAMOND_BG_WINDOW_H #include "NNS_g2d.h" #include "global.h" @@ -10,8 +10,7 @@ #include "heap.h" #include "math_util.h" -struct BgTemplate -{ +typedef struct BgTemplate { u32 x; u32 y; u32 bufferSize; @@ -26,10 +25,9 @@ struct BgTemplate u8 areaOver; u8 unk17; // probably paddding u32 mosaic; -}; +} BgTemplate; -struct Bg -{ +typedef struct Background { void *tilemapBuffer; u32 bufferSize; u32 baseTile; @@ -47,37 +45,33 @@ struct Bg fx32 yScale; fx32 centerX; fx32 centerY; -}; +} Background; -typedef struct BgConfig -{ +typedef struct BgConfig { HeapID heapId; u16 scrollScheduled; u16 bufferTransferScheduled; - struct Bg bgs[8]; + Background bgs[8]; } BgConfig; -struct Bitmap -{ +typedef struct Bitmap { const u8 *pixels; u16 width; u16 height; -}; +} Bitmap; -struct WindowTemplate -{ +typedef struct WindowTemplate { u8 bgId; - u8 tilemapLeft; - u8 tilemapTop; + u8 left; + u8 top; u8 width; u8 height; - u8 paletteNum; + u8 palette; u16 baseTile; -}; +} WindowTemplate; -typedef struct Window -{ - struct BgConfig *bgConfig; +typedef struct Window { + BgConfig *bgConfig; u8 bgId; u8 tilemapLeft; u8 tilemapTop; @@ -89,14 +83,17 @@ typedef struct Window void *pixelBuffer; } Window; -enum GFBppMode -{ +enum GFScreen { + SCREEN_MAIN = 0, + SCREEN_SUB = 1, +}; + +enum GFBppMode { GF_BG_CLR_4BPP = 0, GF_BG_CLR_8BPP, }; -enum GFBgLayer -{ +enum GFBgLayer { GF_BG_LYR_MAIN_0 = 0, GF_BG_LYR_MAIN_1, GF_BG_LYR_MAIN_2, @@ -109,6 +106,7 @@ enum GFBgLayer GF_BG_LYR_SUB_CNT = 4, GF_BG_LYR_MAIN_FIRST = GF_BG_LYR_MAIN_0, GF_BG_LYR_SUB_FIRST = GF_BG_LYR_SUB_0, + GF_BG_LYR_MAX = 8, GF_BG_LYR_MAIN_0_F = 1 << (GF_BG_LYR_MAIN_0 - GF_BG_LYR_MAIN_FIRST), GF_BG_LYR_MAIN_1_F = 1 << (GF_BG_LYR_MAIN_1 - GF_BG_LYR_MAIN_FIRST), @@ -122,8 +120,7 @@ enum GFBgLayer GF_BG_LYR_UNALLOC = 0xFF, }; -enum GFPalLoadLocation -{ +enum GFPalLoadLocation { GF_PAL_LOCATION_MAIN_BG = 0, GF_PAL_LOCATION_MAIN_OBJ, GF_PAL_LOCATION_MAIN_BGEXT, @@ -134,8 +131,7 @@ enum GFPalLoadLocation GF_PAL_LOCATION_SUB_OBJEXT, }; -enum GFPalSlotOffset -{ +enum GFPalSlotOffset { GF_PAL_SLOT_OFFSET_0 = 0x00, GF_PAL_SLOT_OFFSET_1 = 0x20, GF_PAL_SLOT_OFFSET_2 = 0x40, @@ -154,22 +150,20 @@ enum GFPalSlotOffset GF_PAL_SLOT_OFFSET_15 = 0X1E0 }; -enum GFBgType -{ +enum GFBgType { GF_BG_TYPE_TEXT = 0, GF_BG_TYPE_AFFINE, GF_BG_TYPE_256x16PLTT, + GF_BG_TYPE_MAX, }; -enum GFBgCntSet -{ +enum GFBgCntSet { GF_BG_CNT_SET_COLOR_MODE = 0, GF_BG_CNT_SET_SCREEN_BASE, GF_BG_CNT_SET_CHAR_BASE, }; -enum GFBgScreenSize -{ +enum GFBgScreenSize { GF_BG_SCR_SIZE_128x128 = 0, GF_BG_SCR_SIZE_256x256, GF_BG_SCR_SIZE_256x512, @@ -178,8 +172,7 @@ enum GFBgScreenSize GF_BG_SCR_SIZE_1024x1024 }; -enum BgPosAdjustOp -{ +enum BgPosAdjustOp { // Text layers BG_POS_OP_SET_X = 0, BG_POS_OP_ADD_X, @@ -200,257 +193,93 @@ enum BgPosAdjustOp BG_POS_OP_SUB_CENTERY, }; -struct BgConfig *BgConfig_Alloc(HeapID heapId); -HeapID BgConfig_GetHeapId(struct BgConfig *bgConfig); -void SetBothScreensModesAndDisable(const struct GraphicsModes *modes); -void SetScreenModeAndDisable(const struct GraphicsModes *gfxModes, u32 whichScreen); -void InitBgFromTemplate( - struct BgConfig *bgConfig, u8 bgId, const struct BgTemplate *template, u8 bgMode); -void SetBgControlParam(struct BgConfig *config, u8 bgId, u32 attr, u8 value); -u8 TranslateGFBgModePairToGXScreenSize(enum GFBgScreenSize size, enum GFBgType type); -void GetBgScreenDimensions(u32 screenSize, u8 *width_p, u8 *height_p); -void FreeBgTilemapBuffer(struct BgConfig *bgConfig, u32 bgId); -void SetBgPriority(u32 bgId, u16 priority); -void ToggleBgLayer(u32 bgId, GX_LayerToggle toggle); -void BgSetPosTextAndCommit(struct BgConfig *bgConfig, u32 bgId, u32 op, fx32 val); -fx32 Bg_GetXpos(struct BgConfig *bgConfig, u32 bgId); -fx32 Bg_GetYpos(struct BgConfig *bgConfig, u32 bgId); -void Bg_SetTextDimAndAffineParams(struct BgConfig *bgConfig, - u32 bgId, - u32 txOp, - fx32 txVal, - struct Mtx22 *mtx, - fx32 centerX, - fx32 centerY); -void Bg_SetPosText(struct Bg *bg, u32 op, fx32 val); -void SetBgAffine(struct BgConfig *bgConfig, - u32 bgId, - struct Mtx22 *mtx, - fx32 centerX, - fx32 centerY); -void BgAffineReset(struct BgConfig *bgConfig, u32 bgId); -void CopyOrUncompressTilemapData(const void *src, void *dest, u32 size); -void BgCommitTilemapBufferToVram(struct BgConfig *bgConfig, u32 bgId); -void BgCopyOrUncompressTilemapBufferRangeToVram( - struct BgConfig *bgConfig, u32 bgId, u32 *src, u32 size, u32 tileOffset); -void LoadBgVramScr(u32 bgId, void *buffer_p, u32 offset, u32 size); -void BG_LoadScreenTilemapData(struct BgConfig *bgConfig, u32 bgId, void *src, u32 numTiles); -void BG_LoadCharTilesData( - struct BgConfig *bgConfig, u32 bgId, u32 *charData, u32 offset, u32 numTiles); -void BG_LoadCharPixelData( - struct BgConfig *bgConfig, u32 bgId, u32 *charData, u32 size, u32 offset); -void LoadBgVramChar(u32 bgId, void *buffer_p, u32 offset, u32 size); -void BG_ClearCharDataRange(u32 bgId, u32 size, u32 offset, HeapID heapId); -void BG_FillCharDataRange( - struct BgConfig *param0, u32 bgId, u32 fillValue, u32 count, u32 offset); -void BG_LoadPlttData(u32 location, void *plttData, u32 size, enum GFPalSlotOffset offset); -void BG_SetMaskColor(u32 bgId, u32 value); -u16 GetTileMapIndexFromCoords(u8 x, u8 y, u8 screenSize); -u16 GetSrcTileMapIndexFromCoords(u8 x, u8 y, u8 width, u8 height); -void LoadRectToBgTilemapRect(struct BgConfig *bgConfig, - u32 bgId, - void *src, - u8 dstX, - u8 dstY, - u8 width, - u8 height); -void CopyToBgTilemapRect(struct BgConfig *bgConfig, - u32 bgId, - u8 dstX, - u8 dstY, - u8 dstWidth, - u8 dstHeight, - void *src, - u8 srcX, - u8 srcY, - u8 srcWidth, - u8 srcHeight); -void CopyRectToBgTilemapRect(struct BgConfig *bgConfig, - u32 bgId, - u8 dstX, - u8 dstY, - u8 dstWidth, - u8 dstHeight, - void *src, - u8 srcX, - u8 srcY, - u8 srcWidth, - u8 srcHeight); -void CopyBgTilemapRectText(struct Bg *bg, - u8 dstX, - u8 dstY, - u8 dstWidth, - u8 dstHeight, - u16 *src, - u8 srcX, - u8 srcY, - u8 srcWidth, - u8 srcHeight, - u8 adjustForSrcDims); -void CopyBgTilemapRectAffine(struct Bg *bg, - u8 dstX, - u8 dstY, - u8 dstWidth, - u8 dstHeight, - u8 *src, - u8 srcX, - u8 srcY, - u8 srcWidth, - u8 srcHeight, - u8 adjustForSrcDims); -void FillBgTilemapRect(struct BgConfig *bgConfig, - u8 bgId, - u16 fillValue, - u8 x, - u8 y, - u8 width, - u8 height, - u8 paletteNum); -void FillBgTilemapRectText(struct Bg *bg, - u16 fillValue, - u8 x, - u8 y, - u8 width, - u8 height, - u8 paletteNum); -void FillBgTilemapRectAffine( - struct Bg *bg, u8 fillValue, u8 x, u8 y, u8 width, u8 height); -void BgTilemapRectChangePalette(struct BgConfig *bgConfig, - u32 bgId, - u8 x, - u8 y, - u8 width, - u8 height, - u8 paletteNum); -void BgClearTilemapBufferAndCommit(struct BgConfig *bgConfig, u32 bgId); -void BgFillTilemapBufferAndCommit(struct BgConfig *bgConfig, u32 bgId, u16 fillValue); -void BgFillTilemapBufferAndSchedule(struct BgConfig *bgConfig, u32 bgId, u16 fillValue); -void *BgGetCharPtr(u32 bgId); -void Convert4bppTo8bppInternal(u8 *src4bpp, u32 size, u8 (*dest8bpp), u8 paletteNum); -u8 *Convert4bppTo8bpp(u8 *src4Bpp, u32 size, u8 paletteNum, HeapID heapId); -void *GetBgTilemapBuffer(struct BgConfig *bgConfig, u8 bgId); -u16 GetBgAffineRotation(struct BgConfig *bgConfig, u32 bgId); -u8 GetBgPriority(struct BgConfig *bgConfig, u32 bgId); -void BlitBitmapRect4Bit(const struct Bitmap *src, - const struct Bitmap *dst, - u16 srcX, - u16 srcY, - u16 dstX, - u16 dstY, - u16 width, - u16 height, - u16 colorKey); -void BlitBitmapRect8Bit(const struct Bitmap *src, - const struct Bitmap *dst, - u16 srcX, - u16 srcY, - u16 dstX, - u16 dstY, - u16 width, - u16 height, - u16 colorKey); -void FillBitmapRect4Bit( - struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue); -void FillBitmapRect8Bit( - struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue); -struct Window *AllocWindows(HeapID heapId, s32 size); -void InitWindow(struct Window *window); -BOOL WindowIsInUse(struct Window *window); -void AddWindowParameterized(struct BgConfig *param0, - struct Window *window, - u8 bgId, - u8 tilemapLeft, - u8 tilemapTop, - u8 width, - u8 height, - u8 paletteNum, - u16 baseTile); -void AddTextWindowTopLeftCorner(struct BgConfig *param0, - struct Window *window, - u8 width, - u8 height, - u16 baseTile, - u8 paletteNum); -void AddWindow(struct BgConfig *bgConfig, - struct Window *window, - const struct WindowTemplate *template); -void RemoveWindow(struct Window *window); -void WindowArray_Delete(struct Window *windows, int count); -void CopyWindowToVram(struct Window *window); -void ScheduleWindowCopyToVram(struct Window *window); -void PutWindowTilemap(struct Window *window); -void PutWindowTilemapRectAnchoredTopLeft(struct Window *window, u8 width, u8 height); -void ClearWindowTilemap(struct Window *window); -void PutWindowTilemap_TextMode(struct Window *param0); -void PutWindowTilemap_AffineMode(struct Window *window); -void ClearWindowTilemapText(struct Window *window); -void ClearWindowTilemapAffine(struct Window *window); -void CopyWindowToVram_TextMode(struct Window *window); -void ScheduleWindowCopyToVram_TextMode(struct Window *window); -void CopyWindowToVram_AffineMode(struct Window *window); -void ScheduleWindowCopyToVram_AffineMode(struct Window *window); -void CopyWindowPixelsToVram_TextMode(struct Window *window); -void ClearWindowTilemapAndCopyToVram(struct Window *window); -void ClearWindowTilemapAndScheduleTransfer(struct Window *window); -void ClearWindowTilemapAndCopyToVram_TextMode(struct Window *window); -void ClearWindowTilemapAndScheduleTransfer_TextMode(struct Window *window); -void ClearWindowTilemapAndCopyToVram_AffineMode(struct Window *window); -void ClearWindowTilemapAndScheduleTransfer_AffineMode(struct Window *window); -void FillWindowPixelBuffer(struct Window *window, u8 param1); -void BlitBitmapRectToWindow(struct Window *window, - const void *src, - u16 srcX, - u16 srcY, - u16 srcWidth, - u16 srcHeight, - u16 dstX, - u16 dstY, - u16 dstWidth, - u16 dstHeight); -void BlitBitmapRect(struct Window *window, - void *param1, - u16 param2, - u16 param3, - u16 param4, - u16 param5, - u16 param6, - u16 param7, - u16 param8, - u16 param9, - u16 param10); -void FillWindowPixelRect(struct Window *window, u8 fillValue, u16 x, u16 y, u16 width, u16 height); -void CopyGlyphToWindow( - struct Window * window, - u8 *glyphPixels, - u16 srcWidth, - u16 srcHeight, - u16 width, - u16 height, - u16 glyph -); -void ScrollWindow(struct Window *window, u32 param1, u8 param2, u8 param3); -void ScrollWindow4bpp(struct Window *window, u32 param1, u8 param2, u8 fillValue); -void ScrollWindow8bpp(struct Window *window, u32 param1, u8 param2, u8 fillValue); -u8 GetWindowBgId(struct Window *window); -u8 GetWindowWidth(struct Window *window); -u8 GetWindowHeight(struct Window *window); -u8 GetWindowX(struct Window *window); -u8 GetWindowY(struct Window *window); -void MoveWindowX(struct Window *window, u8 x); -void MoveWindowY(struct Window *window, u8 y); -void SetWindowPaletteNum(struct Window *window, u8 paletteNum); -NNSG2dCharacterData * LoadCharacterDataFromFile(void **char_ret, HeapID heapId, const char *path); -NNSG2dPaletteData * LoadPaletteDataFromFile(void **pltt_ret, HeapID heapId, const char *path); -void DoScheduledBgGpuUpdates(struct BgConfig *bgConfig); -void DoScheduledBgTilemapBufferTransfers(struct BgConfig *bgConfig); -void ScheduleBgTilemapBufferTransfer(struct BgConfig *bgConfig, u32 bgId); -void ApplyScheduledBgPosUpdate(struct BgConfig *bgConfig); -void ScheduleSetBgPosText(struct BgConfig *bgConfig, u32 bgId, u32 op, fx32 value); -void ScheduleSetBgAffineRotation(struct BgConfig *bgConfig, u32 bgId, u32 op, u16 value); -void Bg_SetAffineRotation(struct Bg *bg, u32 op, u16 val); -void ScheduleSetBgAffinePos(struct BgConfig *bgConfig, u32 bgId, u32 op, fx32 value); -void Bg_SetAffinePos(struct Bg *bg, u32 op, fx32 val); -u32 DoesPixelAtScreenXYMatchPtrVal(struct BgConfig *bgConfig, u8 bgId, u8 x, u8 y, u16 *src); -void ApplyFlipFlagsToTile(struct BgConfig *bgConfig, u8 flag, u8 *src); +enum { + TILE_SIZE_4BPP = 32, + TILE_SIZE_8BPP = 64, +}; -#endif // POKEDIAMOND_UNK_02016B94_H +#define TILEMAP_COPY_SRC_FLAT 0 // Source dimensions are equal to dest dimensions +#define TILEMAP_COPY_SRC_RECT 1 // Dest dimensions carve out a window from source + +// Passed to FillBgTilemapRect(Text) mode arg. 0-15 = palette selection. 16,17 as defined. +#define TILEMAP_FILL_KEEP_PAL 16 // Do not replace the selected palette index +#define TILEMAP_FILL_OVWT_PAL 17 // Fill value includes palette + +BgConfig *BgConfig_Alloc(HeapID heapId); +HeapID BgConfig_GetHeapId(BgConfig *bgConfig); +void SetBothScreensModesAndDisable(const GraphicsModes *modes); +void SetScreenModeAndDisable(const struct GraphicsModes *gfxModes, enum GFScreen screen); +void InitBgFromTemplate(BgConfig *bgConfig, u8 bgId, const BgTemplate *template, u8 bgMode); +void SetBgControlParam(BgConfig *config, u8 bgId, enum GFBgCntSet attr, u8 value); +void FreeBgTilemapBuffer(BgConfig *bgConfig, u8 bgId); +void SetBgPriority(u8 bgId, u16 priority); +void ToggleBgLayer(u8 bgId, GXLayerToggle toggle); +void BgSetPosTextAndCommit(BgConfig *bgConfig, u8 bgId, enum BgPosAdjustOp op, fx32 val); +fx32 Bg_GetXpos(const BgConfig *bgConfig, enum GFBgLayer bgId); +fx32 Bg_GetYpos(BgConfig *bgConfig, enum GFBgLayer bgId); +void Bg_SetTextDimAndAffineParams(BgConfig *bgConfig, u8 bgId, enum BgPosAdjustOp op, fx32 value, MtxFx22 *mtx, fx32 centerX, fx32 centerY); +void SetBgAffine(BgConfig *bgConfig, u8 bgId, MtxFx22 *mtx, fx32 centerX, fx32 centerY); +void BgCommitTilemapBufferToVram(BgConfig *bgConfig, u8 bgId); +void BgCopyOrUncompressTilemapBufferRangeToVram(BgConfig *bgConfig, u8 bgId, const void *buffer, u32 bufferSize, u32 baseTile); +void BG_LoadScreenTilemapData(BgConfig *bgConfig, u8 bgId, const void *data, u32 size); +void BG_LoadCharTilesData(BgConfig *bgConfig, u8 bgId, const void *data, u32 size, u32 tileStart); +void BG_ClearCharDataRange(u8 bgId, u32 size, u32 offset, HeapID heapId); +void BG_FillCharDataRange(BgConfig *bgConfig, enum GFBgLayer bgId, u32 fillValue, u32 ntiles, u32 offset); +void BG_LoadPlttData(u32 location, void *plttData, u32 size, enum GFPalSlotOffset offset); +void BG_SetMaskColor(u8 bgId, u16 value); +void LoadRectToBgTilemapRect(BgConfig *bgConfig, u8 bgId, const void *buffer, u8 destX, u8 destY, u8 width, u8 height); +void CopyToBgTilemapRect(BgConfig *bgConfig, u8 bgId, u8 destX, u8 destY, u8 destWidth, u8 destHeight, const void *buffer, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight); +void CopyRectToBgTilemapRect(BgConfig *bgConfig, u8 bgId, u8 destX, u8 destY, u8 destWidth, u8 destHeight, const void *buffer, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight); +void FillBgTilemapRect(BgConfig *bgConfig, u8 bgId, u16 fillValue, u8 x, u8 y, u8 width, u8 height, u8 mode); +void BgTilemapRectChangePalette(BgConfig *bgConfig, u8 bgId, u8 x, u8 y, u8 width, u8 height, u8 palette); +void BgClearTilemapBufferAndCommit(BgConfig *bgConfig, u8 bgId); +void BgFillTilemapBufferAndCommit(BgConfig *bgConfig, u8 bgId, u16 fillValue); +void BgFillTilemapBufferAndSchedule(BgConfig *bgConfig, u8 bgId, u16 fillValue); +void *BgGetCharPtr(u8 bgId); +u8 *Convert4bppTo8bpp(u8 *src4Bpp, u32 size, u8 paletteNum, HeapID heapId); +void *GetBgTilemapBuffer(BgConfig *bgConfig, u8 bgId); +u16 GetBgRotation(BgConfig *bgConfig, u8 bgId); +u8 GetBgPriority(BgConfig *bgConfig, u8 bgId); +void BlitBitmapRect4Bit(const Bitmap *src, const Bitmap *dest, u16 srcX, u16 srcY, u16 destX, u16 destY, u16 width, u16 height, u16 colorKey); +void FillBitmapRect8Bit(const Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue); +Window *AllocWindows(HeapID heapId, s32 num); +void InitWindow(Window *window); +BOOL WindowIsInUse(const Window *window); +void AddWindowParameterized(BgConfig *bgConfig, Window *window, u8 bgId, u8 x, u8 y, u8 width, u8 height, u8 paletteNum, u16 baseTile); +void AddTextWindowTopLeftCorner(BgConfig *bgConfig, Window *window, u8 width, u8 height, u16 baseTile, u8 paletteNum); +void AddWindow(BgConfig *bgConfig, Window *window, const WindowTemplate *template); +void RemoveWindow(Window *window); +void WindowArray_Delete(Window *windows, s32 count); +void CopyWindowToVram(Window *window); +void ScheduleWindowCopyToVram(Window *window); +void PutWindowTilemap(Window *window); +void PutWindowTilemapRectAnchoredTopLeft(Window *window, u8 width, u8 height); +void ClearWindowTilemap(Window *window); +void PutWindowTilemap_AffineMode(Window *window); +void CopyWindowPixelsToVram_TextMode(Window *window); +void ClearWindowTilemapAndCopyToVram(Window *window); +void ClearWindowTilemapAndScheduleTransfer(Window *window); +void FillWindowPixelBuffer(Window *window, u8 fillValue); +void BlitBitmapRectToWindow(Window *window, void *src, u16 srcX, u16 srcY, u16 srcWidth, u16 srcHeight, u16 destX, u16 destY, u16 destWidth, u16 destHeight); +void BlitBitmapRect(Window *window, void *src, u16 srcX, u16 srcY, u16 srcWidth, u16 srcHeight, u16 destX, u16 destY, u16 destWidth, u16 destHeight, u16 colorKey); +void FillWindowPixelRect(Window *window, u8 fillValue, u16 x, u16 y, u16 width, u16 height); +void CopyGlyphToWindow(Window *window, u8 *glyphPixels, u16 srcWidth, u16 srcHeight, u16 destX, u16 destY, u16 table); +void ScrollWindow(Window *window, u8 direction, u8 y, u8 fillValue); +u8 GetWindowBgId(Window *window); +u8 GetWindowWidth(Window *window); +u8 GetWindowHeight(Window *window); +u8 GetWindowX(Window *window); +u8 GetWindowY(Window *window); +void SetWindowX(Window *window, u8 x); +void SetWindowY(Window *window, u8 y); +void SetWindowPaletteNum(Window *window, u8 paletteNum); +NNSG2dCharacterData *LoadCharacterDataFromFile(void **char_ret, HeapID heapId, const char *path); +NNSG2dPaletteData *LoadPaletteDataFromFile(void **pltt_ret, HeapID heapId, const char *path); +void DoScheduledBgGpuUpdates(BgConfig *bgConfig); +void ScheduleBgTilemapBufferTransfer(BgConfig *bgConfig, u8 bgId); +void ScheduleSetBgPosText(BgConfig *bgConfig, u8 bgId, enum BgPosAdjustOp op, fx32 value); +void ScheduleSetBgAffineRotation(BgConfig *bgConfig, u8 bgId, enum BgPosAdjustOp op, u16 value); +void ScheduleSetBgAffinePos(BgConfig *bgConfig, u8 bgId, enum BgPosAdjustOp op, fx32 value); +BOOL DoesPixelAtScreenXYMatchPtrVal(BgConfig *bgConfig, u8 bgId, u8 x, u8 y, u16 *src); + +#endif // POKEDIAMOND_BG_WINDOW_H