#ifndef GBAEXP_TILES_H #define GBAEXP_TILES_H #include #include #include "common.h" #include "bitmap.h" #include "posprintf.h" #include "ppu.h" typedef struct TextEngine { // Currently working on tiled backgrounds only. The X and Y positions // correspond to the tile X and Y starting from the top left of the screen. // For a 240x160 screen, we have 30x20 tiles available. size_t cursor_x; size_t cursor_y; // Pointer to the memory being used for writing to the screen. u32 *memory; // The font used to render the text. u8 color; } TextEngine; static TextEngine text_engine = {0}; void txt_putc(char c) { if (c == '\0') { return; } if (c == '\n') { text_engine.cursor_x = 0; text_engine.cursor_y++; } else { int x = text_engine.cursor_x; int y = text_engine.cursor_y; putfontchar(text_engine.memory, x, y, c, text_engine.color); text_engine.cursor_x += 1; if (text_engine.cursor_x >= 30) { text_engine.cursor_x = 0; text_engine.cursor_y++; } } if (text_engine.cursor_y >= 20) { text_engine.cursor_y = 0; } } static inline void txt_puts(char *msg) { while (*msg) { txt_putc(*msg++); } } void txt_init(u8 color, u32 *buf) { // Prepare text engine. text_engine.color = color; text_engine.memory = buf; } // Print text to the screen with formatting. #define txt_printf(msg, ...) \ { \ char buf[256] = {0}; \ posprintf(buf, msg, ##__VA_ARGS__); \ txt_puts(buf); \ } void txt_clear_line(void) { for (size_t i = 0; i < 30; ++i) { int x = text_engine.cursor_x; int y = text_engine.cursor_y; putfontchar(text_engine.memory, x, y, ' ', text_engine.color); } text_engine.cursor_x = 0; } void txt_clear_screen(void) { for (size_t j = 0; j < 20; ++j) { text_engine.cursor_y = j; txt_clear_line(); } text_engine.cursor_x = 0; text_engine.cursor_y = 0; } void txt_position(size_t tile_x, size_t tile_y) { text_engine.cursor_x = tile_x; text_engine.cursor_y = tile_y; } #endif // GBAEXP_TILES_H