aboutsummaryrefslogtreecommitdiffstats
path: root/src/text.h
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-05-19 14:26:30 +0200
committerBad Diode <bd@badd10de.dev>2021-05-19 14:26:30 +0200
commit60684bb15f5c68eb8248673da48cc4469537ffc9 (patch)
treefd6901719ab8121b9bf8e0c98700a43eff198652 /src/text.h
parentfd5dede600bcaf8d5c16963544512b2e0ba68586 (diff)
downloaduxngba-60684bb15f5c68eb8248673da48cc4469537ffc9.tar.gz
uxngba-60684bb15f5c68eb8248673da48cc4469537ffc9.zip
Add a new console drawing mode
Diffstat (limited to 'src/text.h')
-rw-r--r--src/text.h68
1 files changed, 59 insertions, 9 deletions
diff --git a/src/text.h b/src/text.h
index bfac4e4..b3bb601 100644
--- a/src/text.h
+++ b/src/text.h
@@ -9,6 +9,7 @@
9 9
10typedef enum { 10typedef enum {
11 TXT_MODE_TILED_BG, 11 TXT_MODE_TILED_BG,
12 TXT_MODE_HYBRID,
12 TXT_MODE_MODE3, 13 TXT_MODE_MODE3,
13} TextMode; 14} TextMode;
14 15
@@ -115,6 +116,36 @@ txt_putc_m3(char c) {
115} 116}
116 117
117void 118void
119txt_putc_hybrid(char c) {
120 if (c == '\0') {
121 return;
122 }
123 if (c == '\n') {
124 text_engine.cursor_x = 0;
125 text_engine.cursor_y++;
126 } else {
127 u8 idx = text_engine.font.char_map[(int)c] * 2;
128 u32 *packed_char = text_engine.font.data;
129 packed_char += idx;
130 Tile tile = {0};
131 unpack_tiles(packed_char, &tile, 1);
132 int x = text_engine.cursor_x;
133 int y = text_engine.cursor_y;
134 // DEBUG: should be on the text struct.
135 Tile *buf = &TILE_MEM[0];
136 buf[x + y * 30] = tile;
137 text_engine.cursor_x += 1;
138 if (text_engine.cursor_x >= 30) {
139 text_engine.cursor_x = 0;
140 text_engine.cursor_y++;
141 }
142 }
143 if (text_engine.cursor_y >= 20) {
144 text_engine.cursor_y = 0;
145 }
146}
147
148void
118txt_putc(char c) { 149txt_putc(char c) {
119 switch (text_engine.mode) { 150 switch (text_engine.mode) {
120 case TXT_MODE_TILED_BG: { 151 case TXT_MODE_TILED_BG: {
@@ -123,6 +154,9 @@ txt_putc(char c) {
123 case TXT_MODE_MODE3: { 154 case TXT_MODE_MODE3: {
124 txt_putc_m3(c); 155 txt_putc_m3(c);
125 } break; 156 } break;
157 case TXT_MODE_HYBRID: {
158 txt_putc_hybrid(c);
159 } break;
126 } 160 }
127} 161}
128 162
@@ -164,9 +198,6 @@ txt_init_tile(size_t bg, Font font, size_t cb_idx) {
164 198
165void 199void
166txt_init_bitmap(TextMode mode, Font font) { 200txt_init_bitmap(TextMode mode, Font font) {
167 // NOTE: Only mode 3 is currently supported
168 assert(mode == TXT_MODE_MODE3);
169
170 // If font_map is NULL, initialize the standard 0-255 character map. 201 // If font_map is NULL, initialize the standard 0-255 character map.
171 if (font.char_map == NULL) { 202 if (font.char_map == NULL) {
172 for (size_t i = 0; i < 256; ++i) { 203 for (size_t i = 0; i < 256; ++i) {
@@ -201,22 +232,41 @@ txt_printf(char *msg, ...) {
201 txt_puts(buf); 232 txt_puts(buf);
202} 233}
203 234
204// TODO: Update for working on bitmap modes.
205void 235void
206txt_clear_line(void) { 236txt_clear_line_tiled(void) {
207 for (size_t i = 0; i < 30; ++i) { 237 for (size_t i = 0; i < 30; ++i) {
208 text_engine.memory[i + 32 * text_engine.cursor_y] = ' '; 238 text_engine.memory[i + 32 * text_engine.cursor_y] = ' ';
209 } 239 }
210 text_engine.cursor_x = 0; 240 text_engine.cursor_x = 0;
211} 241}
212 242
213// TODO: Update for working on bitmap modes. 243void
244txt_clear_line_bitmap(void) {
245 // DEBUG: should be on the text struct.
246 Tile *buf = &TILE_MEM[0];
247 for (size_t i = 0; i < 30; ++i) {
248 buf[i + text_engine.cursor_y * 30] = (Tile){0};
249 }
250}
251
252void
253txt_clear_line(void) {
254 switch (text_engine.mode) {
255 case TXT_MODE_TILED_BG: {
256 txt_clear_line_tiled();
257 } break;
258 case TXT_MODE_MODE3:
259 case TXT_MODE_HYBRID: {
260 txt_clear_line_bitmap();
261 } break;
262 }
263}
264
214void 265void
215txt_clear_screen(void) { 266txt_clear_screen(void) {
216 for (size_t j = 0; j < 20; ++j) { 267 for (size_t j = 0; j < 20; ++j) {
217 for (size_t i = 0; i < 30; ++i) { 268 text_engine.cursor_y = j;
218 text_engine.memory[i + 32 * j] = ' '; 269 txt_clear_line();
219 }
220 } 270 }
221 text_engine.cursor_x = 0; 271 text_engine.cursor_x = 0;
222 text_engine.cursor_y = 0; 272 text_engine.cursor_y = 0;