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
43#define TILE_SIZE 8
44
49#define TILE_MEM_OBJ_CHARBLOCK0_IDX 4
50
60#define TTE_BIT_UNPACK_OFFSET 14
61
63#define TTE_BIT_ON_CLR_IDX TTE_BIT_UNPACK_OFFSET + 1
64
66#define TTE_GREEN_PB 6 // 0x6
67
69#define TTE_PURPLE_PB 7 // 0x7
70
72#define TTE_DARK_GREEN_PB 8 // 0x8
73
75#define TTE_DARK_BLUE_PB 9 // 0x9
76
78#define TTE_BLACK_PB 10 // 0xA
79
81#define TTE_YELLOW_PB 11 // 0xB
82
84#define TTE_BLUE_PB 12 // 0xC
85
87#define TTE_RED_PB 13 // 0xD
88
90#define TTE_WHITE_PB 14 // 0xE
91
93#define TTE_SPECIAL_PB_MULT_OFFSET 0x1000
94
100#define TTE_CHAR_SIZE TILE_SIZE
101
111#define TTE_GREEN_TAG "#{cx:0x6000}"
112
114#define TTE_PURPLE_TAG "#{cx:0x7000}"
115
117#define TTE_DARK_GREEN_TAG "#{cx:0x8000}"
118
120#define TTE_DARK_BLUE_TAG "#{cx:0x9000}"
121
123#define TTE_BLACK_TAG "#{cx:0xA000}"
124
126#define TTE_YELLOW_TAG "#{cx:0xB000}"
127
129#define TTE_BLUE_TAG "#{cx:0xC000}"
130
132#define TTE_RED_TAG "#{cx:0xD000}"
133
135#define TTE_WHITE_TAG "#{cx:0xE000}"
136
138#define TTE_DIAMOND_TAG TTE_YELLOW_TAG "Diamond "
139
141#define TTE_HEART_TAG TTE_RED_TAG "Hearts "
142
144#define TTE_SPADE_TAG TTE_DARK_BLUE_TAG "Spade "
145
147#define TTE_CLUB_TAG TTE_DARK_GREEN_TAG "Club "
148
158#define TEXT_CLR_GREEN RGB15(10, 27, 16)
159
161#define TEXT_CLR_PURPLE RGB15(25, 15, 31)
162
164#define TEXT_CLR_DARK_GREEN RGB15(0, 14, 8)
165
167#define TEXT_CLR_DARK_BLUE RGB15(10, 5, 15)
168
170#define TEXT_CLR_BLACK RGB15(3, 5, 5) // ~ 0x1483
171
173#define TEXT_CLR_YELLOW RGB15(31, 20, 0) // 0x029F
174
176#define TEXT_CLR_BLUE RGB15(0, 18, 31) // 0x7E40
177
179#define TEXT_CLR_RED RGB15(31, 9, 8) // 0x213F
180
182#define TEXT_CLR_WHITE CLR_WHITE
183
198#define SE_ROW_LEN 32
199
201#define SE_COL_LEN 32
202
205enum ScreenVertDir
206{
207 SCREEN_UP = -1,
208 SCREEN_DOWN = 1
209};
210
211enum ScreenHorzDir
212{
213 SCREEN_LEFT = -1,
214 SCREEN_RIGHT = 1
215};
216
217enum OverflowDir
218{
219 OVERFLOW_LEFT = SCREEN_LEFT,
220 OVERFLOW_RIGHT = SCREEN_RIGHT
221};
222
223enum TextJustifyFlag
224{
225 JUSTIFY_LEFT,
226 JUSTIFY_CENTER
227};
228
231// When making this, missed that it already exists in tonc_math.h
232typedef RECT Rect;
233
234// clang-format off
258// clang-format on
259typedef struct NinePatchRect
260{
261 Rect patch_rect;
262 Rect margins;
264
265INLINE void tte_colors_setup(void)
266{
267 pal_bg_bank[TTE_GREEN_PB][TTE_BIT_ON_CLR_IDX] = TEXT_CLR_GREEN;
268 pal_bg_bank[TTE_PURPLE_PB][TTE_BIT_ON_CLR_IDX] = TEXT_CLR_PURPLE;
269 pal_bg_bank[TTE_DARK_GREEN_PB][TTE_BIT_ON_CLR_IDX] = TEXT_CLR_DARK_GREEN;
270 pal_bg_bank[TTE_DARK_BLUE_PB][TTE_BIT_ON_CLR_IDX] = TEXT_CLR_DARK_BLUE;
271 pal_bg_bank[TTE_BLACK_PB][TTE_BIT_ON_CLR_IDX] = TEXT_CLR_BLACK;
272 pal_bg_bank[TTE_YELLOW_PB][TTE_BIT_ON_CLR_IDX] = TEXT_CLR_YELLOW;
273 pal_bg_bank[TTE_BLUE_PB][TTE_BIT_ON_CLR_IDX] = TEXT_CLR_BLUE;
274 pal_bg_bank[TTE_RED_PB][TTE_BIT_ON_CLR_IDX] = TEXT_CLR_RED;
275 pal_bg_bank[TTE_WHITE_PB][TTE_BIT_ON_CLR_IDX] = TEXT_CLR_WHITE;
276}
277
285INLINE int rect_width(const Rect* rect)
286{
287 return max(0, rect->right - rect->left + 1);
288}
289
297INLINE int rect_height(const Rect* rect)
298{
299 return max(0, rect->bottom - rect->top + 1);
300}
301
319void bg_se_copy_rect_1_tile_vert(u16 bg_sbb, Rect se_rect, enum ScreenVertDir direction);
320
326void main_bg_se_clear_rect(Rect se_rect);
327
335void main_bg_se_copy_rect_1_tile_vert(Rect se_rect, enum ScreenVertDir direction);
336
344void main_bg_se_copy_rect(Rect se_rect, BG_POINT dest_pos);
345
352void main_bg_se_copy_expand_tile(Rect se_rect_dest, BG_POINT se_tile_src);
353
370void main_bg_se_copy_expand_9_patch(Rect se_dest_rect, const NinePatchRect* src_9_ptch);
371
389void main_bg_se_copy_expand_3x3_rect(Rect se_rect_dest, BG_POINT se_rect_src_3x3_top_left);
390
405void main_bg_se_copy_expand_3w_row(Rect se_dest_rect, BG_POINT src_row_left_pnt);
406
416void main_bg_se_move_rect_1_tile_vert(Rect se_rect, enum ScreenVertDir direction);
417
423void tte_erase_rect_wrapper(Rect rect);
424
442 Rect* rect,
443 const char* str,
444 enum OverflowDir overflow_direction
445);
446
466void update_text_rect_to_center_str(Rect* rect, const char* str, enum ScreenHorzDir bias_direction);
467
483void memcpy16_tile8_with_palette_offset(u16* dst, const u16* src, uint hwcount, u8 palette_offset);
484
500void memcpy32_tile8_with_palette_offset(u32* dst, const u32* src, uint wcount, u8 palette_offset);
501
510void toggle_windows(bool win0, bool win1);
511
537 const char* raw_text,
538 Rect dst_rect,
539 enum TextJustifyFlag justify_direction,
540 enum ScreenHorzDir bias_direction,
541 bool do_print
542);
543
544#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.