From cd02860fc1efbc1ff37d0f1b502d88ac8489351c Mon Sep 17 00:00:00 2001 From: Hannu Hartikainen Date: Wed, 18 Aug 2021 16:03:02 +0300 Subject: [PATCH] gterm: expand font 9th column like VGA Implement column expansion like VGA Line Graphics Mode does it, e.g. the 8th column is replicated for characters 0xC0-0xDF. Do this for all columns above 8 so font sizes like 10x16 are also usable. --- stage23/lib/gterm.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/stage23/lib/gterm.c b/stage23/lib/gterm.c index 3fbdffbd..cdfad0e5 100644 --- a/stage23/lib/gterm.c +++ b/stage23/lib/gterm.c @@ -698,15 +698,15 @@ bool gterm_init(size_t *_rows, size_t *_cols, size_t width, size_t height) { if (vga_font_bool == NULL || menu_font != NULL) { vga_font_bool = ext_mem_alloc(VGA_FONT_GLYPHS * vga_font_height * vga_font_width * sizeof(bool)); + size_t bitwidth = vga_font_width > 8 ? 8 : vga_font_width; for (size_t i = 0; i < VGA_FONT_GLYPHS; i++) { uint8_t *glyph = &vga_font_bits[i * vga_font_height]; for (size_t y = 0; y < vga_font_height; y++) { - // NOTE: the characters in VGA fonts are always at most - // one byte wide. 9 dot wide fonts have 8 dots and one - // empty column, except characters 0xC0-0xDF replicate - // column 9 in Line Graphics Mode. (TODO: implement that) - for (size_t x = 0; x < vga_font_width; x++) { + // NOTE: the characters in VGA fonts are always one byte wide. + // 9 dot wide fonts have 8 dots and one empty column, except + // characters 0xC0-0xDF replicate column 9. + for (size_t x = 0; x < bitwidth; x++) { size_t offset = i * vga_font_height * vga_font_width + y * vga_font_width + x; if ((glyph[y] & (0x80 >> x))) { @@ -715,6 +715,16 @@ bool gterm_init(size_t *_rows, size_t *_cols, size_t width, size_t height) { vga_font_bool[offset] = false; } } + // fill columns above 8 like VGA Line Graphics Mode does + for (size_t x = 8; x < vga_font_width; x++) { + size_t offset = i * vga_font_height * vga_font_width + y * vga_font_width + x; + + if (i >= 0xC0 && i <= 0xDF) { + vga_font_bool[offset] = (glyph[y] & 1); + } else { + vga_font_bool[offset] = false; + } + } } } }