From 3491de46501c3c717035721b9b3cde6add1dde12 Mon Sep 17 00:00:00 2001 From: Adolfo Reyna Date: Sun, 18 Jan 2026 23:25:31 -0500 Subject: [PATCH] Add support to different width fonts --- app | Bin 83760 -> 103648 bytes fonts/7linedigital_font.h | 2 +- fonts/BMSPA_font.h | 2 +- fonts/Commo-Monospaced_font.h | 2 +- fonts/HUNTER_font.h | 2 +- fonts/{Minimum+1_font.h => Minimum_1_font.h} | 2 +- fonts/Raumsond_font.h | 2 +- fonts/bubblesstandard_font.h | 2 +- fonts/formplex12_font.h | 2 +- fonts/homespun_font.h | 2 +- fonts/m38_font.h | 2 +- fonts/pzim3x5_font.h | 2 +- fonts/renew_font.h | 2 +- fonts/tama_mini02_font.h | 2 +- low_level_render.cpp | 85 ++++++++++++++++--- low_level_render.h | 80 +++++++++++++++-- low_level_render.o | Bin 0 -> 26896 bytes main.cpp | 13 +-- 18 files changed, 163 insertions(+), 41 deletions(-) rename fonts/{Minimum+1_font.h => Minimum_1_font.h} (96%) create mode 100644 low_level_render.o diff --git a/app b/app index 76763701a2c7615b0d08e672060c2a675599db89..8a89bc8e9fb5601c66e3a4871ce9fd7e79eef0d7 100755 GIT binary patch delta 24031 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 HSNVSe^#N!G delta 10826 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%0AJ3-vyj zZ=v^l`F3x=IDVc@!yJd_&=}^tfW(N|FR9BY}=Seid_gnd@F)O_YMI^u}k3C zS4BgkOFXtBxJik!AK@sPPeXh1{Q|D%dj?!q_6-iMS%B?RM{+Iob~IXPz`?4=X^`aD zu*$^^t7)v-F{hp$&ql_C{Bc>=itQct{G*I<7@)(QNxDg}JxC<{hdpMLVpfR*yS2GS zqlEtjFWaZDHP>~|pd||yke2dYLr?qP_4?yG-b;4$uYKh2pJw&_@yqpp^jiMvE7lC} zwr7IYTYj2;GiXZO@TwKIleS+vheY~)fBp2M6aTq=Sl$D>&NVbf4Jhu}C%tFD@?(GY z8a=h~{gnEb@0n}+E%B2V9{BFtZy)c7zI*53gR4X0CrnTKc2cOdU&o$A%fX4;_Jw|2 zJf$^DAMQV;=9iQC5xY9S{QiaVB~#*S`Y+$HXTqbiF23+p`Of3lmu+~v{GsXBf_88MgDs9soig$8gy;#2ai3w!(o!?46C+y zP|Md;F&lpI1Jt #include #include "./fonts/5x5_font.h" -#include "./fonts/7linedigital_font.h" #include "./fonts/BMplain_font.h" #include "./fonts/Blokus_font.h" #include "./fonts/HISKYF21_font.h" @@ -15,12 +14,52 @@ #include "./fonts/haiku_font.h" #include "./fonts/sloth_font.h" #include "./fonts/zxpix_font.h" +#include "./fonts/Commo-Monospaced_font.h" +#include "./fonts/7linedigital_font.h" +#include "./fonts/BMSPA_font.h" +#include "./fonts/HUNTER_font.h" +#include "./fonts/Raumsond_font.h" +#include "./fonts/bubblesstandard_font.h" +#include "./fonts/formplex12_font.h" +#include "./fonts/homespun_font.h" +#include "./fonts/Minimum_1_font.h" +#include "./fonts/m38_font.h" +#include "./fonts/pzim3x5_font.h" +#include "./fonts/renew_font.h" +#include "./fonts/tama_mini02_font.h" + +// Font object definitions +Font font_5x5_obj(reinterpret_cast(font_5x5), 96, 6, 8); +Font font_7linedigital_obj(reinterpret_cast(font_7linedigital), 96, 4, 8); +Font font_acme_5_outlines_obj(reinterpret_cast(font_acme_5_outlines), 96, 6, 8); +Font font_aztech_obj(reinterpret_cast(font_aztech), 96, 6, 8); +Font font_BMplain_obj(reinterpret_cast(font_BMplain), 96, 6, 8); +Font font_BMSPA_obj(reinterpret_cast(font_BMSPA), 96, 8, 8); +Font font_Blokus_obj(reinterpret_cast(font_Blokus), 96, 6, 8); +Font font_bubblesstandard_obj(reinterpret_cast(font_bubblesstandard), 96, 7, 8); +Font font_Commo_Monospaced_obj(reinterpret_cast(font_Commo_Monospaced), 96, 8, 8); +Font font_crackers_obj(reinterpret_cast(font_crackers), 96, 6, 8); +Font font_formplex12_obj(reinterpret_cast(font_formplex12), 96, 8, 8); +Font font_haiku_obj(reinterpret_cast(font_haiku), 96, 6, 8); +Font font_HISKYF21_obj(reinterpret_cast(font_HISKYF21), 96, 6, 8); +Font font_homespun_obj(reinterpret_cast(font_homespun), 96, 7, 8); +Font font_HUNTER_obj(reinterpret_cast(font_HUNTER), 96, 8, 8); +Font font_m38_obj(reinterpret_cast(font_m38), 96, 8, 8); +Font font_Minimum_obj(reinterpret_cast(font_Minimum), 96, 6, 8); +Font font_Minimum_1_obj(reinterpret_cast(font_Minimum_1), 96, 7, 8); +Font font_pzim3x5_obj(reinterpret_cast(font_pzim3x5), 96, 3, 8); +Font font_Raumsond_obj(reinterpret_cast(font_Raumsond), 96, 5, 8); +Font font_renew_obj(reinterpret_cast(font_renew), 96, 7, 8); +Font font_sloth_obj(reinterpret_cast(font_sloth), 96, 6, 8); +Font font_SUPERDIG_obj(reinterpret_cast(font_SUPERDIG), 96, 6, 8); +Font font_tama_mini02_obj(reinterpret_cast(font_tama_mini02), 96, 5, 8); +Font font_zxpix_obj(reinterpret_cast(font_zxpix), 96, 6, 8); LowLevelRenderer::LowLevelRenderer(uint8_t* buffer, int width, int height) - : bit_buffer(buffer), V_WIDTH(width), V_HEIGHT(height), current_font(&font_acme_5_outlines), + : bit_buffer(buffer), V_WIDTH(width), V_HEIGHT(height), current_font(nullptr), clipping_enabled(false), clip_x(0), clip_y(0), clip_width(width), clip_height(height), text_color(true) {} -void LowLevelRenderer::set_font(const unsigned char (*font)[96][6]) { +void LowLevelRenderer::set_font(const Font* font) { current_font = font; } @@ -488,19 +527,26 @@ void LowLevelRenderer::draw_filled_circle(int x, int y, int radius, bool on) void LowLevelRenderer::draw_char_vcol(int x, int y, char c) { + if (!current_font) return; + // The font table starts at space (ASCII 32) if (c < 32 || c > 127) return; int font_idx = c - 32; - for (int col = 0; col < 6; col++) - { - unsigned char column_byte = (*current_font)[font_idx][col]; + const unsigned char* char_data = current_font->get_char_data(font_idx); + if (!char_data) return; - for (int row = 0; row < 8; row++) + int bytes_per_char = current_font->get_bytes_per_char(); + int char_height = current_font->get_char_height(); + + for (int col = 0; col < bytes_per_char; col++) + { + unsigned char column_byte = char_data[col]; + + for (int row = 0; row < char_height; row++) { // Check if the bit for this row is set - // Most of these 1-bit fonts use bit 0 as the top pixel if (column_byte & (1 << row)) { set_pixel(x + col, y + row, text_color); @@ -511,26 +557,35 @@ void LowLevelRenderer::draw_char_vcol(int x, int y, char c) void LowLevelRenderer::draw_string(int x, int y, const std::string &text, int spacing) { + if (!current_font) return; + int char_width = current_font->get_bytes_per_char(); for (size_t i = 0; i < text.length(); i++) { - draw_char_vcol(x + (i * (6 + spacing)), y, text[i]); + draw_char_vcol(x + (i * (char_width + spacing)), y, text[i]); } } void LowLevelRenderer::draw_char_scaled(int x, int y, char c, int scale) { + if (!current_font) return; + if (c < 32 || c > 127) return; if (scale < 1) scale = 1; // Safety check int font_idx = c - 32; + const unsigned char* char_data = current_font->get_char_data(font_idx); + if (!char_data) return; - for (int col = 0; col < 6; col++) + int bytes_per_char = current_font->get_bytes_per_char(); + int char_height = current_font->get_char_height(); + + for (int col = 0; col < bytes_per_char; col++) { - unsigned char column_byte = (*current_font)[font_idx][col]; + unsigned char column_byte = char_data[col]; - for (int row = 0; row < 8; row++) + for (int row = 0; row < char_height; row++) { if (column_byte & (1 << row)) { @@ -551,11 +606,13 @@ void LowLevelRenderer::draw_char_scaled(int x, int y, char c, int scale) void LowLevelRenderer::draw_string_scaled(int x, int y, const char* text, int scale, int spacing) { + if (!current_font) return; + int char_width = current_font->get_bytes_per_char(); int i = 0; while(text[i] != '\0') { - // We multiply the character width (6) and spacing by the scale - int next_x = x + (i * (6 + spacing) * scale); + // We multiply the character width and spacing by the scale + int next_x = x + (i * (char_width + spacing) * scale); draw_char_scaled(next_x, y, text[i], scale); i++; } diff --git a/low_level_render.h b/low_level_render.h index 8edc0c6..fe725ec 100644 --- a/low_level_render.h +++ b/low_level_render.h @@ -12,27 +12,91 @@ #include #include +// Font class that holds font data and dimensions +class Font { +private: + const unsigned char* data; + int num_chars; + int bytes_per_char; + int char_height; + +public: + Font(const unsigned char* font_data, int num_chars, int bytes_per_char, int char_height) + : data(font_data), num_chars(num_chars), bytes_per_char(bytes_per_char), + char_height(char_height) {} + + const unsigned char* get_data() const { return data; } + int get_num_chars() const { return num_chars; } + int get_bytes_per_char() const { return bytes_per_char; } + int get_char_height() const { return char_height; } + + // Get a specific character's data + const unsigned char* get_char_data(int char_index) const { + if (char_index < 0 || char_index >= num_chars) return nullptr; + return data + (char_index * bytes_per_char); + } +}; + // Font extern declarations extern const unsigned char font_5x5[96][6]; -extern const unsigned char font_7linedigital[96][6]; -extern const unsigned char font_BMplain[96][6]; -extern const unsigned char font_Blokus[96][6]; -extern const unsigned char font_HISKYF21[96][6]; -extern const unsigned char font_Minimum[96][6]; -extern const unsigned char font_SUPERDIG[96][6]; +extern const unsigned char font_7linedigital[96][4]; extern const unsigned char font_acme_5_outlines[96][6]; extern const unsigned char font_aztech[96][6]; +extern const unsigned char font_BMplain[96][6]; +extern const unsigned char font_BMSPA[96][8]; +extern const unsigned char font_Blokus[96][6]; +extern const unsigned char font_bubblesstandard[96][7]; +extern const unsigned char font_Commo_Monospaced[96][8]; extern const unsigned char font_crackers[96][6]; +extern const unsigned char font_formplex12[96][8]; extern const unsigned char font_haiku[96][6]; +extern const unsigned char font_HISKYF21[96][6]; +extern const unsigned char font_homespun[96][7]; +extern const unsigned char font_HUNTER[96][8]; +extern const unsigned char font_m38[96][8]; +extern const unsigned char font_Minimum[96][6]; +extern const unsigned char font_Minimum_1[96][7]; +extern const unsigned char font_pzim3x5[96][3]; +extern const unsigned char font_Raumsond[96][5]; +extern const unsigned char font_renew[96][7]; extern const unsigned char font_sloth[96][6]; +extern const unsigned char font_SUPERDIG[96][6]; +extern const unsigned char font_tama_mini02[96][5]; extern const unsigned char font_zxpix[96][6]; +// Font object declarations +extern Font font_5x5_obj; +extern Font font_7linedigital_obj; +extern Font font_acme_5_outlines_obj; +extern Font font_aztech_obj; +extern Font font_BMplain_obj; +extern Font font_BMSPA_obj; +extern Font font_Blokus_obj; +extern Font font_bubblesstandard_obj; +extern Font font_Commo_Monospaced_obj; +extern Font font_crackers_obj; +extern Font font_formplex12_obj; +extern Font font_haiku_obj; +extern Font font_HISKYF21_obj; +extern Font font_homespun_obj; +extern Font font_HUNTER_obj; +extern Font font_m38_obj; +extern Font font_Minimum_obj; +extern Font font_Minimum_1_obj; +extern Font font_pzim3x5_obj; +extern Font font_Raumsond_obj; +extern Font font_renew_obj; +extern Font font_sloth_obj; +extern Font font_SUPERDIG_obj; +extern Font font_tama_mini02_obj; +extern Font font_zxpix_obj; + class LowLevelRenderer { private: uint8_t* bit_buffer; int V_WIDTH; int V_HEIGHT; - const unsigned char (*current_font)[96][6]; + const Font* current_font; bool clipping_enabled; int clip_x, clip_y, clip_width, clip_height; bool text_color; @@ -45,7 +109,7 @@ public: LowLevelRenderer(uint8_t* buffer, int width, int height); // Font management - void set_font(const unsigned char (*font)[96][6]); + void set_font(const Font* font); void set_text_color(bool color); // --- 1-BIT DRAWING PRIMITIVES --- diff --git a/low_level_render.o b/low_level_render.o new file mode 100644 index 0000000000000000000000000000000000000000..9c4697c00c3a017879d94d85e6cf500b6c04ea46 GIT binary patch literal 26896 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 literal 0 HcmV?d00001 diff --git a/main.cpp b/main.cpp index 858e1ba..b771d33 100644 --- a/main.cpp +++ b/main.cpp @@ -146,14 +146,15 @@ int main() renderer.set_clip_rect(300, 200, 80, 60); // Small rectangle in bottom-right renderer.draw_filled_circle(340, 230, 40, true); // Circle that extends outside clip rect renderer.reset_clip_rect(); // Reset to full screen - - // Text with different fonts - renderer.set_font(&font_acme_5_outlines); - renderer.draw_string_scaled(10, 10, "Drawing Demo", 2); - */ - renderer.set_font(&font_SUPERDIG); + // Text with different fonts + renderer.set_font(&font_HISKYF21_obj); + renderer.draw_string_scaled(10, 10, "Drawing Demo", 2); + + + + renderer.set_font(&font_SUPERDIG_obj); renderer.draw_string_scaled(10, 270, command_buffer, 1);