feat(fonts): Sistema de fuentes multi-tamaño con 8x16 Latin-1

Nuevas fuentes bitmap 8x16 (altura VGA estándar, mejor legibilidad):
- font_8x16: ASCII básico (95 caracteres)
- font_8x16_latin1: Latin-1 completo (224 caracteres)

Sistema FontSize para selección por categoría:
- getFontForSize(.small) → 8x8 Latin-1 (compacto)
- getFontForSize(.medium) → 8x16 Latin-1 (estándar UI)
- getFontForSizeAscii() variantes para menor memoria

Soporte completo español/europeo: ñ, Ñ, á, é, í, ó, ú, ü, ¿, ¡, ç, ß

Documentación actualizada en REFERENCE.md con tabla de fuentes
y ejemplos de uso.

🤖 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:19:34 +01:00
parent 520c5d7343
commit 784fecac01
4 changed files with 783 additions and 11 deletions

View file

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

View file

@ -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
// =============================================================================

View file

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

View file

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