Skip to content

2.41 RFC: TTF for all, CJK support

Pre-release
Pre-release

Choose a tag to compare

@jpirnay jpirnay released this 24 Oct 22:59
· 210 commits to master since this release
0625ac4

This release is all about fonts... using the ideas from upstream but making them available for everyone:

TTF support for all devices

Upstream introduced the support for TrueType fonts but restricted the implementation to the more modern devices with enough memory, leaving the X3 and X4 devices behind. This release brings every device on the same level: you can upload TTF fonts to all devices and use them.

Remember you need 4 fonts for one family: regular, bold, italic and bold-italic. Even if there's just one, then Witch(hunt) Reader will create bold and slanted variants of the glyphs for you.

CJK

한국어 독자 여러분, 환영합니다! 이번 Witchhunt Reader 버전부터 한국어를 지원합니다. 사용자 인터페이스뿐만 아니라, 설정(Settings) - 리더(Reader) - 글꼴 관리자(Font Manager) 메뉴에서 한국어 트루타입(TrueType) 글꼴을 다운로드할 수도 있습니다(다운로드하는 것을 권장합니다). 이제 모국어로 책을 읽어 보세요!

日本語の読者の皆さん、ようこそ!今回のWitchhunt Readerのバージョンから、日本語に対応しました。ユーザーインターフェースに加えて、設定(Settings)- リーダー(Reader)- フォントマネージャー(Font Manager)メニューから日本語のTrueTypeフォントをダウンロードできます(ぜひダウンロードしてください)。これで、母国語で本を読むことができます!

欢迎中文读者!此版本的 Witchhunt Reader 新增了对简体中文和繁体中文的支持。除了用户界面之外,您还可以(并且建议您)通过“设置(Settings)- 阅读器(Reader)- 字体管理器(Font Manager)”菜单下载简体中文和繁体中文的 TrueType 字体,以便使用您的母语阅读书籍!

We do now have UI and ttf support for Chinese, Japanese and Korean. There might be still issues and improvement potentials, so please provide feedback via github issues.

What's Changed

  • refactor: (EpdFont) GlyphProvider replaces the glyph-miss callback; one font lookup in GfxRenderer by @jpirnay in #468
  • feat: (ttf) FlashGlyphStore, a write-once glyph store in flash (TTF Stage 2a) by @jpirnay in #469
  • feat: (ttf) TTF rasterizer, an integer TrueType loader with FreeType's ftgrays, bit for bit with FreeType (TTF Stage 2b) by @jpirnay in #470
  • feat(fonts): TrueType font families in the reader (TTF Stage 2c-1) by @jpirnay in #472
  • fix(serial): refuse transfer paths with a NUL or control byte by @jpirnay in #473
  • feat(ttf): native sizes: headings, CSS sizes and drop caps at their own pixel size by @jpirnay in #474
  • feat(ttf): kerning and ligatures for TTF families by @jpirnay in #475
  • fix(reader): lend the secondary framebuffer to the end-of-book cover decode by @jpirnay in #476
  • fix(fonts): map box-drawing glyphs to ASCII look-alikes by @jpirnay in #477
  • feat(md): render pipe tables as a grid with column alignment by @jpirnay in #478
  • fix: screenshots wait for the render pass and capture the frame on the panel by @jpirnay in #479
  • feat: serial test commands to press buttons, open activities and report state by @jpirnay in #480
  • refactor: (Epub) one boundary per token, ready for CJK gaps by @jpirnay in #481
  • fix(storage): replacing or moving a file never loses it, and a finished book keeps its state by @jpirnay in #483
  • fix(net): TLS seeded from the hardware RNG, 34 KB less wolfSSL, credentials stay on their server, KOSync percentage records by @jpirnay in #482
  • fix: corrupt files and very large folders or chapters no longer crash the reader by @jpirnay in #484
  • fix(dictionary): no second copy of a definition, the right headword, Power turns its pages by @jpirnay in #485
  • fix(epub): sparse nav falls back to the NCX, filename-only contents links, SVG-wrapper covers (book cache v15) by @jpirnay in #486
  • fix(epub): sub-chapter titles right after a build, watermark spans, extensionless images, span footnotes, Return links (section v86) by @jpirnay in #487
  • fix(web): upload names in NFC, dialogs survive a text-selection drag by @jpirnay in #488
  • perf(sd): SdFat's free-cluster search moves forward and starts at the FSInfo hint by @jpirnay in #490
  • fix: xtctool XTC books, a sleep image asks first, serial lines without a stall, named CPU faults by @jpirnay in #489
  • fix(fonts): first-match kerning without the flash cost (-1.9 KB), € ™ № − in converted fonts, SD fonts rebuilt by @jpirnay in #491
  • fix(epub): ideas from crosspoint #3891: block emphasis, page breaks, widows/orphans, small caps, CSS cascade and selectors by @jpirnay in #492
  • perf(epub): Epub's constructor out of line, 3.8 KB less flash by @jpirnay in #493
  • feat(serial): a test API for automated device testing (settings, IDLE, events, more ACT targets), with docs and tools/devctl.py by @jpirnay in #494
  • fix(serial): a number too large for 32 bits is refused, not wrapped by @jpirnay in #495
  • feat(reader): Publisher Fonts — a book's embedded TrueType body font, on the C3 too (+10.4 KB) by @jpirnay in #496
  • feat: (Epub) CJK line breaking with kinsoku by @jpirnay in #497
  • perf(fonts): drop the flashed 20 pt faces and scale 20 pt from 18 pt (-506 KB flash, 8 MMU pages) by @jpirnay in #498
  • feat(fonts): Publisher Fonts Accents and All Text — a book's other families per block (Stage B, phase 1) by @jpirnay in #499
  • feat(fonts): several TrueType families in one glyph store — accents beside a TTF reader font (Stage B, phase 2) by @jpirnay in #501
  • fix(reader): load the next book's font after the reader it replaces has exited by @jpirnay in #502
  • perf: (Reader) CJK pages: free the glyph arena once shown, pre-render from 1-bit ink masks by @jpirnay in #500
  • fix: (Serial) warm reboot with a host attached; font family settings on the USB Transfer boot by @jpirnay in #505
  • docs: what remains for full CJK support (future_work/cjk.md) by @jpirnay in #504
  • feat(fonts): per-word book fonts, up to three accent families, cheaper reinstalls (Stage B, phase 3) by @jpirnay in #503
  • feat(ttf): SD mode — fonts too large for flash draw from the card, per style (stage 2c-4) by @jpirnay in #506
  • feat(reader): a memory ladder for pages with images and several fonts by @jpirnay in #507
  • feat: Chinese, Japanese and Korean UI, with CJK UI faces by @jpirnay in #508
  • fix: recent books survive a short heap; embedded faces up to 24 MB by @jpirnay in #509
  • feat: serial GET and SET of the UI language by @jpirnay in #510
  • perf: regain the next-page pre-render on the X3 with book fonts by @jpirnay in #511
  • fix: triage follow-ups — font upload staging, settings save result, folder walk, nothrow file handles, FSInfo hint, long dictionary paths by @jpirnay in #512
  • fix(settings): loading the recent books no longer starts itself again (#509 regression) by @jpirnay in #513
  • fix: font follow-ups — slimmer ladder, coarse pictures climb only when they can improve, replaced books' fonts, test books kept out of recents by @jpirnay in #514
  • perf(reader): image decodes stay out of the next-chapter build, the lane goes first, render misses use the lent buffer by @jpirnay in #515
  • ci: link the web interface bundle in the PR firmware comment by @jpirnay in #517
  • fix(display): the T5 S3 light drawer draws over the page on the panel (SDK bump) by @jpirnay in #516
  • fix: upstream triage 2026-10-19 — home cover edge, SSID by width, touch settings survive a missed probe by @jpirnay in #518
  • fix: two low-memory crash risks, and TrueType style + prewarm ring RAM by @jpirnay in #519
  • fix(tools): devctl closes the port without restarting an ESP32-C3 by @jpirnay in #522
  • fix(epub): a paragraph that undoes the book's root font size is body text by @jpirnay in #521
  • feat(epub): CJK punctuation widths, flush justification and the whole-em grid (A3a) by @jpirnay in #520
  • fix(gfx): shrink glyphs by area coverage, with anti-aliasing, as enlarging does by @jpirnay in #523
  • feat(fonts): the CJK UI faces ship compressed, -75 KB of flash by @jpirnay in #524
  • chore(sdk): resync freeink-sdk with Free-Ink main, per-board touch drivers by @jpirnay in #525
  • fix(epub): cover fallbacks find the cover, not the title banner by @jpirnay in #526
  • fix(epub): a 1,700-chapter book indexes in 3.6 s, not 7 minutes by @jpirnay in #528
  • fix: no same-page redraw after a turn (USB link dropouts, minute tick) by @jpirnay in #529
  • fix(reader): a page's display pass records the page it drew by @jpirnay in #530
  • feat: serial test API commands for the TrueType glyph store and the card by @jpirnay in #531
  • feat: the glyph store makes room instead of being wiped when it fills by @jpirnay in #532
  • perf(epub): a first open takes 3 ZIP walks, and the cover reads its file twice, not six times by @jpirnay in #533
  • fix(opds): catalogs that omit types, use rel="prev", or need a password by @jpirnay in #534
  • feat: open every picked book on a clean HALF refresh by @jpirnay in #535
  • fix(keyboard): a password field shows only what was just typed by @jpirnay in #537
  • fix(kosync): Authenticate from Settings gets the heap a handshake needs by @jpirnay in #536
  • feat(cache): clearing a book's cache asks whether to keep its bookmarks and reading progress by @jpirnay in #538
  • fix(kosync): a book opened with a sync on open is the one the sync reopens by @jpirnay in #539
  • fix(reader): the reader menu no longer pins the book's bionic override, and the page on screen survives a sync, an exit or a heap-recovery restart by @jpirnay in #540
  • fix(reader): a refused heap-recovery restart leaves the framebuffers in place by @jpirnay in #541
  • feat(ttf): OpenType CFF outlines (.otf), byte-exact with FreeType by @jpirnay in #542
  • fix(ui): screen content starts below the header and clear of the hint boxes by @jpirnay in #543
  • docs(future-work): open items from the 2026-10-21 device checks and audits by @jpirnay in #545
  • feat(markdown): inline code in a frame, hanging indent for wrapped code (#527) by @jpirnay in #546
  • perf(cff): a CFF glyph about as cheap as a TrueType one, byte-exact by @jpirnay in #544
  • test: second audit of the host test suite (3,447 -> 3,184 cases) by @jpirnay in #547
  • feat(ttf): synthetic bold for outline families without a bold file by @jpirnay in #548
  • fix(web): keep the installed web interface across firmware builds with the same pages by @jpirnay in #549
  • feat(ttf): synthetic italic for outline families without an italic file by @jpirnay in #551
  • feat(fonts): the CJK families as .otf in the font manager; the CJK bitmap families removed by @jpirnay in #550
  • fix(reader): a CJK book in a TrueType set never builds in place by @jpirnay in #552
  • fix(test): the CJK UI face test takes glyph counts from the generated tables by @jpirnay in #553
  • feat(cjk): ruby (furigana) above its base, JLREQ spacing by @jpirnay in #554
  • fix(layout): the optimal line breaker indents only a paragraph's first line by @jpirnay in #555
  • fix(cjk): ruby review fixes that missed #554 by @jpirnay in #556

Full Changelog: 2.40...2.41RC