From 520c5d734315840ef45e3866085a1ca6658a5c1b Mon Sep 17 00:00:00 2001 From: reugenio Date: Wed, 10 Dec 2025 01:03:02 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=8C=8D=20Font=20Latin-1=20completo=20para?= =?UTF-8?q?=20soporte=20espa=C3=B1ol/europeo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Nuevo font_data.zig con datos de glifos separados - font_8x8_ascii: ASCII básico (32-126) - font_8x8_latin1: Latin-1 completo (32-255) - Soporte español: ñ, Ñ, á, é, í, ó, ú, ü, ¿, ¡ - Soporte europeo: français, deutsch, português, italiano - Exports: default_font_latin1, font_data 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- src/render/font.zig | 226 +++--------------- src/render/font_data.zig | 499 +++++++++++++++++++++++++++++++++++++++ src/zcatgui.zig | 2 + 3 files changed, 528 insertions(+), 199 deletions(-) create mode 100644 src/render/font_data.zig diff --git a/src/render/font.zig b/src/render/font.zig index f295647..47bc4ce 100644 --- a/src/render/font.zig +++ b/src/render/font.zig @@ -1,10 +1,18 @@ //! Font - Bitmap font rendering //! -//! Simple bitmap font for basic text rendering. -//! For TTF support, see ttf.zig. +//! Bitmap font support with multiple character sets: +//! - ASCII (32-126): Basic English characters +//! - Latin-1 (32-255): Full Western European (Spanish, French, German, etc.) +//! +//! Available fonts: +//! - default_font: 8x8 ASCII (95 chars) - lightweight +//! - default_font_latin1: 8x8 Latin-1 (224 chars) - Spanish/European support +//! +//! For TrueType font support, see ttf.zig. const std = @import("std"); pub const ttf = @import("ttf.zig"); +pub const font_data = @import("font_data.zig"); const Style = @import("../core/style.zig"); const Layout = @import("../core/layout.zig"); @@ -119,212 +127,32 @@ pub const Font = struct { }; // ============================================================================= -// Built-in 8x8 font +// Built-in Bitmap Fonts // ============================================================================= -/// Simple 8x8 bitmap font (ASCII 32-126) +/// 8x8 ASCII font (characters 32-126) +/// Lightweight font for basic English text. +/// Use default_font_latin1 for Spanish/European language support. pub const default_font = Font{ - .glyphs = &default_font_data, + .glyphs = &font_data.font_8x8_ascii, .char_width = 8, .char_height = 8, .first_char = 32, .num_chars = 95, }; -// 8x8 font data for ASCII 32-126 (complete font) -// Each character is 8 bytes (8 rows, 1 byte per row) -// Based on classic PC BIOS font -const default_font_data = [95 * 8]u8{ - // Space (32) - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // ! (33) - 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00, - // " (34) - 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, - // # (35) - 0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, - // $ (36) - 0x18, 0x7E, 0xC0, 0x7C, 0x06, 0xFC, 0x18, 0x00, - // % (37) - 0x00, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xC6, 0x00, - // & (38) - 0x38, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0x76, 0x00, - // ' (39) - 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - // ( (40) - 0x0C, 0x18, 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00, - // ) (41) - 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, - // * (42) - 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00, - // + (43) - 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, - // , (44) - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, - // - (45) - 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, - // . (46) - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, - // / (47) - 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00, - // 0 (48) - 0x7C, 0xCE, 0xDE, 0xF6, 0xE6, 0xC6, 0x7C, 0x00, - // 1 (49) - 0x18, 0x38, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, - // 2 (50) - 0x7C, 0xC6, 0x06, 0x7C, 0xC0, 0xC0, 0xFE, 0x00, - // 3 (51) - 0x7C, 0xC6, 0x06, 0x3C, 0x06, 0xC6, 0x7C, 0x00, - // 4 (52) - 0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x0C, 0x00, - // 5 (53) - 0xFE, 0xC0, 0xFC, 0x06, 0x06, 0xC6, 0x7C, 0x00, - // 6 (54) - 0x7C, 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0x7C, 0x00, - // 7 (55) - 0xFE, 0x06, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00, - // 8 (56) - 0x7C, 0xC6, 0xC6, 0x7C, 0xC6, 0xC6, 0x7C, 0x00, - // 9 (57) - 0x7C, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x7C, 0x00, - // : (58) - 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, - // ; (59) - 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x30, - // < (60) - 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0C, 0x00, - // = (61) - 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00, - // > (62) - 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30, 0x00, - // ? (63) - 0x7C, 0xC6, 0x0C, 0x18, 0x18, 0x00, 0x18, 0x00, - // @ (64) - 0x7C, 0xC6, 0xDE, 0xDE, 0xDE, 0xC0, 0x7C, 0x00, - // A (65) - 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, - // B (66) - 0xFC, 0xC6, 0xC6, 0xFC, 0xC6, 0xC6, 0xFC, 0x00, - // C (67) - 0x7C, 0xC6, 0xC0, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, - // D (68) - 0xF8, 0xCC, 0xC6, 0xC6, 0xC6, 0xCC, 0xF8, 0x00, - // E (69) - 0xFE, 0xC0, 0xC0, 0xF8, 0xC0, 0xC0, 0xFE, 0x00, - // F (70) - 0xFE, 0xC0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0, 0x00, - // G (71) - 0x7C, 0xC6, 0xC0, 0xCE, 0xC6, 0xC6, 0x7E, 0x00, - // H (72) - 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, - // I (73) - 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, - // J (74) - 0x06, 0x06, 0x06, 0x06, 0x06, 0xC6, 0x7C, 0x00, - // K (75) - 0xC6, 0xCC, 0xD8, 0xF0, 0xD8, 0xCC, 0xC6, 0x00, - // L (76) - 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, - // M (77) - 0xC6, 0xEE, 0xFE, 0xD6, 0xC6, 0xC6, 0xC6, 0x00, - // N (78) - 0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00, - // O (79) - 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, - // P (80) - 0xFC, 0xC6, 0xC6, 0xFC, 0xC0, 0xC0, 0xC0, 0x00, - // Q (81) - 0x7C, 0xC6, 0xC6, 0xC6, 0xD6, 0xDE, 0x7C, 0x06, - // R (82) - 0xFC, 0xC6, 0xC6, 0xFC, 0xD8, 0xCC, 0xC6, 0x00, - // S (83) - 0x7C, 0xC6, 0xC0, 0x7C, 0x06, 0xC6, 0x7C, 0x00, - // T (84) - 0xFE, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, - // U (85) - 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, - // V (86) - 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, - // W (87) - 0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0xEE, 0xC6, 0x00, - // X (88) - 0xC6, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0xC6, 0x00, - // Y (89) - 0xC6, 0xC6, 0x6C, 0x38, 0x18, 0x18, 0x18, 0x00, - // Z (90) - 0xFE, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xFE, 0x00, - // [ (91) - 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00, - // \ (92) - 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x02, 0x00, - // ] (93) - 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, 0x00, - // ^ (94) - 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00, - // _ (95) - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, - // ` (96) - 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, - // a (97) - 0x00, 0x00, 0x7C, 0x06, 0x7E, 0xC6, 0x7E, 0x00, - // b (98) - 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xFC, 0x00, - // c (99) - 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC6, 0x7C, 0x00, - // d (100) - 0x06, 0x06, 0x7E, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, - // e (101) - 0x00, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0x7C, 0x00, - // f (102) - 0x1C, 0x36, 0x30, 0x78, 0x30, 0x30, 0x30, 0x00, - // g (103) - 0x00, 0x00, 0x7E, 0xC6, 0xC6, 0x7E, 0x06, 0x7C, - // h (104) - 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, - // i (105) - 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00, - // j (106) - 0x0C, 0x00, 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0x78, - // k (107) - 0xC0, 0xC0, 0xCC, 0xD8, 0xF0, 0xD8, 0xCC, 0x00, - // l (108) - 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, - // m (109) - 0x00, 0x00, 0xEC, 0xFE, 0xD6, 0xC6, 0xC6, 0x00, - // n (110) - 0x00, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, - // o (111) - 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, - // p (112) - 0x00, 0x00, 0xFC, 0xC6, 0xC6, 0xFC, 0xC0, 0xC0, - // q (113) - 0x00, 0x00, 0x7E, 0xC6, 0xC6, 0x7E, 0x06, 0x06, - // r (114) - 0x00, 0x00, 0xDC, 0xE6, 0xC0, 0xC0, 0xC0, 0x00, - // s (115) - 0x00, 0x00, 0x7E, 0xC0, 0x7C, 0x06, 0xFC, 0x00, - // t (116) - 0x30, 0x30, 0x7C, 0x30, 0x30, 0x36, 0x1C, 0x00, - // u (117) - 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, - // v (118) - 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00, - // w (119) - 0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00, - // x (120) - 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00, - // y (121) - 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x7C, - // z (122) - 0x00, 0x00, 0xFE, 0x0C, 0x38, 0x60, 0xFE, 0x00, - // { (123) - 0x0E, 0x18, 0x18, 0x70, 0x18, 0x18, 0x0E, 0x00, - // | (124) - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, - // } (125) - 0x70, 0x18, 0x18, 0x0E, 0x18, 0x18, 0x70, 0x00, - // ~ (126) - 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/// 8x8 Latin-1 font (characters 32-255) +/// Full Western European character support including: +/// - Spanish: ñ, Ñ, á, é, í, ó, ú, ü, ¿, ¡ +/// - French: é, è, ê, ë, à, â, ç, etc. +/// - German: ä, ö, ü, ß +/// - Portuguese, Italian, and more +pub const default_font_latin1 = Font{ + .glyphs = &font_data.font_8x8_latin1, + .char_width = 8, + .char_height = 8, + .first_char = 32, + .num_chars = 224, // 32-255 }; // ============================================================================= diff --git a/src/render/font_data.zig b/src/render/font_data.zig new file mode 100644 index 0000000..d5ae8a8 --- /dev/null +++ b/src/render/font_data.zig @@ -0,0 +1,499 @@ +//! Font Data - Bitmap font glyph data +//! +//! Contains glyph data for various bitmap fonts: +//! - 8x8 ASCII (32-126) - Basic ASCII +//! - 8x8 Latin-1 (32-255) - Full Western European (Spanish, French, German, etc.) +//! - 8x16 Latin-1 - Taller, more readable font +//! +//! All fonts use 1-bit-per-pixel format (packed into bytes, MSB first). + +// ============================================================================= +// 8x8 ASCII Font (32-126) - 95 characters +// ============================================================================= + +/// 8x8 ASCII font data (characters 32-126) +/// Each character is 8 bytes (8 rows, 1 byte per row, MSB = leftmost pixel) +pub const font_8x8_ascii = [95 * 8]u8{ + // Space (32) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // ! (33) + 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00, + // " (34) + 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, + // # (35) + 0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, + // $ (36) + 0x18, 0x7E, 0xC0, 0x7C, 0x06, 0xFC, 0x18, 0x00, + // % (37) + 0x00, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xC6, 0x00, + // & (38) + 0x38, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0x76, 0x00, + // ' (39) + 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + // ( (40) + 0x0C, 0x18, 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00, + // ) (41) + 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, + // * (42) + 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00, + // + (43) + 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, + // , (44) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, + // - (45) + 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, + // . (46) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, + // / (47) + 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00, + // 0 (48) + 0x7C, 0xCE, 0xDE, 0xF6, 0xE6, 0xC6, 0x7C, 0x00, + // 1 (49) + 0x18, 0x38, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, + // 2 (50) + 0x7C, 0xC6, 0x06, 0x7C, 0xC0, 0xC0, 0xFE, 0x00, + // 3 (51) + 0x7C, 0xC6, 0x06, 0x3C, 0x06, 0xC6, 0x7C, 0x00, + // 4 (52) + 0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x0C, 0x00, + // 5 (53) + 0xFE, 0xC0, 0xFC, 0x06, 0x06, 0xC6, 0x7C, 0x00, + // 6 (54) + 0x7C, 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0x7C, 0x00, + // 7 (55) + 0xFE, 0x06, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00, + // 8 (56) + 0x7C, 0xC6, 0xC6, 0x7C, 0xC6, 0xC6, 0x7C, 0x00, + // 9 (57) + 0x7C, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x7C, 0x00, + // : (58) + 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, + // ; (59) + 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x30, + // < (60) + 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0C, 0x00, + // = (61) + 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00, + // > (62) + 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30, 0x00, + // ? (63) + 0x7C, 0xC6, 0x0C, 0x18, 0x18, 0x00, 0x18, 0x00, + // @ (64) + 0x7C, 0xC6, 0xDE, 0xDE, 0xDE, 0xC0, 0x7C, 0x00, + // A (65) + 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, + // B (66) + 0xFC, 0xC6, 0xC6, 0xFC, 0xC6, 0xC6, 0xFC, 0x00, + // C (67) + 0x7C, 0xC6, 0xC0, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, + // D (68) + 0xF8, 0xCC, 0xC6, 0xC6, 0xC6, 0xCC, 0xF8, 0x00, + // E (69) + 0xFE, 0xC0, 0xC0, 0xF8, 0xC0, 0xC0, 0xFE, 0x00, + // F (70) + 0xFE, 0xC0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0, 0x00, + // G (71) + 0x7C, 0xC6, 0xC0, 0xCE, 0xC6, 0xC6, 0x7E, 0x00, + // H (72) + 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, + // I (73) + 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, + // J (74) + 0x06, 0x06, 0x06, 0x06, 0x06, 0xC6, 0x7C, 0x00, + // K (75) + 0xC6, 0xCC, 0xD8, 0xF0, 0xD8, 0xCC, 0xC6, 0x00, + // L (76) + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, + // M (77) + 0xC6, 0xEE, 0xFE, 0xD6, 0xC6, 0xC6, 0xC6, 0x00, + // N (78) + 0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00, + // O (79) + 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, + // P (80) + 0xFC, 0xC6, 0xC6, 0xFC, 0xC0, 0xC0, 0xC0, 0x00, + // Q (81) + 0x7C, 0xC6, 0xC6, 0xC6, 0xD6, 0xDE, 0x7C, 0x06, + // R (82) + 0xFC, 0xC6, 0xC6, 0xFC, 0xD8, 0xCC, 0xC6, 0x00, + // S (83) + 0x7C, 0xC6, 0xC0, 0x7C, 0x06, 0xC6, 0x7C, 0x00, + // T (84) + 0xFE, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, + // U (85) + 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, + // V (86) + 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, + // W (87) + 0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0xEE, 0xC6, 0x00, + // X (88) + 0xC6, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0xC6, 0x00, + // Y (89) + 0xC6, 0xC6, 0x6C, 0x38, 0x18, 0x18, 0x18, 0x00, + // Z (90) + 0xFE, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xFE, 0x00, + // [ (91) + 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00, + // \ (92) + 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x02, 0x00, + // ] (93) + 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, 0x00, + // ^ (94) + 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00, + // _ (95) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, + // ` (96) + 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, + // a (97) + 0x00, 0x00, 0x7C, 0x06, 0x7E, 0xC6, 0x7E, 0x00, + // b (98) + 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xFC, 0x00, + // c (99) + 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC6, 0x7C, 0x00, + // d (100) + 0x06, 0x06, 0x7E, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, + // e (101) + 0x00, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0x7C, 0x00, + // f (102) + 0x1C, 0x36, 0x30, 0x78, 0x30, 0x30, 0x30, 0x00, + // g (103) + 0x00, 0x00, 0x7E, 0xC6, 0xC6, 0x7E, 0x06, 0x7C, + // h (104) + 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, + // i (105) + 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00, + // j (106) + 0x0C, 0x00, 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0x78, + // k (107) + 0xC0, 0xC0, 0xCC, 0xD8, 0xF0, 0xD8, 0xCC, 0x00, + // l (108) + 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, + // m (109) + 0x00, 0x00, 0xEC, 0xFE, 0xD6, 0xC6, 0xC6, 0x00, + // n (110) + 0x00, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, + // o (111) + 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, + // p (112) + 0x00, 0x00, 0xFC, 0xC6, 0xC6, 0xFC, 0xC0, 0xC0, + // q (113) + 0x00, 0x00, 0x7E, 0xC6, 0xC6, 0x7E, 0x06, 0x06, + // r (114) + 0x00, 0x00, 0xDC, 0xE6, 0xC0, 0xC0, 0xC0, 0x00, + // s (115) + 0x00, 0x00, 0x7E, 0xC0, 0x7C, 0x06, 0xFC, 0x00, + // t (116) + 0x30, 0x30, 0x7C, 0x30, 0x30, 0x36, 0x1C, 0x00, + // u (117) + 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, + // v (118) + 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00, + // w (119) + 0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00, + // x (120) + 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00, + // y (121) + 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x7C, + // z (122) + 0x00, 0x00, 0xFE, 0x0C, 0x38, 0x60, 0xFE, 0x00, + // { (123) + 0x0E, 0x18, 0x18, 0x70, 0x18, 0x18, 0x0E, 0x00, + // | (124) + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, + // } (125) + 0x70, 0x18, 0x18, 0x0E, 0x18, 0x18, 0x70, 0x00, + // ~ (126) + 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +// ============================================================================= +// 8x8 Latin-1 Extended Font (128-255) - 128 additional characters +// ============================================================================= + +/// 8x8 Latin-1 extended characters (128-255) +/// Includes Spanish: ñ, Ñ, á, é, í, ó, ú, Á, É, Í, Ó, Ú, ü, Ü, ¿, ¡ +/// Also French, German, Portuguese, Italian accented characters +pub const font_8x8_latin1_ext = [128 * 8]u8{ + // 128-159: Control characters / special (we'll use for useful symbols) + // 128: Euro sign (€) - commonly used + 0x00, 0x3C, 0x66, 0xF8, 0x60, 0xF8, 0x66, 0x3C, + // 129: unused + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 130: single low quote (‚) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, + // 131: florin (ƒ) + 0x0E, 0x18, 0x18, 0x3C, 0x18, 0x18, 0x70, 0x00, + // 132: double low quote („) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x6C, 0xD8, + // 133: ellipsis (…) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD6, 0x00, + // 134: dagger (†) + 0x18, 0x18, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x00, + // 135: double dagger (‡) + 0x18, 0x18, 0x7E, 0x18, 0x7E, 0x18, 0x18, 0x00, + // 136: circumflex (ˆ) + 0x18, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, + // 137: per mille (‰) + 0xC0, 0xC6, 0x0C, 0x18, 0x30, 0x6B, 0xDB, 0x00, + // 138: S caron (Š) + 0x6C, 0x38, 0x7C, 0xC0, 0x7C, 0x06, 0xFC, 0x00, + // 139: single left angle quote (‹) + 0x00, 0x00, 0x18, 0x30, 0x60, 0x30, 0x18, 0x00, + // 140: OE ligature (Œ) + 0x00, 0x7E, 0xDB, 0xD8, 0xDE, 0xDB, 0x7E, 0x00, + // 141: unused + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 142: Z caron (Ž) + 0x6C, 0x38, 0xFE, 0x0C, 0x18, 0x30, 0xFE, 0x00, + // 143: unused + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 144: unused + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 145: left single quote (') + 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, + // 146: right single quote (') + 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, + // 147: left double quote (") + 0x6C, 0x36, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, + // 148: right double quote (") + 0x36, 0x6C, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, + // 149: bullet (•) + 0x00, 0x00, 0x00, 0x3C, 0x3C, 0x00, 0x00, 0x00, + // 150: en dash (–) + 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, + // 151: em dash (—) + 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, + // 152: tilde (˜) + 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, + // 153: trademark (™) + 0xFE, 0x92, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, + // 154: s caron (š) + 0x6C, 0x38, 0x00, 0x7C, 0xC0, 0x7C, 0x06, 0xFC, + // 155: single right angle quote (›) + 0x00, 0x00, 0x30, 0x18, 0x0C, 0x18, 0x30, 0x00, + // 156: oe ligature (œ) + 0x00, 0x00, 0x7E, 0xDB, 0xDF, 0xD8, 0x7E, 0x00, + // 157: unused + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 158: z caron (ž) + 0x6C, 0x38, 0x00, 0xFE, 0x18, 0x30, 0xFE, 0x00, + // 159: Y diaeresis (Ÿ) + 0x6C, 0x00, 0xC6, 0xC6, 0x6C, 0x38, 0x18, 0x18, + + // 160: Non-breaking space + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 161: Inverted exclamation (¡) - SPANISH + 0x18, 0x00, 0x18, 0x18, 0x3C, 0x3C, 0x18, 0x00, + // 162: Cent sign (¢) + 0x00, 0x18, 0x7E, 0xC0, 0xC0, 0x7E, 0x18, 0x00, + // 163: Pound sign (£) + 0x38, 0x6C, 0x60, 0xF0, 0x60, 0x66, 0xFE, 0x00, + // 164: Currency sign (¤) + 0x00, 0xC6, 0x7C, 0xC6, 0xC6, 0x7C, 0xC6, 0x00, + // 165: Yen sign (¥) + 0xC6, 0xC6, 0x6C, 0x38, 0x7C, 0x18, 0x18, 0x00, + // 166: Broken bar (¦) + 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00, + // 167: Section sign (§) + 0x3C, 0x60, 0x3C, 0x66, 0x3C, 0x06, 0x3C, 0x00, + // 168: Diaeresis (¨) + 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 169: Copyright (©) + 0x3C, 0x42, 0x99, 0xA1, 0xA1, 0x99, 0x42, 0x3C, + // 170: Feminine ordinal (ª) + 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, 0x3E, 0x00, + // 171: Left double angle quote («) + 0x00, 0x36, 0x6C, 0xD8, 0x6C, 0x36, 0x00, 0x00, + // 172: Not sign (¬) + 0x00, 0x00, 0x00, 0xFE, 0x06, 0x06, 0x00, 0x00, + // 173: Soft hyphen + 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, + // 174: Registered (®) + 0x3C, 0x42, 0xB9, 0xA5, 0xB9, 0xA5, 0x42, 0x3C, + // 175: Macron (¯) + 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 176: Degree (°) + 0x38, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, + // 177: Plus-minus (±) + 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x7E, + // 178: Superscript 2 (²) + 0x38, 0x0C, 0x18, 0x30, 0x3C, 0x00, 0x00, 0x00, + // 179: Superscript 3 (³) + 0x38, 0x0C, 0x18, 0x0C, 0x38, 0x00, 0x00, 0x00, + // 180: Acute accent (´) + 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, + // 181: Micro (µ) + 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xFE, 0xC0, 0xC0, + // 182: Pilcrow (¶) + 0x7E, 0xDB, 0xDB, 0x7E, 0x1B, 0x1B, 0x1B, 0x00, + // 183: Middle dot (·) + 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, + // 184: Cedilla (¸) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0C, 0x38, + // 185: Superscript 1 (¹) + 0x18, 0x38, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, + // 186: Masculine ordinal (º) + 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x7C, 0x00, 0x00, + // 187: Right double angle quote (») + 0x00, 0xD8, 0x6C, 0x36, 0x6C, 0xD8, 0x00, 0x00, + // 188: One quarter (¼) + 0xC3, 0xC6, 0xCC, 0xDB, 0x37, 0x6F, 0xCF, 0x03, + // 189: One half (½) + 0xC3, 0xC6, 0xCC, 0xDE, 0x33, 0x66, 0xCC, 0x0F, + // 190: Three quarters (¾) + 0xC3, 0x66, 0xCC, 0x6B, 0x37, 0x6F, 0xCF, 0x03, + // 191: Inverted question (¿) - SPANISH + 0x18, 0x00, 0x18, 0x30, 0x60, 0xC6, 0x7C, 0x00, + + // 192: A grave (À) + 0x30, 0x18, 0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0x00, + // 193: A acute (Á) - SPANISH + 0x0C, 0x18, 0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0x00, + // 194: A circumflex (Â) + 0x38, 0x6C, 0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0x00, + // 195: A tilde (Ã) + 0x76, 0xDC, 0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0x00, + // 196: A diaeresis (Ä) + 0x6C, 0x00, 0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0x00, + // 197: A ring (Å) + 0x38, 0x6C, 0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0x00, + // 198: AE (Æ) + 0x3E, 0x6C, 0xCC, 0xFE, 0xCC, 0xCC, 0xCE, 0x00, + // 199: C cedilla (Ç) + 0x7C, 0xC6, 0xC0, 0xC0, 0xC6, 0x7C, 0x0C, 0x38, + // 200: E grave (È) + 0x30, 0x18, 0xFE, 0xC0, 0xF8, 0xC0, 0xFE, 0x00, + // 201: E acute (É) - SPANISH + 0x0C, 0x18, 0xFE, 0xC0, 0xF8, 0xC0, 0xFE, 0x00, + // 202: E circumflex (Ê) + 0x38, 0x6C, 0xFE, 0xC0, 0xF8, 0xC0, 0xFE, 0x00, + // 203: E diaeresis (Ë) + 0x6C, 0x00, 0xFE, 0xC0, 0xF8, 0xC0, 0xFE, 0x00, + // 204: I grave (Ì) + 0x30, 0x18, 0x7E, 0x18, 0x18, 0x18, 0x7E, 0x00, + // 205: I acute (Í) - SPANISH + 0x0C, 0x18, 0x7E, 0x18, 0x18, 0x18, 0x7E, 0x00, + // 206: I circumflex (Î) + 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x7E, 0x00, + // 207: I diaeresis (Ï) + 0x6C, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x7E, 0x00, + // 208: Eth (Ð) + 0xF8, 0x6C, 0x66, 0xF6, 0x66, 0x6C, 0xF8, 0x00, + // 209: N tilde (Ñ) - SPANISH + 0x76, 0xDC, 0x00, 0xC6, 0xF6, 0xDE, 0xC6, 0x00, + // 210: O grave (Ò) + 0x30, 0x18, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, + // 211: O acute (Ó) - SPANISH + 0x0C, 0x18, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, + // 212: O circumflex (Ô) + 0x38, 0x6C, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, + // 213: O tilde (Õ) + 0x76, 0xDC, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, + // 214: O diaeresis (Ö) + 0x6C, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, + // 215: Multiplication (×) + 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00, 0x00, + // 216: O stroke (Ø) + 0x3E, 0x66, 0x6E, 0x7E, 0x76, 0x66, 0x7C, 0x00, + // 217: U grave (Ù) + 0x30, 0x18, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, + // 218: U acute (Ú) - SPANISH + 0x0C, 0x18, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, + // 219: U circumflex (Û) + 0x38, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, + // 220: U diaeresis (Ü) - SPANISH + 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, + // 221: Y acute (Ý) + 0x0C, 0x18, 0xC6, 0x6C, 0x38, 0x18, 0x18, 0x00, + // 222: Thorn (Þ) + 0xC0, 0xC0, 0xFC, 0xC6, 0xFC, 0xC0, 0xC0, 0x00, + // 223: Sharp s (ß) - German + 0x78, 0xCC, 0xCC, 0xD8, 0xCC, 0xC6, 0xCC, 0x00, + + // 224: a grave (à) + 0x30, 0x18, 0x00, 0x7C, 0x06, 0x7E, 0x7E, 0x00, + // 225: a acute (á) - SPANISH + 0x0C, 0x18, 0x00, 0x7C, 0x06, 0x7E, 0x7E, 0x00, + // 226: a circumflex (â) + 0x38, 0x6C, 0x00, 0x7C, 0x06, 0x7E, 0x7E, 0x00, + // 227: a tilde (ã) + 0x76, 0xDC, 0x00, 0x7C, 0x06, 0x7E, 0x7E, 0x00, + // 228: a diaeresis (ä) + 0x6C, 0x00, 0x00, 0x7C, 0x06, 0x7E, 0x7E, 0x00, + // 229: a ring (å) + 0x38, 0x6C, 0x38, 0x7C, 0x06, 0x7E, 0x7E, 0x00, + // 230: ae (æ) + 0x00, 0x00, 0x7E, 0x1B, 0x7F, 0xD8, 0x7E, 0x00, + // 231: c cedilla (ç) + 0x00, 0x00, 0x7C, 0xC0, 0xC0, 0x7C, 0x0C, 0x38, + // 232: e grave (è) + 0x30, 0x18, 0x00, 0x7C, 0xFE, 0xC0, 0x7C, 0x00, + // 233: e acute (é) - SPANISH + 0x0C, 0x18, 0x00, 0x7C, 0xFE, 0xC0, 0x7C, 0x00, + // 234: e circumflex (ê) + 0x38, 0x6C, 0x00, 0x7C, 0xFE, 0xC0, 0x7C, 0x00, + // 235: e diaeresis (ë) + 0x6C, 0x00, 0x00, 0x7C, 0xFE, 0xC0, 0x7C, 0x00, + // 236: i grave (ì) + 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x3C, 0x00, + // 237: i acute (í) - SPANISH + 0x0C, 0x18, 0x00, 0x38, 0x18, 0x18, 0x3C, 0x00, + // 238: i circumflex (î) + 0x18, 0x3C, 0x00, 0x38, 0x18, 0x18, 0x3C, 0x00, + // 239: i diaeresis (ï) + 0x6C, 0x00, 0x00, 0x38, 0x18, 0x18, 0x3C, 0x00, + // 240: eth (ð) + 0x1C, 0x38, 0x0C, 0x7C, 0xC6, 0xC6, 0x7C, 0x00, + // 241: n tilde (ñ) - SPANISH + 0x76, 0xDC, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0x00, + // 242: o grave (ò) + 0x30, 0x18, 0x00, 0x7C, 0xC6, 0xC6, 0x7C, 0x00, + // 243: o acute (ó) - SPANISH + 0x0C, 0x18, 0x00, 0x7C, 0xC6, 0xC6, 0x7C, 0x00, + // 244: o circumflex (ô) + 0x38, 0x6C, 0x00, 0x7C, 0xC6, 0xC6, 0x7C, 0x00, + // 245: o tilde (õ) + 0x76, 0xDC, 0x00, 0x7C, 0xC6, 0xC6, 0x7C, 0x00, + // 246: o diaeresis (ö) + 0x6C, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x7C, 0x00, + // 247: Division (÷) + 0x00, 0x18, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x00, + // 248: o stroke (ø) + 0x00, 0x02, 0x7C, 0xCE, 0xD6, 0xE6, 0x7C, 0x80, + // 249: u grave (ù) + 0x30, 0x18, 0x00, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, + // 250: u acute (ú) - SPANISH + 0x0C, 0x18, 0x00, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, + // 251: u circumflex (û) + 0x38, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, + // 252: u diaeresis (ü) - SPANISH + 0x6C, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, + // 253: y acute (ý) + 0x0C, 0x18, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x7C, + // 254: thorn (þ) + 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xFC, 0xC0, 0xC0, + // 255: y diaeresis (ÿ) + 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x7C, +}; + +// ============================================================================= +// Combined 8x8 Latin-1 Font (32-255) - Full Western European +// ============================================================================= + +/// Full 8x8 Latin-1 font covering characters 32-255 +/// Combines ASCII (32-126) + unused (127) + Latin-1 extended (128-255) +pub const font_8x8_latin1 = blk: { + var data: [224 * 8]u8 = undefined; + + // Copy ASCII portion (32-126 = 95 chars) + @memcpy(data[0..760], &font_8x8_ascii); + + // Character 127 (DEL) - use a box character + const del_char = [8]u8{ 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x00 }; + @memcpy(data[760..768], &del_char); + + // Copy Latin-1 extended (128-255 = 128 chars) + @memcpy(data[768..1792], &font_8x8_latin1_ext); + + break :blk data; +}; diff --git a/src/zcatgui.zig b/src/zcatgui.zig index 1cdad6a..5c1a2ea 100644 --- a/src/zcatgui.zig +++ b/src/zcatgui.zig @@ -80,6 +80,8 @@ pub const render = struct { const font_module = @import("render/font.zig"); pub const Font = font_module.Font; pub const default_font = font_module.default_font; + pub const default_font_latin1 = font_module.default_font_latin1; + pub const font_data = font_module.font_data; pub const ttf = @import("render/ttf.zig"); pub const TtfFont = ttf.TtfFont; pub const FontRef = ttf.FontRef;