Repository navigation
Conversation
) Step 6, part 2b of #412. The managed reader of #466 skipped OpenType fonts with CFF outlines, which many .otf files have, so a text in such a font fell back to the default face. The new internal CffOutlines reads the "CFF " table: - INDEX and DICT structures, the FontMatrix (which is stored rounded, e.g. 0.00048828 for 1/2048) - the Type 2 charstring interpreter: all path operators including the specialized curves and lines, flex, hflex, hflex1, flex1, local and global subroutines with their bias, widths, hints and hint masks (skipped, they do not change the outline), the arithmetic operators - CID-keyed fonts with FDArray and FDSelect (formats 0 and 3) The cubic curves go into the GDI+ path data unchanged. Not supported: CFF2 (variable OpenType fonts) and the deprecated accent composition of endchar (seac). TrueTypeFont gets HasCffOutlines and HasOutlines, and ManagedFontProvider indexes .otf and .otc files too. Tests: make_cff_test_fonts.py makes two small test fonts from a subset of Inter (SIL OFL 1.1): InterCffTest.otf rewritten to use subroutines, the specialized operators, flex and hint masks, and InterCidTest.otf, the same glyphs as a CID-keyed font with two font dicts. The outlines of both are compared command by command with fontTools. Checked locally against fontTools on 18,672 glyphs of the 47 CFF fonts of the Linux container, 7 of them CID-keyed: all equal. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YXvDW91oXpy7RquGHNxgR5
This was referenced Oct 15, 2026
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Step 6 of #412, part 2b.
Stacked on #468 (which is stacked on #466). The base is
feature/font-service, so the diff shows only this part. It is also merged intointegration/issue-412(#467).Why
The managed reader of #466/#468 skipped OpenType fonts with CFF outlines. Many
.otffiles are such fonts, so a text in one of them fell back to the default face. #468 named this as a behaviour change for the release notes; with this PR that limitation is gone.What
New internal
CADability/CffOutlines.csreads theCFFtable:0.00048828for 1/2048), so a factor within 0.1 % of 1 counts as 1.hvcurveto,vhcurveto,hhcurveto,vvcurveto,hlineto,vlineto,rcurveline,rlinecurve);flex,hflex,hflex1,flex1;FDArraywith a private dict and local subroutines per font dict, andFDSelectformats 0 and 3.The cubic curves go into the GDI+ path data unchanged, so
GlyphShapeBuildergets exact curves as for TrueType.Other changes:
TrueTypeFontgetsHasCffOutlinesandHasOutlines.ManagedFontProvideralso indexes.otfand.otcfiles.Not supported:
CFF2table. Such fonts are still left out.endchar(seac), which modern fonts do not use.Tests
make_cff_test_fonts.pymakes two small test fonts (about 12 KB each) from a subset of Inter (SIL OFL 1.1, registered inREUSE.toml). Inter as shipped uses only the general operators, so the script rewrites the charstrings without changing the outlines:InterCffTest.otf(name-keyed) uses the specialized operators,flex, hint masks, and local and global subroutines;InterCidTest.otfhas the same glyphs as a CID-keyed font with two font dicts, each with its own local subroutines.The script asserts with fontTools that both fonts draw exactly the outlines of the original subset.
New
CffOutlinesTests:.otf;Textin an OpenType font through theManagedFontProvider.Mutation check. I broke the interpreter deliberately in four places: the subroutine bias,
flex, the fifth operand ofhvcurveto, andFDSelect. Each break made a test fail; theFDSelectone only the CID test, as intended.Checked locally, not in CI:
Local run on Linux:
CADability.Tests: 638 passed, 12 skipped, 0 failed.CADability.ImportTests: 88 passed, 0 skipped, 0 failed.CADability.Formsbuild.No public API change in this part and no change to the csproj version.
🤖 Generated with Claude Code
https://claude.ai/code/session_01YXvDW91oXpy7RquGHNxgR5
Generated by Claude Code