diff options
author | Bad Diode <bd@badd10de.dev> | 2021-05-19 14:26:30 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-05-19 14:26:30 +0200 |
commit | 60684bb15f5c68eb8248673da48cc4469537ffc9 (patch) | |
tree | fd6901719ab8121b9bf8e0c98700a43eff198652 /src/text.h | |
parent | fd5dede600bcaf8d5c16963544512b2e0ba68586 (diff) | |
download | uxngba-60684bb15f5c68eb8248673da48cc4469537ffc9.tar.gz uxngba-60684bb15f5c68eb8248673da48cc4469537ffc9.zip |
Add a new console drawing mode
Diffstat (limited to 'src/text.h')
-rw-r--r-- | src/text.h | 68 |
1 files changed, 59 insertions, 9 deletions
@@ -9,6 +9,7 @@ | |||
9 | 9 | ||
10 | typedef enum { | 10 | typedef 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 | ||
117 | void | 118 | void |
119 | txt_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 | |||
148 | void | ||
118 | txt_putc(char c) { | 149 | txt_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 | ||
165 | void | 199 | void |
166 | txt_init_bitmap(TextMode mode, Font font) { | 200 | txt_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. | ||
205 | void | 235 | void |
206 | txt_clear_line(void) { | 236 | txt_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. | 243 | void |
244 | txt_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 | |||
252 | void | ||
253 | txt_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 | |||
214 | void | 265 | void |
215 | txt_clear_screen(void) { | 266 | txt_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; |