GBAlatro
A Demake of Balatro for the GBA
Loading...
Searching...
No Matches
graphic_utils.h
Go to the documentation of this file.
1
15#ifndef GRAPHIC_UTILS_H
16#define GRAPHIC_UTILS_H
17
18#include <tonc_math.h>
19#include <tonc_video.h>
20
31#define MAIN_BG_SBB 31
32#define MAIN_BG_CBB 1
33#define TTE_SBB 30
34#define TTE_CBB 0
35#define AFFINE_BG_SBB 2
36#define AFFINE_BG_CBB 2
37#define PAL_ROW_LEN 16
38#define NUM_PALETTES 16
39
44#define TILE_SIZE 8
45
50#define TILE_MEM_OBJ_CHARBLOCK0_IDX 4
51
61#define TTE_BIT_UNPACK_OFFSET 14
62
64#define TTE_BIT_ON_CLR_IDX TTE_BIT_UNPACK_OFFSET + 1
65
67#define TTE_GREEN_PB 6 // 0x6
68
70#define TTE_PURPLE_PB 7 // 0x7
71
73#define TTE_DARK_GREEN_PB 8 // 0x8
74
76#define TTE_DARK_BLUE_PB 9 // 0x9
77
79#define TTE_BLACK_PB 10 // 0xA
80
82#define TTE_YELLOW_PB 11 // 0xB
83
85#define TTE_BLUE_PB 12 // 0xC
86
88#define TTE_RED_PB 13 // 0xD
89
91#define TTE_WHITE_PB 14 // 0xE
92
94#define TTE_SPECIAL_PB_MULT_OFFSET 0x1000
95
101#define TTE_CHAR_SIZE TILE_SIZE
102
112#define TTE_GREEN_TAG "#{cx:0x6000}"
113
115#define TTE_PURPLE_TAG "#{cx:0x7000}"
116
118#define TTE_DARK_GREEN_TAG "#{cx:0x8000}"
119
121#define TTE_DARK_BLUE_TAG "#{cx:0x9000}"
122
124#define TTE_BLACK_TAG "#{cx:0xA000}"
125
127#define TTE_YELLOW_TAG "#{cx:0xB000}"
128
130#define TTE_BLUE_TAG "#{cx:0xC000}"
131
133#define TTE_RED_TAG "#{cx:0xD000}"
134
136#define TTE_WHITE_TAG "#{cx:0xE000}"
137
139#define TTE_DIAMOND_TAG TTE_YELLOW_TAG "Diamond "
140
142#define TTE_HEART_TAG TTE_RED_TAG "Hearts "
143
145#define TTE_SPADE_TAG TTE_DARK_BLUE_TAG "Spade "
146
148#define TTE_CLUB_TAG TTE_DARK_GREEN_TAG "Club "
149
159#define TEXT_CLR_GREEN RGB15(10, 27, 16)
160
162#define TEXT_CLR_PURPLE RGB15(25, 15, 31)
163
165#define TEXT_CLR_DARK_GREEN RGB15(0, 14, 8)
166
168#define TEXT_CLR_DARK_BLUE RGB15(10, 5, 15)
169
171#define TEXT_CLR_BLACK RGB15(3, 5, 5) // ~ 0x1483
172
174#define TEXT_CLR_YELLOW RGB15(31, 20, 0) // 0x029F
175
177#define TEXT_CLR_BLUE RGB15(0, 18, 31) // 0x7E40
178
180#define TEXT_CLR_RED RGB15(31, 9, 8) // 0x213F
181
183#define TEXT_CLR_WHITE CLR_WHITE
184
199#define SE_ROW_LEN 32
200
202#define SE_COL_LEN 32
203
206enum ScreenVertDir
207{
208 SCREEN_UP = -1,
209 SCREEN_DOWN = 1
210};
211
212enum ScreenHorzDir
213{
214 SCREEN_LEFT = -1,
215 SCREEN_RIGHT = 1
216};
217
218enum OverflowDir
219{
220 OVERFLOW_LEFT = SCREEN_LEFT,
221 OVERFLOW_RIGHT = SCREEN_RIGHT
222};
223
224enum TextJustifyFlag
225{
226 JUSTIFY_LEFT,
227 JUSTIFY_CENTER
228};
229
232// When making this, missed that it already exists in tonc_math.h
233typedef RECT Rect;
234
235// clang-format off
259// clang-format on
260typedef struct NinePatchRect
261{
262 Rect patch_rect;
263 Rect margins;
265
266INLINE void tte_colors_setup(void)
267{
268 pal_bg_bank[TTE_GREEN_PB][TTE_BIT_ON_CLR_IDX] = TEXT_CLR_GREEN;
269 pal_bg_bank[TTE_PURPLE_PB][TTE_BIT_ON_CLR_IDX] = TEXT_CLR_PURPLE;
270 pal_bg_bank[TTE_DARK_GREEN_PB][TTE_BIT_ON_CLR_IDX] = TEXT_CLR_DARK_GREEN;
271 pal_bg_bank[TTE_DARK_BLUE_PB][TTE_BIT_ON_CLR_IDX] = TEXT_CLR_DARK_BLUE;
272 pal_bg_bank[TTE_BLACK_PB][TTE_BIT_ON_CLR_IDX] = TEXT_CLR_BLACK;
273 pal_bg_bank[TTE_YELLOW_PB][TTE_BIT_ON_CLR_IDX] = TEXT_CLR_YELLOW;
274 pal_bg_bank[TTE_BLUE_PB][TTE_BIT_ON_CLR_IDX] = TEXT_CLR_BLUE;
275 pal_bg_bank[TTE_RED_PB][TTE_BIT_ON_CLR_IDX] = TEXT_CLR_RED;
276 pal_bg_bank[TTE_WHITE_PB][TTE_BIT_ON_CLR_IDX] = TEXT_CLR_WHITE;
277}
278
286INLINE int rect_width(const Rect* rect)
287{
288 return max(0, rect->right - rect->left + 1);
289}
290
298INLINE int rect_height(const Rect* rect)
299{
300 return max(0, rect->bottom - rect->top + 1);
301}
302
320void bg_se_copy_rect_1_tile_vert(u16 bg_sbb, Rect se_rect, enum ScreenVertDir direction);
321
327void main_bg_se_clear_rect(Rect se_rect);
328
336void main_bg_se_copy_rect_1_tile_vert(Rect se_rect, enum ScreenVertDir direction);
337
345void main_bg_se_copy_rect(Rect se_rect, BG_POINT dest_pos);
346
353void main_bg_se_copy_expand_tile(Rect se_rect_dest, BG_POINT se_tile_src);
354
371void main_bg_se_copy_expand_9_patch(Rect se_dest_rect, const NinePatchRect* src_9_ptch);
372
390void main_bg_se_copy_expand_3x3_rect(Rect se_rect_dest, BG_POINT se_rect_src_3x3_top_left);
391
406void main_bg_se_copy_expand_3w_row(Rect se_dest_rect, BG_POINT src_row_left_pnt);
407
417void main_bg_se_move_rect_1_tile_vert(Rect se_rect, enum ScreenVertDir direction);
418
424void tte_erase_rect_wrapper(Rect rect);
425
443 Rect* rect,
444 const char* str,
445 enum OverflowDir overflow_direction
446);
447
467void update_text_rect_to_center_str(Rect* rect, const char* str, enum ScreenHorzDir bias_direction);
468
484void memcpy16_tile8_with_palette_offset(u16* dst, const u16* src, uint hwcount, u8 palette_offset);
485
501void memcpy32_tile8_with_palette_offset(u32* dst, const u32* src, uint wcount, u8 palette_offset);
502
511void toggle_windows(bool win0, bool win1);
512
538 const char* raw_text,
539 Rect dst_rect,
540 enum TextJustifyFlag justify_direction,
541 enum ScreenHorzDir bias_direction,
542 bool do_print
543);
544
545#endif // GRAPHIC_UTILS_H
void main_bg_se_move_rect_1_tile_vert(Rect se_rect, enum ScreenVertDir direction)
Moves a rect in the main background vertically in direction by a single tile.
void memcpy16_tile8_with_palette_offset(u16 *dst, const u16 *src, uint hwcount, u8 palette_offset)
Copies 16 bit data from src to dst, applying a palette offset to the data.
INLINE int rect_height(const Rect *rect)
Get the height of a rectangle.
void main_bg_se_copy_rect_1_tile_vert(Rect se_rect, enum ScreenVertDir direction)
Copies a rect in the main background vertically in direction by a single tile.
void main_bg_se_clear_rect(Rect se_rect)
Clears a rect in the main background.
void main_bg_se_copy_rect(Rect se_rect, BG_POINT dest_pos)
Copies a rect in the main background from se_rect to the position (x, y).
void toggle_windows(bool win0, bool win1)
Toggles the visibility of the window layers.
void update_text_rect_to_right_align_str(Rect *rect, const char *str, enum OverflowDir overflow_direction)
Changes rect->left so it fits the digits of num exactly when right aligned to rect->right....
void update_text_rect_to_center_str(Rect *rect, const char *str, enum ScreenHorzDir bias_direction)
Updates a rect so a string is centered within it.
void memcpy32_tile8_with_palette_offset(u32 *dst, const u32 *src, uint wcount, u8 palette_offset)
Copies 32 bit data from src to dst, applying a palette offset to the data.
void main_bg_se_copy_expand_3x3_rect(Rect se_rect_dest, BG_POINT se_rect_src_3x3_top_left)
Copies a 3x3 rect and expands it to fit a passed rect. Special case of the 9-patch.
void tte_erase_rect_wrapper(Rect rect)
A wrapper for tte_erase_rect that would use the rect struct.
int tte_printf_justified_in_rect(const char *raw_text, Rect dst_rect, enum TextJustifyFlag justify_direction, enum ScreenHorzDir bias_direction, bool do_print)
Justify a text with custom formatting tags according to the given justification and bias direction ta...
void main_bg_se_copy_expand_3w_row(Rect se_dest_rect, BG_POINT src_row_left_pnt)
Copies a 3-width SE rect and expands it to fit a passed rect.
void main_bg_se_copy_expand_9_patch(Rect se_dest_rect, const NinePatchRect *src_9_ptch)
Copies a 9-patch and expands it to fit a passed rect.
void bg_se_copy_rect_1_tile_vert(u16 bg_sbb, Rect se_rect, enum ScreenVertDir direction)
Copies an SE rect vertically in direction by a single tile.
INLINE int rect_width(const Rect *rect)
Get the width of a rectangle.
void main_bg_se_copy_expand_tile(Rect se_rect_dest, BG_POINT se_tile_src)
Copies a tile in the main background at se_tile_src to fill se_rect_dest.
Structure to represent arbitrary-sized 9-patches.