openpencil/crates/op-host-web
Kayshen-X a218115010 feat(web): user font import — family-aware CanvasKit + import UI + IndexedDB (phases 3-4)
Bring user-imported fonts to the browser host, matching the native flow.

Phase 3 — family-aware CanvasKit text (the web BLOCKER): drawText now
carries font_family and a new measureTextFamilyStyled FFI mirrors it, so
the editor measures caret/layout with the same family it draws (closing
the family-blind trap). op_ck_bridge.js keys imported typefaces by family
and resolves them PER CHARACTER: chars the imported face covers draw with
it, the rest fall to the existing script-segmented system/CJK/emoji path
(no tofu, no dropped family) — draw + measure split on identical
importedCoverage segments so advances agree. register/removeImportedFont
with replace + wasm-heap free.

Phase 4 — import UI + persistence: web ImportFont opens a hidden
.ttf/.otf file input -> FileReader -> 16 MiB cap -> family parsed in Rust
via ttf-parser (font_meta.rs; the vendored CanvasKit exposes no
getFamilyName) -> register + persist bytes in IndexedDB (font_store_idb.rs;
DB openpencil / store imported_fonts, keyed by family, async errors
logged) -> refresh snapshot + repaint. Remove drops registry + IndexedDB.
Mount re-registers persisted fonts (skipping any the user already changed
this session) before the first family-aware paint. font_import_supported
is true on web, so the picker's imported group + Import row are live.

font_meta family extraction is unit-tested (real .ttf bytes -> family)
so the core is verified headlessly; runtime IndexedDB/FileReader/rendering
need a browser smoke test. Codex-reviewed (2 rounds) — getFamilyName
BLOCKER, mixed-script fallback, IndexedDB async errors, and the mount
race all addressed.
2026-07-05 14:21:51 +08:00
..
assets/canvaskit fix(web): use browser fonts in canvaskit shell 2026-06-19 02:39:34 +08:00
pkg-ck fix(web): expand browser font fallback stack 2026-06-19 07:30:34 +08:00
pkg-webgl refactor(renderer): consolidate web shell on CanvasKit, retire skia path 2026-06-18 09:34:37 +08:00
smoke test(web): add rust web browser smoke 2026-06-20 19:24:59 +08:00
src feat(web): user font import — family-aware CanvasKit + import UI + IndexedDB (phases 3-4) 2026-07-05 14:21:51 +08:00
tests merge: land the align-branch work onto the refreshed base 2026-07-03 00:08:17 +08:00
.gitignore
Cargo.toml feat(web): user font import — family-aware CanvasKit + import UI + IndexedDB (phases 3-4) 2026-07-05 14:21:51 +08:00