Files
Crosspoint/docs/sd-card-fonts.md
T
7993b2bb97 feat: add SD card font support with on-device download and web management
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>
2026-05-08 21:50:06 -05:00

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:

  1. Connect your CrossPoint reader to WiFi
  2. Go to Settings > System > Download Fonts
  3. Browse available font families and tap to download
  4. Downloaded fonts appear immediately in Settings > Reader > Font Family

Option 2: Upload via web browser

  1. Connect your CrossPoint reader to WiFi
  2. Open the web interface in your browser (shown on the WiFi screen)
  3. Navigate to the Fonts tab
  4. Upload .cpfont files using the upload form

Option 3: Manual SD card copy

  1. Download font files from the Releases page

  2. 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
            └── ...
    
  3. 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.