#ifndef GUARD_PALETTE_H #define GUARD_PALETTE_H #define gPaletteFade_selectedPalettes (gPaletteFade.multipurpose1) // normal and fast fade #define gPaletteFade_blendCnt (gPaletteFade.multipurpose1) // hardware fade #define gPaletteFade_delay (gPaletteFade.multipurpose2) // normal and hardware fade #define gPaletteFade_submode (gPaletteFade.multipurpose2) // fast fade #define PLTT_BUFFER_SIZE (PLTT_SIZE / sizeof(u16)) #define PALETTE_FADE_STATUS_DELAY 2 #define PALETTE_FADE_STATUS_ACTIVE 1 #define PALETTE_FADE_STATUS_DONE 0 #define PALETTE_FADE_STATUS_LOADING 0xFF #define PALETTES_BG 0x0000FFFF #define PALETTES_OBJECTS 0xFFFF0000 #define PALETTES_ALL (PALETTES_BG | PALETTES_OBJECTS) #define PLTT_ID(n) ((n) * 16) #define BG_PLTT_OFFSET 0x000 #define OBJ_PLTT_OFFSET 0x100 #define BG_PLTT_ID(n) (BG_PLTT_OFFSET + PLTT_ID(n)) #define OBJ_PLTT_ID(n) (OBJ_PLTT_OFFSET + PLTT_ID(n)) #define OBJ_PLTT_ID2(n) (PLTT_ID((n) + 16)) enum { FAST_FADE_IN_FROM_WHITE, FAST_FADE_OUT_TO_WHITE, FAST_FADE_IN_FROM_BLACK, FAST_FADE_OUT_TO_BLACK, }; struct BlendSettings { u32 blendColor:24; u32 isTint:1; u32 coeff:5; }; struct PaletteFadeControl { u32 multipurpose1; struct BlendSettings *bld0; struct BlendSettings *bld1; u16 weight:9; u8 delayCounter:6; u16 y:5; // blend coefficient u16 targetY:5; // target blend coefficient u16 blendColor:15; bool16 active:1; u16 multipurpose2:6; bool16 yDec:1; // whether blend coefficient is decreasing bool16 bufferTransferDisabled:1; u16 mode:2; bool16 shouldResetBlendRegisters:1; bool16 hardwareFadeFinishing:1; u16 softwareFadeFinishingCounter:5; bool16 softwareFadeFinishing:1; bool16 objPaletteToggle:1; u8 deltaY:4; // rate of change of blend coefficient }; extern const struct BlendSettings gTimeOfDayBlend[]; extern struct PaletteFadeControl gPaletteFade; extern u32 gPlttBufferTransferPending; extern u8 ALIGNED(4) gPaletteDecompressionBuffer[]; extern u16 ALIGNED(4) gPlttBufferUnfaded[PLTT_BUFFER_SIZE]; extern u16 ALIGNED(4) gPlttBufferFaded[PLTT_BUFFER_SIZE]; void LoadCompressedPalette(const u32 *src, u16 offset, u16 size); void LoadPalette(const void *src, u16 offset, u16 size); void LoadPaletteFast(const void *src, u16 offset, u16 size); void FillPalette(u16 value, u16 offset, u16 size); void TransferPlttBuffer(void); u8 UpdatePaletteFade(void); void ResetPaletteFade(void); bool8 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targetY, u16 blendColor); void PaletteStruct_ResetById(u16 id); void ResetPaletteFadeControl(void); void InvertPlttBuffer(u32 selectedPalettes); void TintPlttBuffer(u32 selectedPalettes, s8 r, s8 g, s8 b); void UnfadePlttBuffer(u32 selectedPalettes); void BeginFastPaletteFade(u8 submode); void BeginHardwarePaletteFade(u8 blendCnt, u8 delay, u8 y, u8 targetY, u8 shouldResetBlendRegisters); void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color); void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color); void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id); void TintPalette_GrayScale(u16 *palette, u16 count); void TintPalette_GrayScale2(u16 *palette, u16 count); void TintPalette_SepiaTone(u16 *palette, u16 count); void TintPalette_CustomTone(u16 *palette, u16 count, u16 rTone, u16 gTone, u16 bTone); bool8 BeginTimeOfDayPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targetY, struct BlendSettings *bld0, struct BlendSettings *bld1, u16 weight, u16 color); void BlendPalettesFine(u32 palettes, u16 *src, u16 *dst, u32 coeff, u32 color); void TimeMixPalettes(u32 palettes, u16 *src, u16 *dst, struct BlendSettings *blend0, struct BlendSettings *blend1, u16 weight0); void AvgPaletteWeighted(u16 *src0, u16 *src1, u16 *dst, u16 weight0); static inline void SetBackdropFromColor(u16 color) { FillPalette(color, 0, PLTT_SIZEOF(1)); } static inline void SetBackdropFromPalette(const u16 *palette) { LoadPalette(palette, 0, PLTT_SIZEOF(1)); } #endif // GUARD_PALETTE_H