Add a complete SD card font subsystem that enables users to install and use custom fonts beyond the three built-in families. This combines the back-end firmware support (#1327) with the font configuration, build pipeline, CI distribution, and user-facing management UI (#1392). Core font system: - Custom .cpfont binary format (v4) with multi-style support (regular, bold, italic, bold-italic) packed into a single file per size - On-demand glyph loading from SD card with two-pass prewarm rendering to bulk-read glyphs per page, achieving near-flash performance for Latin text (~697ms vs ~681ms) and viable CJK rendering (~32% slower) - Persistent advance cache for layout measurement without SD I/O - Overflow ring buffer for glyph cache misses during rendering - Memory-conscious design: only advance tables kept in RAM; glyph bitmaps, kern tables, and ligatures loaded on demand from SD Font management: - On-device WiFi download from GitHub Releases with manifest-based discovery, install/update detection, and progress UI - Web interface font upload, listing, and deletion via /fonts page - Manual SD card copy to /fonts/ or /.fonts/ directories - Font selection integrated into Settings > Reader > Font Family Build pipeline: - Declarative YAML config (sd-fonts.yaml) as single source of truth for the 17-family font library (serif, sans, mono, accessibility) - Python converter (fontconvert_sdcard.py) for TTF/OTF to .cpfont with FreeType rasterization, class-based kerning, and ligature extraction - Parallel build orchestrator with variable font instance extraction - CI workflow publishing versioned + stable releases to a dedicated crosspoint-fonts repository with auto-incrementing revision tags - Centralized version constants (cpfont_version.py) shared across build tooling and CI, with firmware headers as manual sync points Additional fixes: - CJK characters no longer get hyphens inserted at line breaks - Advance table eliminates 30+ second stalls during CJK section indexing for paragraphs with >512 unique codepoints Closes #930 Co-authored-by: Zach Nelson <zach@zdnelson.com> Co-authored-by: Justin <itsthisjustin@users.noreply.github.com> Co-authored-by: jpirnay <jens@pirnay.com> Co-authored-by: mcrosson <kemonine@kemonine.info>
2.9 KiB
2.9 KiB
SD Card Fonts
CrossPoint supports loading additional fonts from the SD card, including fonts with extended Unicode coverage (CJK, Cyrillic, Greek, etc.).
Installing Fonts
There are three ways to install fonts:
Option 1: Download from device (recommended)
- Connect your CrossPoint reader to WiFi
- Go to Settings > System > Download Fonts
- Browse available font families and tap to download
- Downloaded fonts appear immediately in Settings > Reader > Font Family
Option 2: Upload via web browser
- Connect your CrossPoint reader to WiFi
- Open the web interface in your browser (shown on the WiFi screen)
- Navigate to the Fonts tab
- Upload
.cpfontfiles using the upload form
Option 3: Manual SD card copy
-
Download font files from the Releases page
-
Copy font family folders to
/.crosspoint/fonts/on your SD card:SD Card Root/ └── .crosspoint/ └── fonts/ ├── Bookerly-SD/ │ ├── Bookerly-SD_12.cpfont │ ├── Bookerly-SD_14.cpfont │ ├── Bookerly-SD_16.cpfont │ └── Bookerly-SD_18.cpfont └── ... -
Insert the SD card and power on your CrossPoint reader
Available Pre-Built Fonts
| Font | Best For | Languages |
|---|---|---|
| Bookerly-SD | General reading | English, Western European |
| NotoSansExtended | Multi-script reading | European, Greek, Cyrillic, Georgian, Armenian, Ethiopic |
| NotoSansCJK | Chinese/Japanese/Korean | CJK + ASCII |
Converting Custom Fonts
To convert your own TrueType/OpenType fonts:
Prerequisites
pip install freetype-py fonttools
Single font (one style)
python3 lib/EpdFont/scripts/fontconvert_sdcard.py \
MyFont-Regular.ttf \
--intervals latin-ext \
--sizes 12,14,16,18 \
--style regular \
--name MyFont \
--output-dir ./MyFont/
Multi-style font
python3 lib/EpdFont/scripts/fontconvert_sdcard.py \
--regular MyFont-Regular.ttf \
--bold MyFont-Bold.ttf \
--italic MyFont-Italic.ttf \
--bolditalic MyFont-BoldItalic.ttf \
--intervals latin-ext \
--sizes 12,14,16,18 \
--name MyFont \
--output-dir ./MyFont/
Available Unicode interval presets
| Preset | Coverage |
|---|---|
ascii |
U+0020-U+007E (Basic Latin) |
latin-ext |
European languages (Latin + Extended-A/B) |
greek |
Greek + Extended Greek |
cyrillic |
Cyrillic + Supplement |
cjk |
CJK Unified Ideographs + Hiragana + Katakana + Fullwidth |
hangul |
Korean Hangul syllables |
builtin |
Matches built-in Bookerly coverage exactly |
Combine presets with commas: --intervals latin-ext,greek,cyrillic
Install custom fonts via WiFi upload or manual SD card copy.