From 68873c8d801e68f0e1148e480643d8f6cbff141f Mon Sep 17 00:00:00 2001 From: minjaesong Date: Wed, 4 Mar 2026 13:49:13 +0900 Subject: [PATCH] finally "fixed" well enough --- OTFbuild/CLAUDE.md | 136 +++++++++++++++++++++++++++---- OTFbuild/calligra_font_tests.odt | Bin 17320 -> 17233 bytes OTFbuild/opentype_features.py | 69 +++++++++++----- 3 files changed, 166 insertions(+), 39 deletions(-) diff --git a/OTFbuild/CLAUDE.md b/OTFbuild/CLAUDE.md index f49833b..baf3203 100644 --- a/OTFbuild/CLAUDE.md +++ b/OTFbuild/CLAUDE.md @@ -118,11 +118,11 @@ print(f"{name}: advance={w}, has_outlines={has_outlines}") ### OpenType features generated (`opentype_features.py`) -- **ccmp** — replacewith expansions (DFLT); consonant-to-PUA mapping + vowel decompositions + anusvara upper (dev2); vowel decompositions (tml2) +- **ccmp** — replacewith expansions (DFLT); consonant-to-PUA mapping + vowel decompositions + anusvara upper (dev2/deva); vowel decompositions (tml2) - **kern** — pair positioning from `keming_machine.py` - **liga** — Latin ligatures (ff, fi, fl, ffi, ffl, st) and Armenian ligatures -- **locl** — Bulgarian/Serbian Cyrillic alternates; Devanagari consonant-to-PUA mapping + vowel decompositions + anusvara upper (dev2, duplicated from ccmp for DirectWrite compatibility) -- **nukt, akhn, half, blwf, cjct, pres, blws, rphf, abvs, psts, calt** — Devanagari complex script shaping (all under `script dev2`) +- **locl** — Bulgarian/Serbian Cyrillic alternates; Devanagari consonant-to-PUA mapping + vowel decompositions + anusvara upper (dev2/deva, duplicated from ccmp for DirectWrite compatibility) +- **nukt, akhn, half, blwf, cjct, pres, blws, rphf, abvs, psts, calt** — Devanagari complex script shaping (all under both `script dev2` and `script deva`) - **pres** (tml2) — Tamil consonant+vowel ligatures - **pres** (sund) — Sundanese diacritic combinations - **ljmo, vjmo, tjmo** — Hangul jamo positional variants @@ -204,23 +204,125 @@ Implication: GSUB rules that need to match pre-base matras adjacent to post-base ### Cross-platform shaper differences (DirectWrite, CoreText, HarfBuzz) -The three major shapers behave differently for Devanagari (dev2): +The three major shapers behave differently for Devanagari. The font registers all Devanagari features under **both** `dev2` (new Indic) and `deva` (old Indic) script tags. HarfBuzz and DirectWrite use `dev2`; CoreText uses `deva`. -**DirectWrite (Windows)**: -- Feature order: `locl` → `nukt` → `akhn` → `rphf` → `rkrf` → `blwf` → `half` → `vatu` → `cjct` → `pres` → `abvs` → `blws` → `psts` → `haln` → `calt` → GPOS: `kern` → `dist` → `abvm` → `blwm` -- **Does NOT apply `ccmp`** for the dev2 script. All lookups that must run before `nukt` (e.g. consonant-to-PUA mapping) must be registered under `locl` instead. -- Tests reph eligibility via `would_substitute([RA, virama], rphf)` using **original Unicode codepoints** (before locl/ccmp). The `rphf` feature must include a rule with the Unicode form of RA, not just the PUA form. +#### Script tag selection -**CoreText (macOS)**: -- Applies `ccmp` but may do so **after** reordering (unlike HarfBuzz which applies ccmp before reordering). This means pre-base matras (I-matra U+093F) are already reordered before the consonant, breaking adjacency rules like `sub 093F 0902'`. -- Tests reph eligibility using `would_substitute()` with Unicode codepoints, same as DirectWrite. -- Solution: add wider-context fallback rules in `abvs` (post-reordering) that match I-matra separated from anusvara by 1-3 intervening glyphs. +| Shaper | Script tag used | Indic model | +|---|---|---| +| HarfBuzz | `dev2` | New Indic (ot-indic2) | +| DirectWrite | `dev2` | New Indic | +| CoreText | `deva` | Old Indic | -**HarfBuzz (reference)**: -- Applies `ccmp` **before** reordering (Unicode order). -- Reph detection is pattern-based (RA + halant + consonant at syllable start), not feature-based. -- Most lenient — works with PUA-only rules. +Both tags must exist, and all GSUB/GPOS features must be registered under both, otherwise CoreText silently breaks. -**Practical implication**: Define standalone lookups (e.g. `DevaConsonantMap`, `DevaVowelDecomp`) **outside** any feature block, then reference them from both `locl` and `ccmp`. This ensures DirectWrite (via locl) and HarfBuzz (via ccmp) both fire the lookups. The second application is a no-op since glyphs are already transformed. +#### Feature order differences + +**HarfBuzz (dev2, reference implementation)**: +1. Pre-reordering: `locl` → `ccmp` +2. Reordering (I-matra moves before consonant, reph moves to end) +3. Post-reordering: `nukt` → `akhn` → `rphf` → `half` → `blwf` → `cjct` → `pres` → `abvs` → `blws` → `psts` → `haln` → `calt` +4. GPOS: `kern` → `abvm` → `blwm` + +**DirectWrite (dev2)**: +- `locl` → `nukt` → `akhn` → `rphf` → `rkrf` → `blwf` → `half` → `vatu` → `cjct` → `pres` → `abvs` → `blws` → `psts` → `haln` → `calt` +- GPOS: `kern` → `dist` → `abvm` → `blwm` +- **Does NOT apply `ccmp`** for the dev2 script. All lookups that must run before `nukt` (e.g. consonant-to-PUA mapping, anusvara upper) must be registered under `locl` instead. + +**CoreText (deva)**: +- Applies `locl` and `ccmp`, but may apply `ccmp` **after** reordering (unlike HarfBuzz). +- Post-reordering features same as above: `nukt` → `akhn` → `rphf` → ... → `abvs` → ... → `psts` +- GPOS: `kern` → `abvm` (+ `mark`/`mkmk` if registered under `deva`) + +#### Key behavioural differences + +**1. ccmp timing (CoreText vs HarfBuzz)** + +HarfBuzz applies `ccmp` in Unicode order (before reordering). CoreText may apply it after reordering. This breaks adjacency-based rules: + +``` +# In ccmp — works on HarfBuzz (Unicode order: C + matra + anusvara): +sub uni093F uni0902' lookup AnusvaraUpper; # I-matra + anusvara + +# After reordering on CoreText: I-matra + [consonants] + anusvara +# The I-matra and anusvara are no longer adjacent → rule fails +``` + +**Fix**: duplicate these rules in `abvs` (post-reordering) with wildcard gaps: +``` +sub uni093F @devaAny uni0902' lookup AnusvaraUpper; +sub uni093F @devaAny @devaAny uni0902' lookup AnusvaraUpper; +``` + +**2. Reph eligibility testing** + +| Shaper | Method | +|---|---| +| HarfBuzz | Pattern-based (RA + halant + consonant at syllable start) | +| DirectWrite | `would_substitute([RA, virama], rphf)` with **Unicode** codepoints | +| CoreText | `would_substitute()` with Unicode codepoints (same as DW) | + +The `rphf` feature must include a rule with the Unicode form of RA (`uni0930`), not just the PUA form. Otherwise DW and CT won't detect reph. + +**3. Within-lookup glyph visibility (CoreText)** + +In OpenType, a single lookup processes the glyph string left-to-right. Per spec, a substitution at position N should be visible when the lookup reaches position N+1. CoreText appears to **not** propagate substitutions within a single lookup pass to subsequent positions' backtrack context. + +Example: two rules in one anonymous lookup: +``` +sub @trigger uF010C' lookup ComplexReph; # rule at pos N: uF010C → uF010D +sub uF010D uF016C' lookup AnusvaraLower; # rule at pos N+1: needs uF010D in backtrack +``` + +On HarfBuzz/DirectWrite, rule 2 sees the updated `uF010D` at position N. On CoreText, it still sees the original `uF010C` → rule 2 fails to match. + +**Fix**: split into separate **named lookups** so each runs as an independent pass: +``` +lookup AbvsPass1 { + sub @trigger uF010C' lookup ComplexReph; +} AbvsPass1; +lookup AbvsPass2 { + sub uF010D uF016C' lookup AnusvaraLower; +} AbvsPass2; +feature abvs { + script dev2; lookup AbvsPass1; lookup AbvsPass2; + script deva; lookup AbvsPass1; lookup AbvsPass2; +} abvs; +``` + +**4. GPOS mark stacking heuristics** + +When two marks share the same base without MarkToMark, each shaper applies different internal Y adjustments: + +| Shaper | Internal Y shift | +|---|---| +| HarfBuzz | 0 (no heuristic) | +| DirectWrite | -100 | +| CoreText | -200 | + +No single GPOS Y value satisfies all three. **Fix**: use explicit MarkToMark positioning (e.g. `AnusvaraToComplexReph`) which suppresses shaper heuristics and gives consistent results across all three. + +**5. GPOS double-application with dev2+deva** + +When both script tags exist, CoreText/DirectWrite may merge lookup lists from both scripts. Inline (anonymous) GPOS rules create separate lookups per script → cumulative positioning doubles. **Fix**: use **named lookups** for all GPOS contextual positioning so both scripts reference the same lookup index. + +**6. mark/mkmk feature scoping** + +The `mark` and `mkmk` features are registered under `deva` (for CoreText) but **not** `dev2`. Under `dev2`, all mark positioning goes through `abvm` instead. This prevents double-application on HarfBuzz/DirectWrite where `abvm` already contains the same mark/mkmk lookups. + +``` +# GPOS features per script: +# dev2/dflt: abvm kern +# deva/dflt: abvm kern mark mkmk +``` + +#### Practical rules + +1. **Standalone lookups**: define all substitution/positioning lookups (e.g. `DevaConsonantMap`, `DevaVowelDecomp`, `ComplexReph`) **outside** any feature block, then reference from both `locl`/`ccmp` and script-specific features. +2. **locl mirrors ccmp** for Devanagari: DirectWrite skips `ccmp`, so anything that must run early (consonant mapping, anusvara upper, vowel decomposition) must also be in `locl`. +3. **abvs post-reordering fallbacks**: rules that depend on matra+anusvara adjacency (broken by reordering on CoreText) need wildcard-gap variants in `abvs`. +4. **Separate lookup passes**: if rule B's backtrack context depends on rule A's output at an adjacent position, put them in separate named lookups. CoreText may not propagate within-pass substitutions. +5. **Named GPOS lookups**: all contextual GPOS rules must use named lookups to avoid double-application across dev2/deva. +6. **MarkToMark for multi-mark stacking**: never rely on shaper heuristics for positioning multiple marks on the same base — always provide explicit MarkToMark. Source: [Microsoft Devanagari shaping spec](https://learn.microsoft.com/en-us/typography/script-development/devanagari) diff --git a/OTFbuild/calligra_font_tests.odt b/OTFbuild/calligra_font_tests.odt index 17d1296f6fc0a20933a54cc002e12a7a21dbcc09..0e47f490000d9d628c44f301d690026e78a40527 100644 GIT binary patch delta 15993 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