diff options
Diffstat (limited to 'include/bg_window.h')
-rw-r--r-- | include/bg_window.h | 424 |
1 files changed, 424 insertions, 0 deletions
diff --git a/include/bg_window.h b/include/bg_window.h new file mode 100644 index 00000000..24ed152b --- /dev/null +++ b/include/bg_window.h @@ -0,0 +1,424 @@ +#ifndef POKEDIAMOND_UNK_02016B94_H +#define POKEDIAMOND_UNK_02016B94_H + +#include "NNS_g2d.h" +#include "global.h" +#include "GX_layers.h" +#include "MI_uncompress.h" +#include "OS_cache.h" +#include "gx.h" +#include "heap.h" +#include "math_util.h" + +struct BgTemplate +{ + u32 x; + u32 y; + u32 bufferSize; + u32 baseTile; + + u8 size; + u8 colorMode; + u8 screenBase; + u8 charBase; + u8 bgExtPltt; + u8 priority; + u8 areaOver; + u8 unk17; // probably paddding + u32 mosaic; +}; + +struct Bg +{ + void *tilemapBuffer; + u32 bufferSize; + u32 baseTile; + + fx32 hOffset; + fx32 vOffset; + + u8 mode; + u8 size; + u8 colorMode; + u8 tileSize; + u16 rotation; + u16 unk22; // probably padding + fx32 xScale; + fx32 yScale; + fx32 centerX; + fx32 centerY; +}; + +struct BgConfig +{ + u32 heap_id; + u16 scrollScheduled; + u16 bufferTransferScheduled; + struct Bg bgs[8]; +}; + +struct Bitmap +{ + const u8 *pixels; + u16 width; + u16 height; +}; + +struct WindowTemplate +{ + u8 bgId; + u8 tilemapLeft; + u8 tilemapTop; + u8 width; + u8 height; + u8 paletteNum; + u16 baseTile; +}; + +struct Window +{ + struct BgConfig *bgConfig; + u8 bgId; + u8 tilemapLeft; + u8 tilemapTop; + u8 width; + u8 height; + u8 paletteNum; + u16 baseTile : 15; + u16 colorMode : 1; + void *pixelBuffer; +}; + +enum GFBppMode +{ + GF_BG_CLR_4BPP = 0, + GF_BG_CLR_8BPP, +}; + +enum GFBgLayer +{ + GF_BG_LYR_MAIN_0 = 0, + GF_BG_LYR_MAIN_1, + GF_BG_LYR_MAIN_2, + GF_BG_LYR_MAIN_3, + GF_BG_LYR_SUB_0, + GF_BG_LYR_SUB_1, + GF_BG_LYR_SUB_2, + GF_BG_LYR_SUB_3, + GF_BG_LYR_MAIN_CNT = 4, + 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_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), + GF_BG_LYR_MAIN_2_F = 1 << (GF_BG_LYR_MAIN_2 - GF_BG_LYR_MAIN_FIRST), + GF_BG_LYR_MAIN_3_F = 1 << (GF_BG_LYR_MAIN_3 - GF_BG_LYR_MAIN_FIRST), + GF_BG_LYR_SUB_0_F = 1 << (GF_BG_LYR_SUB_0 - GF_BG_LYR_SUB_FIRST), + GF_BG_LYR_SUB_1_F = 1 << (GF_BG_LYR_SUB_1 - GF_BG_LYR_SUB_FIRST), + GF_BG_LYR_SUB_2_F = 1 << (GF_BG_LYR_SUB_2 - GF_BG_LYR_SUB_FIRST), + GF_BG_LYR_SUB_3_F = 1 << (GF_BG_LYR_SUB_3 - GF_BG_LYR_SUB_FIRST), + + GF_BG_LYR_UNALLOC = 0xFF, +}; + +enum GFBgType +{ + GF_BG_TYPE_TEXT = 0, + GF_BG_TYPE_AFFINE, + GF_BG_TYPE_256x16PLTT, +}; + +enum GFBgCntSet +{ + GF_BG_CNT_SET_COLOR_MODE = 0, + GF_BG_CNT_SET_SCREEN_BASE, + GF_BG_CNT_SET_CHAR_BASE, +}; + +enum GFBgScreenSize +{ + GF_BG_SCR_SIZE_128x128 = 0, + GF_BG_SCR_SIZE_256x256, + GF_BG_SCR_SIZE_256x512, + GF_BG_SCR_SIZE_512x256, + GF_BG_SCR_SIZE_512x512, + GF_BG_SCR_SIZE_1024x1024 +}; + +enum BgPosAdjustOp +{ + // Text layers + BG_POS_OP_SET_X = 0, + BG_POS_OP_ADD_X, + BG_POS_OP_SUB_X, + BG_POS_OP_SET_Y, + BG_POS_OP_ADD_Y, + BG_POS_OP_SUB_Y, + + // Affine layers + BG_POS_OP_SET_ROT = 0, + BG_POS_OP_ADD_ROT, + BG_POS_OP_SUB_ROT, + BG_POS_OP_SET_CENTERX = 9, + BG_POS_OP_ADD_CENTERX, + BG_POS_OP_SUB_CENTERX, + BG_POS_OP_SET_CENTERY, + BG_POS_OP_ADD_CENTERY, + BG_POS_OP_SUB_CENTERY, +}; + +struct BgConfig *BgConfig_Alloc(u32 heap_id); +u32 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(u8 size, u32 bgMode); +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, u32 heap_id); +void BG_FillCharDataRange( + struct BgConfig *param0, u32 bgId, u32 fillValue, u32 count, u32 offset); +void BG_LoadPlttData(u32 bgId, void *plttData, u32 size, u32 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, + u32 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, u32 heap_id); +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(u32 heap_id, 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_dtor(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, + const char * src, + 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, u32 heap_id, const char *path); +NNSG2dPaletteData * LoadPaletteDataFromFile(void **pltt_ret, u32 heap_id, 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); + +#endif // POKEDIAMOND_UNK_02016B94_H |