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>
This commit is contained in:
committed by
Zach Nelson
co-authored by
Zach Nelson
Justin
jpirnay
mcrosson
parent
29fd29f537
commit
7993b2bb97
@@ -0,0 +1,94 @@
|
||||
# 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)
|
||||
|
||||
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](https://github.com/crosspoint-reader/crosspoint-reader/releases/tag/sd-fonts)
|
||||
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.
|
||||
Reference in New Issue
Block a user