🌍 Font Latin-1 completo para soporte español/europeo

- 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 <noreply@anthropic.com>
This commit is contained in:
reugenio 2025-12-10 01:03:02 +01:00
parent 14d717d7f4
commit 520c5d7343
3 changed files with 528 additions and 199 deletions

View file

@ -1,10 +1,18 @@
//! Font - Bitmap font rendering //! Font - Bitmap font rendering
//! //!
//! Simple bitmap font for basic text rendering. //! Bitmap font support with multiple character sets:
//! For TTF support, see ttf.zig. //! - 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"); const std = @import("std");
pub const ttf = @import("ttf.zig"); pub const ttf = @import("ttf.zig");
pub const font_data = @import("font_data.zig");
const Style = @import("../core/style.zig"); const Style = @import("../core/style.zig");
const Layout = @import("../core/layout.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{ pub const default_font = Font{
.glyphs = &default_font_data, .glyphs = &font_data.font_8x8_ascii,
.char_width = 8, .char_width = 8,
.char_height = 8, .char_height = 8,
.first_char = 32, .first_char = 32,
.num_chars = 95, .num_chars = 95,
}; };
// 8x8 font data for ASCII 32-126 (complete font) /// 8x8 Latin-1 font (characters 32-255)
// Each character is 8 bytes (8 rows, 1 byte per row) /// Full Western European character support including:
// Based on classic PC BIOS font /// - Spanish: ñ, Ñ, á, é, í, ó, ú, ü, ¿, ¡
const default_font_data = [95 * 8]u8{ /// - French: é, è, ê, ë, à, â, ç, etc.
// Space (32) /// - German: ä, ö, ü, ß
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /// - Portuguese, Italian, and more
// ! (33) pub const default_font_latin1 = Font{
0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00, .glyphs = &font_data.font_8x8_latin1,
// " (34) .char_width = 8,
0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, .char_height = 8,
// # (35) .first_char = 32,
0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, .num_chars = 224, // 32-255
// $ (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,
}; };
// ============================================================================= // =============================================================================

499
src/render/font_data.zig Normal file
View file

@ -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;
};

View file

@ -80,6 +80,8 @@ pub const render = struct {
const font_module = @import("render/font.zig"); const font_module = @import("render/font.zig");
pub const Font = font_module.Font; pub const Font = font_module.Font;
pub const default_font = font_module.default_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 ttf = @import("render/ttf.zig");
pub const TtfFont = ttf.TtfFont; pub const TtfFont = ttf.TtfFont;
pub const FontRef = ttf.FontRef; pub const FontRef = ttf.FontRef;