diff --git a/REFERENCE.md b/REFERENCE.md index e7525b2..451f6c2 100644 --- a/REFERENCE.md +++ b/REFERENCE.md @@ -601,19 +601,47 @@ renderer.getClip(); // Current clip rect ### Font System +zcatgui provides multiple bitmap fonts for different use cases: + +| Font | Size | Characters | Use Case | +|--------------------|-------|------------|----------------------------------| +| `default_font` | 8x8 | ASCII | Compact displays, terminals | +| `default_font_latin1` | 8x8 | Latin-1 | Compact + Spanish/European | +| `font_8x16` | 8x16 | ASCII | Standard UI, good readability | +| `font_8x16_latin1` | 8x16 | Latin-1 | Standard UI + Spanish/European | + +**Latin-1 Character Support**: ñ, Ñ, á, é, í, ó, ú, ü, ¿, ¡, ç, ß, and all Western European accented characters. + **Bitmap Fonts** (`src/render/font.zig`): ```zig -const Font = zcatgui.render.Font; +const render = zcatgui.render; -// Built-in 8x8 font -const font = zcatgui.render.default_font; +// Direct font access +const font = render.default_font_latin1; // 8x8 with Spanish support +const font_tall = render.font_8x16_latin1; // 8x16 taller, more readable +// Font by size category (recommended) +const small_font = render.getFontForSize(.small); // 8x8 Latin-1 +const medium_font = render.getFontForSize(.medium); // 8x16 Latin-1 + +// ASCII-only variants (smaller memory) +const ascii_font = render.getFontForSizeAscii(.medium); + +// Font operations font.charWidth() // 8 -font.charHeight() // 8 -font.textWidth("Hello") // 40 +font.charHeight() // 8 or 16 +font.textWidth("Hello") // width in pixels font.drawChar(fb, x, y, 'A', color, clip); -font.drawText(fb, x, y, "Hello", color, clip); +font.drawText(fb, x, y, "¿Hola, España!", color, clip); +``` + +**Setting Default Font in Renderer**: +```zig +var renderer = SoftwareRenderer.init(&framebuffer); + +// Use 8x16 Latin-1 for better readability and Spanish support +renderer.setDefaultFont(@constCast(&render.font_8x16_latin1)); ``` **TrueType Fonts** (`src/render/ttf.zig`): @@ -623,10 +651,15 @@ const TtfFont = zcatgui.render.TtfFont; var ttf = try TtfFont.loadFromFile(allocator, "font.ttf"); defer ttf.deinit(); -const metrics = ttf.getMetrics(); -ttf.renderGlyph(codepoint, size); +ttf.setSize(16); // Set render size +const metrics = ttf.getGlyphMetrics('A'); +ttf.textWidth("Hello"); ``` +> **Note**: TTF rendering currently uses placeholder glyphs. Full TTF rasterization +> (bezier curve rendering) is planned for future releases. For production use, +> prefer the bitmap fonts which have complete glyph rendering. + --- ## Animation & Effects diff --git a/src/render/font.zig b/src/render/font.zig index 47bc4ce..2d7a15a 100644 --- a/src/render/font.zig +++ b/src/render/font.zig @@ -155,6 +155,80 @@ pub const default_font_latin1 = Font{ .num_chars = 224, // 32-255 }; +// ============================================================================= +// 8x16 Fonts (Taller, standard VGA height - better readability) +// ============================================================================= + +/// 8x16 ASCII font (characters 32-126) +/// Taller font for better readability in UI applications. +pub const font_8x16 = Font{ + .glyphs = &font_data.font_8x16_ascii, + .char_width = 8, + .char_height = 16, + .first_char = 32, + .num_chars = 95, +}; + +/// 8x16 Latin-1 font (characters 32-255) +/// Taller font with full Western European character support. +/// Recommended for UI applications that need both readability and Spanish support. +pub const font_8x16_latin1 = Font{ + .glyphs = &font_data.font_8x16_latin1, + .char_width = 8, + .char_height = 16, + .first_char = 32, + .num_chars = 224, // 32-255 +}; + +// ============================================================================= +// Font Size Presets (convenience aliases) +// ============================================================================= + +/// Font size categories for easy selection +pub const FontSize = enum { + /// Small: 8x8 bitmap (compact, good for dense data) + small, + /// Medium: 8x16 bitmap (standard VGA, good readability) + medium, + /// Large: placeholder for future 12x24 or similar + large, +}; + +/// Get the best font for a given size category +/// Returns Latin-1 fonts (full Western European support) +pub fn getFontForSize(size: FontSize) Font { + return switch (size) { + .small => default_font_latin1, + .medium => font_8x16_latin1, + .large => font_8x16_latin1, // TODO: Add larger font + }; +} + +/// Get ASCII-only font for a given size (smaller memory footprint) +pub fn getFontForSizeAscii(size: FontSize) Font { + return switch (size) { + .small => default_font, + .medium => font_8x16, + .large => font_8x16, // TODO: Add larger font + }; +} + +// ============================================================================= +// Available Fonts Summary +// ============================================================================= +// +// | Name | Size | Chars | Use Case | +// |--------------------|-------|---------|----------------------------------| +// | default_font | 8x8 | ASCII | Compact displays, terminals | +// | default_font_latin1| 8x8 | Latin-1 | Compact + Spanish/European | +// | font_8x16 | 8x16 | ASCII | Standard UI, good readability | +// | font_8x16_latin1 | 8x16 | Latin-1 | Standard UI + Spanish/European | +// +// For TTF fonts, see ttf.zig (requires TtfFont.loadFromFile) +// Note: TTF rendering currently uses placeholder glyphs. +// Full TTF rasterization requires bezier curve implementation. +// + // ============================================================================= // Tests // ============================================================================= diff --git a/src/render/font_data.zig b/src/render/font_data.zig index d5ae8a8..ed9db62 100644 --- a/src/render/font_data.zig +++ b/src/render/font_data.zig @@ -1,11 +1,23 @@ //! 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 //! +//! ## Available Fonts +//! | Name | Size | Characters | Bytes | Use Case | +//! |-------------------|-------|------------|--------|-----------------------------| +//! | font_8x8_ascii | 8x8 | 95 (ASCII) | 760 | Compact, English only | +//! | font_8x8_latin1 | 8x8 | 224 (Latin-1)| 1792 | Compact + Spanish/European | +//! | font_8x16_ascii | 8x16 | 95 (ASCII) | 1520 | Standard, English only | +//! | font_8x16_latin1 | 8x16 | 224 (Latin-1)| 3584 | Standard + Spanish/European | +//! +//! ## Character Support +//! - ASCII (32-126): Basic printable characters +//! - Latin-1 Extended (128-255): Spanish (ñ, á, é, í, ó, ú, ¿, ¡), French (ç, è, ê), +//! German (ä, ö, ü, ß), Portuguese, Italian, and more Western European characters +//! +//! ## Format //! All fonts use 1-bit-per-pixel format (packed into bytes, MSB first). +//! Each row is stored as bytes, with leftmost pixel as MSB. // ============================================================================= // 8x8 ASCII Font (32-126) - 95 characters @@ -497,3 +509,649 @@ pub const font_8x8_latin1 = blk: { break :blk data; }; + +// ============================================================================= +// 8x16 Latin-1 Font (32-255) - Taller, more readable font +// ============================================================================= + +/// 8x16 ASCII font data (characters 32-126) +/// Each character is 16 bytes (16 rows, 1 byte per row, MSB = leftmost pixel) +/// This is the standard VGA font height, better for UI applications. +pub const font_8x16_ascii = [95 * 16]u8{ + // Space (32) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // ! (33) + 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x18, + 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + // " (34) + 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // # (35) + 0x00, 0x00, 0x00, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, + 0x6C, 0xFE, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, + // $ (36) + 0x18, 0x18, 0x7C, 0xC6, 0xC2, 0xC0, 0x7C, 0x06, + 0x06, 0x86, 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00, + // % (37) + 0x00, 0x00, 0x00, 0x00, 0xC2, 0xC6, 0x0C, 0x18, + 0x30, 0x60, 0xC6, 0x86, 0x00, 0x00, 0x00, 0x00, + // & (38) + 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38, 0x76, 0xDC, + 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, + // ' (39) + 0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // ( (40) + 0x00, 0x00, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, + // ) (41) + 0x00, 0x00, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, + // * (42) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3C, 0xFF, + 0x3C, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // + (43) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, + 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // , (44) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, + // - (45) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // . (46) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + // / (47) + 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0C, 0x18, + 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, + // 0 (48) + 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xD6, 0xD6, + 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00, + // 1 (49) + 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, + // 2 (50) + 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x0C, 0x18, 0x30, + 0x60, 0xC0, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00, + // 3 (51) + 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x3C, 0x06, + 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // 4 (52) + 0x00, 0x00, 0x0C, 0x1C, 0x3C, 0x6C, 0xCC, 0xFE, + 0x0C, 0x0C, 0x0C, 0x1E, 0x00, 0x00, 0x00, 0x00, + // 5 (53) + 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0, 0xFC, 0x06, + 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // 6 (54) + 0x00, 0x00, 0x38, 0x60, 0xC0, 0xC0, 0xFC, 0xC6, + 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // 7 (55) + 0x00, 0x00, 0xFE, 0xC6, 0x06, 0x06, 0x0C, 0x18, + 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, + // 8 (56) + 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0xC6, + 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // 9 (57) + 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, + 0x06, 0x06, 0x0C, 0x78, 0x00, 0x00, 0x00, 0x00, + // : (58) + 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, + 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + // ; (59) + 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, + 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, + // < (60) + 0x00, 0x00, 0x00, 0x06, 0x0C, 0x18, 0x30, 0x60, + 0x30, 0x18, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00, + // = (61) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // > (62) + 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C, 0x06, + 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, + // ? (63) + 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C, 0x18, 0x18, + 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + // @ (64) + 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xDE, 0xDE, + 0xDE, 0xDC, 0xC0, 0x7C, 0x00, 0x00, 0x00, 0x00, + // A (65) + 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, + 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, + // B (66) + 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x66, + 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00, + // C (67) + 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xC0, + 0xC0, 0xC2, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00, + // D (68) + 0x00, 0x00, 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00, 0x00, 0x00, + // E (69) + 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, 0x68, + 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00, + // F (70) + 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, 0x68, + 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, + // G (71) + 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xDE, + 0xC6, 0xC6, 0x66, 0x3A, 0x00, 0x00, 0x00, 0x00, + // H (72) + 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, + 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, + // I (73) + 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, + // J (74) + 0x00, 0x00, 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, + 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00, + // K (75) + 0x00, 0x00, 0xE6, 0x66, 0x66, 0x6C, 0x78, 0x78, + 0x6C, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00, + // L (76) + 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00, + // M (77) + 0x00, 0x00, 0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, + 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, + // N (78) + 0x00, 0x00, 0xC6, 0xE6, 0xF6, 0xFE, 0xDE, 0xCE, + 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, + // O (79) + 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, + 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // P (80) + 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x60, + 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, + // Q (81) + 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, + 0xC6, 0xD6, 0xDE, 0x7C, 0x0C, 0x0E, 0x00, 0x00, + // R (82) + 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x6C, + 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00, + // S (83) + 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x60, 0x38, 0x0C, + 0x06, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // T (84) + 0x00, 0x00, 0x7E, 0x7E, 0x5A, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, + // U (85) + 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, + 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // V (86) + 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, + 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, + // W (87) + 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, + 0xD6, 0xFE, 0xEE, 0x6C, 0x00, 0x00, 0x00, 0x00, + // X (88) + 0x00, 0x00, 0xC6, 0xC6, 0x6C, 0x7C, 0x38, 0x38, + 0x7C, 0x6C, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, + // Y (89) + 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, + 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, + // Z (90) + 0x00, 0x00, 0xFE, 0xC6, 0x86, 0x0C, 0x18, 0x30, + 0x60, 0xC2, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00, + // [ (91) + 0x00, 0x00, 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x3C, 0x00, 0x00, 0x00, 0x00, + // \ (92) + 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x30, 0x18, + 0x0C, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + // ] (93) + 0x00, 0x00, 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0C, 0x0C, 0x0C, 0x3C, 0x00, 0x00, 0x00, 0x00, + // ^ (94) + 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // _ (95) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, + // ` (96) + 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // a (97) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C, + 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, + // b (98) + 0x00, 0x00, 0xE0, 0x60, 0x60, 0x78, 0x6C, 0x66, + 0x66, 0x66, 0x66, 0x7C, 0x00, 0x00, 0x00, 0x00, + // c (99) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, + 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // d (100) + 0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x3C, 0x6C, 0xCC, + 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, + // e (101) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xFE, + 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // f (102) + 0x00, 0x00, 0x38, 0x6C, 0x64, 0x60, 0xF0, 0x60, + 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, + // g (103) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xCC, 0x78, 0x00, + // h (104) + 0x00, 0x00, 0xE0, 0x60, 0x60, 0x6C, 0x76, 0x66, + 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00, + // i (105) + 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, + // j (106) + 0x00, 0x00, 0x06, 0x06, 0x00, 0x0E, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3C, 0x00, + // k (107) + 0x00, 0x00, 0xE0, 0x60, 0x60, 0x66, 0x6C, 0x78, + 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00, + // l (108) + 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, + // m (109) + 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xFE, 0xD6, + 0xD6, 0xD6, 0xD6, 0xC6, 0x00, 0x00, 0x00, 0x00, + // n (110) + 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, + // o (111) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, + 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // p (112) + 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00, + // q (113) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0x0C, 0x1E, 0x00, + // r (114) + 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x76, 0x66, + 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, + // s (115) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x60, + 0x38, 0x0C, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // t (116) + 0x00, 0x00, 0x10, 0x30, 0x30, 0xFC, 0x30, 0x30, + 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00, + // u (117) + 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, + // v (118) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, + // w (119) + 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xD6, + 0xD6, 0xD6, 0xFE, 0x6C, 0x00, 0x00, 0x00, 0x00, + // x (120) + 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x6C, 0x38, + 0x38, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00, + // y (121) + 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, + 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x0C, 0xF8, 0x00, + // z (122) + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xCC, 0x18, + 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00, + // { (123) + 0x00, 0x00, 0x0E, 0x18, 0x18, 0x18, 0x70, 0x18, + 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00, 0x00, 0x00, + // | (124) + 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + // } (125) + 0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0E, 0x18, + 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, + // ~ (126) + 0x00, 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +/// 8x16 Latin-1 extended characters (128-255) +/// 16 bytes per character (16 rows) +pub const font_8x16_latin1_ext = [128 * 16]u8{ + // 128-159: Control/special characters + // 128: Euro (€) + 0x00, 0x00, 0x3C, 0x66, 0xC0, 0xF8, 0xC0, 0xF8, + 0xC0, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, + // 129: unused + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 130-159: (simplified - mostly blank or basic) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, // 130 + 0x00, 0x00, 0x0E, 0x18, 0x18, 0x3C, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 131 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x6C, 0xD8, 0x00, 0x00, 0x00, 0x00, // 132 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD6, 0x00, 0x00, 0x00, 0x00, 0x00, // 133 + 0x00, 0x18, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, // 134 + 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 135 + 0x00, 0x18, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 136 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 137 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 138 + 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 139 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 140 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 141 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 142 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 143 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 144 + 0x00, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 145 + 0x00, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 146 + 0x00, 0x6C, 0x36, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 147 + 0x00, 0x36, 0x6C, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 148 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 149 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 150 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 151 + 0x00, 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 152 + 0x00, 0xFE, 0x92, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 153 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 154 + 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 155 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 156 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 157 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 158 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 159 + + // 160: Non-breaking space + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 161: Inverted exclamation (¡) - SPANISH + 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, + 0x3C, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, + // 162: Cent (¢) + 0x00, 0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC0, + 0xC0, 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00, 0x00, + // 163: Pound (£) + 0x00, 0x00, 0x38, 0x6C, 0x64, 0x60, 0xF0, 0x60, + 0x60, 0x60, 0xE6, 0xFC, 0x00, 0x00, 0x00, 0x00, + // 164: Currency (¤) + 0x00, 0x00, 0x00, 0x00, 0xC6, 0x7C, 0xC6, 0xC6, + 0xC6, 0x7C, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, + // 165: Yen (¥) + 0x00, 0x00, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, + 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + // 166: Broken bar (¦) + 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, + 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + // 167: Section (§) + 0x00, 0x7C, 0xC6, 0x60, 0x38, 0x6C, 0xC6, 0xC6, + 0x6C, 0x38, 0x0C, 0xC6, 0x7C, 0x00, 0x00, 0x00, + // 168: Diaeresis (¨) + 0x00, 0x00, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 169: Copyright (©) + 0x00, 0x00, 0x3C, 0x42, 0x99, 0xA1, 0xA1, 0xA1, + 0x99, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, + // 170: Feminine ordinal (ª) + 0x00, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, + 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 171: Left guillemet («) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6C, 0xD8, + 0x6C, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 172: Not (¬) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06, + 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 173: Soft hyphen + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 174: Registered (®) + 0x00, 0x00, 0x3C, 0x42, 0xB9, 0xA5, 0xB9, 0xA5, + 0xA5, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, + // 175: Macron (¯) + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 176: Degree (°) + 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 177: Plus-minus (±) + 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18, + 0x18, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, + // 178: Superscript 2 (²) + 0x00, 0x00, 0x38, 0x0C, 0x18, 0x30, 0x3C, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 179: Superscript 3 (³) + 0x00, 0x00, 0x38, 0x0C, 0x18, 0x0C, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 180: Acute (´) + 0x00, 0x00, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 181: Micro (µ) + 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xFE, 0xC0, 0xC0, 0x00, 0x00, + // 182: Pilcrow (¶) + 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB, 0x7B, 0x1B, + 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00, 0x00, 0x00, + // 183: Middle dot (·) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 184: Cedilla (¸) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x0C, 0x38, 0x00, + // 185: Superscript 1 (¹) + 0x00, 0x00, 0x18, 0x38, 0x18, 0x18, 0x3C, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 186: Masculine ordinal (º) + 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x7C, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 187: Right guillemet (») + 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x6C, 0x36, + 0x6C, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 188: One quarter (¼) + 0x00, 0x00, 0xC0, 0xC0, 0xC2, 0xC6, 0x0C, 0x18, + 0x30, 0x66, 0xCE, 0x9E, 0x06, 0x00, 0x00, 0x00, + // 189: One half (½) + 0x00, 0x00, 0xC0, 0xC0, 0xC2, 0xC6, 0x0C, 0x18, + 0x30, 0x6E, 0xD3, 0x06, 0x0C, 0x1F, 0x00, 0x00, + // 190: Three quarters (¾) + 0x00, 0x00, 0xE0, 0x30, 0x62, 0x36, 0xEC, 0x18, + 0x30, 0x66, 0xCE, 0x9E, 0x06, 0x00, 0x00, 0x00, + // 191: Inverted question (¿) - SPANISH + 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x30, + 0x60, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + + // 192: A grave (À) + 0x60, 0x30, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, + 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, + // 193: A acute (Á) - SPANISH + 0x0C, 0x18, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, + 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, + // 194: A circumflex (Â) + 0x10, 0x38, 0x6C, 0x10, 0x38, 0x6C, 0xC6, 0xC6, + 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, + // 195: A tilde (Ã) + 0x76, 0xDC, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, + 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, + // 196: A diaeresis (Ä) + 0x6C, 0x6C, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, + 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, + // 197: A ring (Å) + 0x38, 0x6C, 0x38, 0x10, 0x38, 0x6C, 0xC6, 0xC6, + 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, + // 198: AE (Æ) + 0x00, 0x00, 0x3E, 0x6C, 0xCC, 0xCC, 0xFE, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCE, 0x00, 0x00, 0x00, 0x00, + // 199: C cedilla (Ç) + 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xC0, + 0xC0, 0xC2, 0x66, 0x3C, 0x18, 0x0C, 0x38, 0x00, + // 200: E grave (È) + 0x60, 0x30, 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, + 0x68, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00, + // 201: E acute (É) - SPANISH + 0x0C, 0x18, 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, + 0x68, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00, + // 202: E circumflex (Ê) + 0x10, 0x38, 0x6C, 0xFE, 0x66, 0x62, 0x68, 0x78, + 0x68, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00, + // 203: E diaeresis (Ë) + 0x6C, 0x6C, 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, + 0x68, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00, + // 204: I grave (Ì) + 0x60, 0x30, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, + // 205: I acute (Í) - SPANISH + 0x0C, 0x18, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, + // 206: I circumflex (Î) + 0x18, 0x3C, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, + // 207: I diaeresis (Ï) + 0x66, 0x66, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, + // 208: Eth (Ð) + 0x00, 0x00, 0xF8, 0x6C, 0x66, 0x66, 0xF6, 0x66, + 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00, 0x00, 0x00, + // 209: N tilde (Ñ) - SPANISH + 0x76, 0xDC, 0x00, 0xC6, 0xE6, 0xF6, 0xFE, 0xDE, + 0xCE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, + // 210: O grave (Ò) + 0x60, 0x30, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, + 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // 211: O acute (Ó) - SPANISH + 0x0C, 0x18, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, + 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // 212: O circumflex (Ô) + 0x10, 0x38, 0x6C, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, + 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // 213: O tilde (Õ) + 0x76, 0xDC, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, + 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // 214: O diaeresis (Ö) + 0x6C, 0x6C, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, + 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // 215: Multiplication (×) + 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x6C, 0x38, + 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 216: O stroke (Ø) + 0x00, 0x00, 0x7E, 0xC6, 0xCE, 0xCE, 0xD6, 0xD6, + 0xE6, 0xE6, 0xC6, 0xFC, 0x00, 0x00, 0x00, 0x00, + // 217: U grave (Ù) + 0x60, 0x30, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, + 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // 218: U acute (Ú) - SPANISH + 0x0C, 0x18, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, + 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // 219: U circumflex (Û) + 0x10, 0x38, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, + 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // 220: U diaeresis (Ü) - SPANISH + 0x6C, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, + 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // 221: Y acute (Ý) + 0x0C, 0x18, 0x00, 0x66, 0x66, 0x66, 0x3C, 0x18, + 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, + // 222: Thorn (Þ) + 0x00, 0x00, 0xF0, 0x60, 0x7C, 0x66, 0x66, 0x66, + 0x66, 0x7C, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, + // 223: Sharp s (ß) - German + 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x6C, 0x78, 0x6C, + 0x66, 0x66, 0x66, 0x6C, 0x00, 0x00, 0x00, 0x00, + + // 224: a grave (à) + 0x00, 0x00, 0x60, 0x30, 0x00, 0x78, 0x0C, 0x7C, + 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, + // 225: a acute (á) - SPANISH + 0x00, 0x00, 0x0C, 0x18, 0x00, 0x78, 0x0C, 0x7C, + 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, + // 226: a circumflex (â) + 0x00, 0x10, 0x38, 0x6C, 0x00, 0x78, 0x0C, 0x7C, + 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, + // 227: a tilde (ã) + 0x00, 0x00, 0x76, 0xDC, 0x00, 0x78, 0x0C, 0x7C, + 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, + // 228: a diaeresis (ä) + 0x00, 0x00, 0x6C, 0x6C, 0x00, 0x78, 0x0C, 0x7C, + 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, + // 229: a ring (å) + 0x00, 0x38, 0x6C, 0x38, 0x00, 0x78, 0x0C, 0x7C, + 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, + // 230: ae (æ) + 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x76, 0x36, + 0x7E, 0xD8, 0xD8, 0x6E, 0x00, 0x00, 0x00, 0x00, + // 231: c cedilla (ç) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, + 0xC0, 0xC0, 0xC6, 0x7C, 0x18, 0x0C, 0x38, 0x00, + // 232: e grave (è) + 0x00, 0x00, 0x60, 0x30, 0x00, 0x7C, 0xC6, 0xFE, + 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // 233: e acute (é) - SPANISH + 0x00, 0x00, 0x0C, 0x18, 0x00, 0x7C, 0xC6, 0xFE, + 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // 234: e circumflex (ê) + 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C, 0xC6, 0xFE, + 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // 235: e diaeresis (ë) + 0x00, 0x00, 0x6C, 0x6C, 0x00, 0x7C, 0xC6, 0xFE, + 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // 236: i grave (ì) + 0x00, 0x00, 0x60, 0x30, 0x00, 0x38, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, + // 237: i acute (í) - SPANISH + 0x00, 0x00, 0x0C, 0x18, 0x00, 0x38, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, + // 238: i circumflex (î) + 0x00, 0x18, 0x3C, 0x66, 0x00, 0x38, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, + // 239: i diaeresis (ï) + 0x00, 0x00, 0x66, 0x66, 0x00, 0x38, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, + // 240: eth (ð) + 0x00, 0x00, 0x36, 0x1C, 0x0C, 0x3C, 0x6C, 0xCC, + 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00, + // 241: n tilde (ñ) - SPANISH + 0x00, 0x00, 0x76, 0xDC, 0x00, 0xDC, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, + // 242: o grave (ò) + 0x00, 0x00, 0x60, 0x30, 0x00, 0x7C, 0xC6, 0xC6, + 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // 243: o acute (ó) - SPANISH + 0x00, 0x00, 0x0C, 0x18, 0x00, 0x7C, 0xC6, 0xC6, + 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // 244: o circumflex (ô) + 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C, 0xC6, 0xC6, + 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // 245: o tilde (õ) + 0x00, 0x00, 0x76, 0xDC, 0x00, 0x7C, 0xC6, 0xC6, + 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // 246: o diaeresis (ö) + 0x00, 0x00, 0x6C, 0x6C, 0x00, 0x7C, 0xC6, 0xC6, + 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, + // 247: Division (÷) + 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x7E, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 248: o stroke (ø) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xCE, 0xD6, + 0xD6, 0xD6, 0xE6, 0xFC, 0x00, 0x00, 0x00, 0x00, + // 249: u grave (ù) + 0x00, 0x00, 0x60, 0x30, 0x00, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, + // 250: u acute (ú) - SPANISH + 0x00, 0x00, 0x0C, 0x18, 0x00, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, + // 251: u circumflex (û) + 0x00, 0x10, 0x38, 0x6C, 0x00, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, + // 252: u diaeresis (ü) - SPANISH + 0x00, 0x00, 0x6C, 0x6C, 0x00, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, + // 253: y acute (ý) + 0x00, 0x00, 0x0C, 0x18, 0x00, 0xC6, 0xC6, 0xC6, + 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x0C, 0xF8, 0x00, + // 254: thorn (þ) + 0x00, 0x00, 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66, + 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00, 0x00, + // 255: y diaeresis (ÿ) + 0x00, 0x00, 0x6C, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, + 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x0C, 0xF8, 0x00, +}; + +/// Full 8x16 Latin-1 font covering characters 32-255 +pub const font_8x16_latin1 = blk: { + var data: [224 * 16]u8 = undefined; + + // Copy ASCII portion (32-126 = 95 chars) + @memcpy(data[0 .. 95 * 16], &font_8x16_ascii); + + // Character 127 (DEL) - use a box character + const del_char = [16]u8{ 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x00, 0x00 }; + @memcpy(data[95 * 16 .. 96 * 16], &del_char); + + // Copy Latin-1 extended (128-255 = 128 chars) + @memcpy(data[96 * 16 .. 224 * 16], &font_8x16_latin1_ext); + + break :blk data; +}; diff --git a/src/zcatgui.zig b/src/zcatgui.zig index 5c1a2ea..94d3548 100644 --- a/src/zcatgui.zig +++ b/src/zcatgui.zig @@ -79,8 +79,15 @@ pub const render = struct { pub const SoftwareRenderer = @import("render/software.zig").SoftwareRenderer; const font_module = @import("render/font.zig"); pub const Font = font_module.Font; + pub const FontSize = font_module.FontSize; + pub const getFontForSize = font_module.getFontForSize; + pub const getFontForSizeAscii = font_module.getFontForSizeAscii; + // 8x8 fonts (compact) pub const default_font = font_module.default_font; pub const default_font_latin1 = font_module.default_font_latin1; + // 8x16 fonts (taller, VGA standard, better readability) + pub const font_8x16 = font_module.font_8x16; + pub const font_8x16_latin1 = font_module.font_8x16_latin1; pub const font_data = font_module.font_data; pub const ttf = @import("render/ttf.zig"); pub const TtfFont = ttf.TtfFont;