Skip to content

Fix getVariation() for WOFF and WOFF2 fonts - #377

Closed
lehni wants to merge 1 commit into
foliojs:masterfrom
lineto:fix/woff-getvariation
Closed

lehni wants to merge 1 commit into
foliojs:masterfrom
lineto:fix/woff-getvariation

Conversation

@lehni

@lehni lehni commented May 21, 2026

Copy link
Copy Markdown
Contributor

The getVariation() API was broken for compressed source formats: WOFF threw because the variation constructor was always plain SFNT and couldn't reparse the directory, and WOFF2 silently returned default-instance glyphs because the transformed-glyf path bypassed the variation pipeline entirely.

  • WOFF previously crashed; WOFF2 silently returned default-instance glyphs
  • Variations now keep the original source format instead of falling back to plain SFNT
  • WOFF tables are decompressed up front so internal offsets stay valid for variation processing
  • WOFF2 transformed glyphs now flow through the variation pipeline
  • Source state is shared across variations so brotli/inflate doesn't re-run per call

Tests cover TTF/WOFF/WOFF2 parity for the upstream variable fixtures (gvar point sharing, HVAR advance variation, HVAR fallback), plus invariants: subclass is preserved, source font isn't mutated, and repeated calls with the same coords are stable.

- WOFF previously crashed; WOFF2 silently returned default-instance glyphs
- Variations now keep the original source format instead of falling back to plain SFNT
- WOFF tables are decompressed up front so internal offsets stay valid for variation processing
- WOFF2 transformed glyphs now flow through the variation pipeline
- Source state is shared across variations so brotli/inflate doesn't re-run per call, while each variation keeps its own glyph caches
@lehni
lehni force-pushed the fix/woff-getvariation branch from 7816a1e to 356b8fc Compare October 19, 2026 08:09
lehni added a commit to lineto/fontkit that referenced this pull request Oct 19, 2026
- A variation shared the parent font's cache of glyphs requested with other code points, such as ligatures, and returned the parent's glyphs (foliojs#377)
- Reset it along with the glyph cache when cloning the font
- Add a test requesting a glyph with other code points from a variation
@lehni

lehni commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor Author

Closing in favour of #389, which handles WOFF2 composite glyphs and phantom points correctly and builds each variation as a fresh font. Thanks @sidorares for the thorough comparison. Could you please address the review on #389 and rebase it, so it can be merged soon?

@lehni lehni closed this Oct 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant