From 60684bb15f5c68eb8248673da48cc4469537ffc9 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Wed, 19 May 2021 14:26:30 +0200 Subject: Add a new console drawing mode --- src/text.h | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 59 insertions(+), 9 deletions(-) (limited to 'src/text.h') 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 @@ typedef enum { TXT_MODE_TILED_BG, + TXT_MODE_HYBRID, TXT_MODE_MODE3, } TextMode; @@ -114,6 +115,36 @@ txt_putc_m3(char c) { } } +void +txt_putc_hybrid(char c) { + if (c == '\0') { + return; + } + if (c == '\n') { + text_engine.cursor_x = 0; + text_engine.cursor_y++; + } else { + u8 idx = text_engine.font.char_map[(int)c] * 2; + u32 *packed_char = text_engine.font.data; + packed_char += idx; + Tile tile = {0}; + unpack_tiles(packed_char, &tile, 1); + int x = text_engine.cursor_x; + int y = text_engine.cursor_y; + // DEBUG: should be on the text struct. + Tile *buf = &TILE_MEM[0]; + buf[x + y * 30] = tile; + 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; + } +} + void txt_putc(char c) { switch (text_engine.mode) { @@ -123,6 +154,9 @@ txt_putc(char c) { case TXT_MODE_MODE3: { txt_putc_m3(c); } break; + case TXT_MODE_HYBRID: { + txt_putc_hybrid(c); + } break; } } @@ -164,9 +198,6 @@ txt_init_tile(size_t bg, Font font, size_t cb_idx) { void txt_init_bitmap(TextMode mode, Font font) { - // NOTE: Only mode 3 is currently supported - assert(mode == TXT_MODE_MODE3); - // If font_map is NULL, initialize the standard 0-255 character map. if (font.char_map == NULL) { for (size_t i = 0; i < 256; ++i) { @@ -201,22 +232,41 @@ txt_printf(char *msg, ...) { txt_puts(buf); } -// TODO: Update for working on bitmap modes. void -txt_clear_line(void) { +txt_clear_line_tiled(void) { for (size_t i = 0; i < 30; ++i) { text_engine.memory[i + 32 * text_engine.cursor_y] = ' '; } text_engine.cursor_x = 0; } -// TODO: Update for working on bitmap modes. +void +txt_clear_line_bitmap(void) { + // DEBUG: should be on the text struct. + Tile *buf = &TILE_MEM[0]; + for (size_t i = 0; i < 30; ++i) { + buf[i + text_engine.cursor_y * 30] = (Tile){0}; + } +} + +void +txt_clear_line(void) { + switch (text_engine.mode) { + case TXT_MODE_TILED_BG: { + txt_clear_line_tiled(); + } break; + case TXT_MODE_MODE3: + case TXT_MODE_HYBRID: { + txt_clear_line_bitmap(); + } break; + } +} + void txt_clear_screen(void) { for (size_t j = 0; j < 20; ++j) { - for (size_t i = 0; i < 30; ++i) { - text_engine.memory[i + 32 * j] = ' '; - } + text_engine.cursor_y = j; + txt_clear_line(); } text_engine.cursor_x = 0; text_engine.cursor_y = 0; -- cgit v1.2.1