Branch: refs/heads/avar2-instancing
Home:
https://github.com/fonttools/fonttools
Commit: d28b407429fed86e85354237e57f6ca9e6778f78
https://github.com/fonttools/fonttools/commit/d28b407429fed86e85354237e57f6ca9e6778f78
Author: Harry Dalton <
harry....@daltonmaag.com>
Date: 2025-09-19 (Fri, 19 Sep 2025)
Changed paths:
M Lib/fontTools/feaLib/builder.py
M Lib/fontTools/feaLib/variableScalar.py
Log Message:
-----------
Fix interpolation, and allow for common operations on pre-compiled fonts
(aims to facilitate googlefonts/ufo2ft#945)
Previously, calculating an individual interpolated value did not account
for avar mapping. This commit fixes this, as well as allowing for
interpolation and other common operations to be performed on fonts prior
to compilation by decoupling from the exact ttLib representations of
axes.
Some refactoring has been undergone to assist with this, including
adding some more types and docs, and splitting the builder into a
separate class to limit the amount of state in the VariableScalar class
itself.
The fonttools and ufo2ft test suites pass with these changes, although
there is no coverage for the designspace-based interpolation yet. This
should be introduced before merging.
Commit: 41ebf1f1fe3ee9858778737c3250baf17c21b9e0
https://github.com/fonttools/fonttools/commit/41ebf1f1fe3ee9858778737c3250baf17c21b9e0
Author: Harry Dalton <
harry....@daltonmaag.com>
Date: 2025-09-19 (Fri, 19 Sep 2025)
Changed paths:
M Lib/fontTools/designspaceLib/__init__.py
Log Message:
-----------
Add partial AxisDescriptor typing
Commit: 888d7fbea41778153c3d221bdce2956ebbe3b222
https://github.com/fonttools/fonttools/commit/888d7fbea41778153c3d221bdce2956ebbe3b222
Author: Harry Dalton <
harry....@daltonmaag.com>
Date: 2025-09-19 (Fri, 19 Sep 2025)
Changed paths:
M Lib/fontTools/varLib/models.py
Log Message:
-----------
Type linear mapping function
Commit: 3ce01a02a83d3b6a9e4b1ea9368a6dfebdfa6d29
https://github.com/fonttools/fonttools/commit/3ce01a02a83d3b6a9e4b1ea9368a6dfebdfa6d29
Author: Harry Dalton <
harry....@daltonmaag.com>
Date: 2025-09-19 (Fri, 19 Sep 2025)
Changed paths:
M Lib/fontTools/feaLib/variableScalar.py
Log Message:
-----------
Fix type checking related crash for pre-`Self` Python
Commit: 3b9dcdfe06961c02ab10d771753a8fae2e264d49
https://github.com/fonttools/fonttools/commit/3b9dcdfe06961c02ab10d771753a8fae2e264d49
Author: Harry Dalton <
harry....@daltonmaag.com>
Date: 2025-09-19 (Fri, 19 Sep 2025)
Changed paths:
M Lib/fontTools/feaLib/builder.py
Log Message:
-----------
Allow for modern type annotations
Commit: 78b71a5e038426550aa5f5fcbaf5ceb5f0ce33e8
https://github.com/fonttools/fonttools/commit/78b71a5e038426550aa5f5fcbaf5ceb5f0ce33e8
Author: Harry Dalton <
harry....@daltonmaag.com>
Date: 2025-09-19 (Fri, 19 Sep 2025)
Changed paths:
M Lib/fontTools/designspaceLib/__init__.py
Log Message:
-----------
Fix and improve partial axis descriptor typing
Commit: 7d31b1cfccc0aaa17812230517fa48e21e80e1c0
https://github.com/fonttools/fonttools/commit/7d31b1cfccc0aaa17812230517fa48e21e80e1c0
Author: Harry Dalton <
harry....@daltonmaag.com>
Date: 2025-09-19 (Fri, 19 Sep 2025)
Changed paths:
M Lib/fontTools/feaLib/variableScalar.py
Log Message:
-----------
Iterate over mapping as guaranteed list instead of optional dict
Commit: e02295b6eb25b5c60890f729be1fece42b500f60
https://github.com/fonttools/fonttools/commit/e02295b6eb25b5c60890f729be1fece42b500f60
Author: Harry Dalton <
harry....@daltonmaag.com>
Date: 2025-09-19 (Fri, 19 Sep 2025)
Changed paths:
M Tests/feaLib/variableScalar_test.py
Log Message:
-----------
Test interpolation of single variable scalar value from designspace
Commit: 9caa12715c17ca5b846c6a640aaa5d3503fdbaa2
https://github.com/fonttools/fonttools/commit/9caa12715c17ca5b846c6a640aaa5d3503fdbaa2
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-15 (Sun, 15 Feb 2026)
Changed paths:
M Lib/fontTools/cffLib/__init__.py
Log Message:
-----------
[cffLib] Don't use eval() (#4040)
Fixes
https://github.com/fonttools/fonttools/issues/4039
Commit: f5e56eb8ac63ba97ff053dc90d203ba0c98f889a
https://github.com/fonttools/fonttools/commit/f5e56eb8ac63ba97ff053dc90d203ba0c98f889a
Author: gregm24 <
14472229...@users.noreply.github.com>
Date: 2026-02-15 (Sun, 15 Feb 2026)
Changed paths:
M Lib/fontTools/colorLib/builder.py
M Tests/colorLib/builder_test.py
Log Message:
-----------
colorLib: validate base glyphs before sorting to avoid KeyError
Commit: 7298bad14fb01cf572fbe6bfeedb9fd949e3836f
https://github.com/fonttools/fonttools/commit/7298bad14fb01cf572fbe6bfeedb9fd949e3836f
Author: gregm24 <
14472229...@users.noreply.github.com>
Date: 2026-02-15 (Sun, 15 Feb 2026)
Changed paths:
M Lib/fontTools/colorLib/builder.py
Log Message:
-----------
Fix black formatting
Commit: ec29421964dda6e8e28a2ef12ec37a9154a579fc
https://github.com/fonttools/fonttools/commit/ec29421964dda6e8e28a2ef12ec37a9154a579fc
Author: gregm24 <
14472229...@users.noreply.github.com>
Date: 2026-02-15 (Sun, 15 Feb 2026)
Changed paths:
M Lib/fontTools/colorLib/builder.py
M Tests/colorLib/builder_test.py
Log Message:
-----------
Apply Black formatting
Commit: 06197442582b967bc06a86073caf4dcc7e1624dc
https://github.com/fonttools/fonttools/commit/06197442582b967bc06a86073caf4dcc7e1624dc
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-02-25 (Wed, 25 Feb 2026)
Changed paths:
M Lib/fontTools/svgLib/path/shapes.py
M Tests/svgLib/path/path_test.py
Log Message:
-----------
[svgLib] Skip non-element nodes (comments, PIs) when drawing SVG paths
When iterating over SVG elements, XML comment and processing instruction
nodes have a non-string tag (a callable), which caused a TypeError in
_strip_xml_ns(). Skip these nodes early in add_path_from_element().
Fixes #4042
Commit: 5897e01978928262fa6f8323e6f58ec8b05d37f6
https://github.com/fonttools/fonttools/commit/5897e01978928262fa6f8323e6f58ec8b05d37f6
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-02-25 (Wed, 25 Feb 2026)
Changed paths:
M Doc/source/ttLib/tables.rst
R Doc/source/ttLib/tables/G_M_A_P_.rst
R Doc/source/ttLib/tables/G_P_K_G_.rst
R Doc/source/ttLib/tables/M_E_T_A_.rst
R Doc/source/ttLib/tables/S_I_N_G_.rst
R Lib/fontTools/ttLib/tables/G_M_A_P_.py
R Lib/fontTools/ttLib/tables/G_P_K_G_.py
R Lib/fontTools/ttLib/tables/M_E_T_A_.py
R Lib/fontTools/ttLib/tables/S_I_N_G_.py
M Lib/fontTools/ttLib/tables/__init__.py
M Lib/fontTools/ttLib/ttFont.py
Log Message:
-----------
[ttLib] Remove Adobe SING Glyphlet tables (META, SING, GMAP, GPKG)
Remove support for Adobe's defunct SING (Smart INdependent Glyphlets)
technology. SING was proposed around 2005 and supported in InDesign
for a time, but support was killed in InDesign CS5 (per Thomas Phinney).
The technology never gained traction and has been dead for over a decade.
The META table module also contained uses of eval() that were flagged
as a security vulnerability.
References:
-
https://typedrawers.com/discussion/5283/whatever-happened-to-adobes-sing-proposal
-
https://docslib.org/doc/4382139/adobe-tech-note-5148
Commit: 7e5a672aed2a6b22087c446440c1bd8a616b969e
https://github.com/fonttools/fonttools/commit/7e5a672aed2a6b22087c446440c1bd8a616b969e
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-02-25 (Wed, 25 Feb 2026)
Changed paths:
M Doc/source/ttLib/tables.rst
R Doc/source/ttLib/tables/G_M_A_P_.rst
R Doc/source/ttLib/tables/G_P_K_G_.rst
R Doc/source/ttLib/tables/M_E_T_A_.rst
R Doc/source/ttLib/tables/S_I_N_G_.rst
R Lib/fontTools/ttLib/tables/G_M_A_P_.py
R Lib/fontTools/ttLib/tables/G_P_K_G_.py
R Lib/fontTools/ttLib/tables/M_E_T_A_.py
R Lib/fontTools/ttLib/tables/S_I_N_G_.py
M Lib/fontTools/ttLib/tables/__init__.py
M Lib/fontTools/ttLib/ttFont.py
Log Message:
-----------
Merge pull request #4044 from fonttools/delete-defunct-adobe-sing-glyphlets
Commit: 33a1011b2411b2e53ea00788a06778761a520e05
https://github.com/fonttools/fonttools/commit/33a1011b2411b2e53ea00788a06778761a520e05
Author: Just van Rossum <
justva...@gmail.com>
Date: 2026-02-25 (Wed, 25 Feb 2026)
Changed paths:
M Lib/fontTools/svgLib/path/shapes.py
M Tests/svgLib/path/path_test.py
Log Message:
-----------
Merge pull request #4043 from fonttools/fix-svg-comment-crash
[svgLib] Skip non-element nodes (comments, PIs) when drawing SVG paths
Commit: 66771c3cc50a5fdd5b210c8d4184509b26ebd069
https://github.com/fonttools/fonttools/commit/66771c3cc50a5fdd5b210c8d4184509b26ebd069
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatable.py
Log Message:
-----------
[varLib.interpolatable] Fix swapped m0/m1 nodeTypes assignment
The variables m0 and m1 were assigned to the wrong glyphs (m0=glyph1,
m1=glyph0), causing PATH_COUNT, NODE_COUNT, and NODE_INCOMPATIBILITY
error reports to swap the values relative to their master names.
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: db7335e0191616a9d9edd796501c843f7f6a2126
https://github.com/fonttools/fonttools/commit/db7335e0191616a9d9edd796501c843f7f6a2126
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatable.py
Log Message:
-----------
[varLib.interpolatable] Fix duplicate kink-detector condition to check next points
The second off-curve check was an exact duplicate of the first (both
checked pt0_prev/pt1_prev). The second should check pt0_next/pt1_next.
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: 7d035b3b9b7e7cabb1992634600a675e7f380416
https://github.com/fonttools/fonttools/commit/7d035b3b9b7e7cabb1992634600a675e7f380416
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatable.py
Log Message:
-----------
[varLib.interpolatable] Fix typo: countor_idx -> contour_idx
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: d4a5ff999d4637d4034fc9c5f75ddffedf6c394b
https://github.com/fonttools/fonttools/commit/d4a5ff999d4637d4034fc9c5f75ddffedf6c394b
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatable.py
Log Message:
-----------
[varLib.interpolatable] Fix enumerate bug in CFF2 vsindex parsing
Using `for op in enumerate(cs.program)` made op a tuple (index, value),
so the string comparisons `op == "blend"` and `op == "vsindex"` never
matched.
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: fb620976f83145ed3cd0ad968e3271c5ac1f0b11
https://github.com/fonttools/fonttools/commit/fb620976f83145ed3cd0ad968e3271c5ac1f0b11
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatable.py
Log Message:
-----------
[varLib.interpolatable] Add comment that OVERWEIGHT check is disabled
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: cf5c821780be2957584076a109552c269e8d1abf
https://github.com/fonttools/fonttools/commit/cf5c821780be2957584076a109552c269e8d1abf
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatable.py
Log Message:
-----------
[varLib.interpolatable] Fix octal format specifier for node number
Node number was printed in octal (%o) instead of decimal (%d).
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: 6cb4730eb36f8e55bc88fbcb9665a649cbda4c3c
https://github.com/fonttools/fonttools/commit/6cb4730eb36f8e55bc88fbcb9665a649cbda4c3c
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatable.py
Log Message:
-----------
[varLib.interpolatable] Fix always-true glyph existence check
Glyph objects are never None (they use a doesnt_exist flag instead),
so `glyph is not None` was always true, defeating the early-skip logic.
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: f0b60fa7ead0c5f7af8852514e134053814951ac
https://github.com/fonttools/fonttools/commit/f0b60fa7ead0c5f7af8852514e134053814951ac
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatablePlot.py
Log Message:
-----------
[varLib.interpolatablePlot] Fix scale calculation copy-paste bug
In the glyph_width branch, the else case incorrectly constrained scale
using panel_height/glyph_height instead of panel_width/glyph_width.
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: a8df6a6fb4d6494d74ab77e07b9338ebbad79341
https://github.com/fonttools/fonttools/commit/a8df6a6fb4d6494d74ab77e07b9338ebbad79341
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatablePlot.py
Log Message:
-----------
[varLib.interpolatablePlot] Remove unused import wraps
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: dc8b3e55d6646b4ef1fcbe9562436623694ee6ad
https://github.com/fonttools/fonttools/commit/dc8b3e55d6646b4ef1fcbe9562436623694ee6ad
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatablePlot.py
Log Message:
-----------
[varLib.interpolatablePlot] Remove unused variable height in add_title_page
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: b24b8ab61573810398794c009418fe612d7894ac
https://github.com/fonttools/fonttools/commit/b24b8ab61573810398794c009418fe612d7894ac
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatablePlot.py
Log Message:
-----------
[varLib.interpolatablePlot] Fix variable shadowing in add_summary
Loop variable 'problems' shadowed the function parameter. Rename to
'glyph_problems'.
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: 92803d1403f70f8619f2a00784429fdbe6c90b2c
https://github.com/fonttools/fonttools/commit/92803d1403f70f8619f2a00784429fdbe6c90b2c
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatablePlot.py
Log Message:
-----------
[varLib.interpolatablePlot] Use InterpolatableProblem.NOTHING constant
Replace hardcoded "nothing" string with the proper constant.
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: 3294f9be757e8a4ae8d1594ef868bac51be22f03
https://github.com/fonttools/fonttools/commit/3294f9be757e8a4ae8d1594ef868bac51be22f03
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatablePlot.py
Log Message:
-----------
[varLib.interpolatablePlot] Fix unclosed file handle in SHA1 computation
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: f996d1df49d0a0cf3998904b454a8aa762d26723
https://github.com/fonttools/fonttools/commit/f996d1df49d0a0cf3998904b454a8aa762d26723
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatablePlot.py
Log Message:
-----------
[varLib.interpolatablePlot] Remove redundant explicit import
PerContourOrComponentPen and SimpleRecordingPointPen are already
imported via 'from .interpolatableHelpers import *'.
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: 9cc7440be7250d4a2972476da9883a49ece57ebe
https://github.com/fonttools/fonttools/commit/9cc7440be7250d4a2972476da9883a49ece57ebe
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatableTestStartingPoint.py
Log Message:
-----------
[varLib.interpolatableTestStartingPoint] Comment out unused meanX/meanY
These variables are assigned but never used (the translate call that
would use them is already commented out).
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: c1266b73f52d469a01af97f59e45c55ea710cfd4
https://github.com/fonttools/fonttools/commit/c1266b73f52d469a01af97f59e45c55ea710cfd4
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatableTestStartingPoint.py
Log Message:
-----------
[varLib.interpolatableTestStartingPoint] Guard against negative lambda2 before sqrt
Due to floating-point imprecision, the minor eigenvalue (lambda2) can
become slightly negative. Clamp to 0 to avoid ValueError from sqrt(),
matching the equivalent guard in interpolatableHelpers.transform_from_stats.
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: 61f393353b88183414efe216f4f4290ce3eece6a
https://github.com/fonttools/fonttools/commit/61f393353b88183414efe216f4f4290ce3eece6a
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatableTestContourOrder.py
Log Message:
-----------
[varLib.interpolatableTestContourOrder] Fix grammar: "a identity" -> "an identity"
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: e2e0f40948f9957ec713af9e4878f9a351165b9a
https://github.com/fonttools/fonttools/commit/e2e0f40948f9957ec713af9e4878f9a351165b9a
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatableTestContourOrder.py
Log Message:
-----------
[varLib.interpolatableTestContourOrder] Fix variable name: matching_control_reversed -> matching_green_reversed
The result of matching green vectors (not control vectors) was being
stored into matching_control_reversed, overwriting the earlier value.
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: c0f4ef733e5f490ccc7800b1cbf7452dea3ebe25
https://github.com/fonttools/fonttools/commit/c0f4ef733e5f490ccc7800b1cbf7452dea3ebe25
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatableTestContourOrder.py
Log Message:
-----------
[varLib.interpolatableTestContourOrder] Fix comment and avoid division by zero
Fix "worst" -> "best" in comment, and rewrite cost ratio comparison as
cross-multiplication to avoid potential division by zero.
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: e3dd2d214374f6933928502f7fab0ae030be6e70
https://github.com/fonttools/fonttools/commit/e3dd2d214374f6933928502f7fab0ae030be6e70
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatableTestContourOrder.py
Log Message:
-----------
[varLib.interpolatableTestContourOrder] Remove redundant inner 'if not done' check
The inner check was nested inside an identical outer check and could
never be false at that point.
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: ee46e6f814cf152323d34f7c267f74760d3da60a
https://github.com/fonttools/fonttools/commit/ee46e6f814cf152323d34f7c267f74760d3da60a
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatableTestContourOrder.py
Log Message:
-----------
[varLib.interpolatableTestContourOrder] Fix indentation after removing redundant guard
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: 490f2e38448040b7a79c6e053911dab66cc45aa0
https://github.com/fonttools/fonttools/commit/490f2e38448040b7a79c6e053911dab66cc45aa0
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatableHelpers.py
Log Message:
-----------
[varLib.interpolatableHelpers] Remove unused import Enum
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: 8edf5b368abf75c48619a9a9ed5e2946ecaddf62
https://github.com/fonttools/fonttools/commit/8edf5b368abf75c48619a9a9ed5e2946ecaddf62
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatableHelpers.py
Log Message:
-----------
[varLib.interpolatableHelpers] Fix misleading sort_problems docstring
The function only sorts by severity, not by glyph name or problem message.
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: 21656d0b1244abb3ff66027fe59fa75629c2152b
https://github.com/fonttools/fonttools/commit/21656d0b1244abb3ff66027fe59fa75629c2152b
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatableHelpers.py
Log Message:
-----------
[varLib.interpolatableHelpers] Use module logger instead of root logger
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: 5950752057ce96628e87e60715c2629ba1881a42
https://github.com/fonttools/fonttools/commit/5950752057ce96628e87e60715c2629ba1881a42
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatableHelpers.py
Log Message:
-----------
[varLib.interpolatableHelpers] Remove unused identity_matching variable
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: 71cb3002dd31be467bdea14dec1efdbeeefb0a15
https://github.com/fonttools/fonttools/commit/71cb3002dd31be467bdea14dec1efdbeeefb0a15
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatableHelpers.py
Log Message:
-----------
[varLib.interpolatableHelpers] Remove unused self._glyphset in PerContourPen
BasePen.__init__ already stores the glyphset as self.glyphSet.
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: 83c53094e2af9619fcd19a19f4188ac182b91496
https://github.com/fonttools/fonttools/commit/83c53094e2af9619fcd19a19f4188ac182b91496
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatableHelpers.py
Log Message:
-----------
[varLib.interpolatableHelpers] Remove unused transform_from_stats function
This function was never called anywhere. It also had a latent
ZeroDivisionError bug in the inverse branch when lambda2 <= 0.
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: 03d4bced75d2e61a6e02a4d7d46530e6226d6ee0
https://github.com/fonttools/fonttools/commit/03d4bced75d2e61a6e02a4d7d46530e6226d6ee0
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatableTestStartingPoint.py
Log Message:
-----------
[varLib.interpolatableTestStartingPoint] Blacken
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: 2bd18ff5d48ec9cc0bba42ef43c62ecc4f9f5d7a
https://github.com/fonttools/fonttools/commit/2bd18ff5d48ec9cc0bba42ef43c62ecc4f9f5d7a
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/models.py
Log Message:
-----------
[varLib.models] Fix getSubModel not forwarding extrapolate/axisRanges
When creating sub-models for handling None items, the extrapolate and
axisRanges settings were not passed through, causing sub-models to
silently fall back to default (-1, 1) ranges and no extrapolation.
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: adf2751148f036bd64d93442ca1d71fd18871557
https://github.com/fonttools/fonttools/commit/adf2751148f036bd64d93442ca1d71fd18871557
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/models.py
Log Message:
-----------
[varLib.models] Check location uniqueness after stripping zeros
Move the uniqueness check to after zero-valued axes are stripped from
locations. Previously, locations like {} and {'wght': 0.0} would pass
the uniqueness check but become identical after zero-stripping, causing
the model to silently map both to the same master index.
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: 0c05a96faebac89a9c5797f38d29c0fd44fc13b4
https://github.com/fonttools/fonttools/commit/0c05a96faebac89a9c5797f38d29c0fd44fc13b4
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/models.py
Log Message:
-----------
[varLib.models] Fix typo: participte -> participate
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: 3b03ea6fdaca7de99224127c892b6cc061472da9
https://github.com/fonttools/fonttools/commit/3b03ea6fdaca7de99224127c892b6cc061472da9
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/__init__.py
Log Message:
-----------
[varLib] Fix typo in comment: -0x8000 is -32768, not -36768
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: a10469e527e9b43d201ec6ee97b724ed427ac0f1
https://github.com/fonttools/fonttools/commit/a10469e527e9b43d201ec6ee97b724ed427ac0f1
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/__init__.py
Log Message:
-----------
[varLib] Remove redundant newTable("GDEF") in _merge_OTL
The first newTable("GDEF") was immediately overwritten by the next line.
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: 6f497586c0dc17b3387c8c6735c81a245d8c565e
https://github.com/fonttools/fonttools/commit/6f497586c0dc17b3387c8c6735c81a245d8c565e
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/__init__.py
Log Message:
-----------
[varLib] Remove dead 'count = 0' assignment in drop_implied_oncurve_points
The variable was assigned twice; the first assignment was immediately
overwritten without being read.
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: 7d93d63369ac6a257a1373ccabef1c4d21274051
https://github.com/fonttools/fonttools/commit/7d93d63369ac6a257a1373ccabef1c4d21274051
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-02-27 (Fri, 27 Feb 2026)
Changed paths:
M Lib/fontTools/varLib/__init__.py
Log Message:
-----------
[varLib] Fix --variable-fonts filter: pass skip_vf to build_many
The --variable-fonts regex was used to filter the output paths but not
passed to build_many(), so all VFs were built regardless. This wasted
time and caused a KeyError when trying to save filtered-out VFs.
Co-Authored-By: Claude Opus 4.6 (1M context) <
nor...@anthropic.com>
Commit: 6276cd968a77542e9f3a19652e07f55ed28a84b3
https://github.com/fonttools/fonttools/commit/6276cd968a77542e9f3a19652e07f55ed28a84b3
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-03-03 (Tue, 03 Mar 2026)
Changed paths:
M Lib/fontTools/varLib/avar/build.py
M Tests/varLib/avar_test.py
Log Message:
-----------
[avar] Preserve existing name table in build
Commit: 6ba2dccf7f2728c0b8ff359a8ba24ff4f8ea64e9
https://github.com/fonttools/fonttools/commit/6ba2dccf7f2728c0b8ff359a8ba24ff4f8ea64e9
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-03-03 (Tue, 03 Mar 2026)
Changed paths:
M Lib/fontTools/varLib/avar/unbuild.py
M Tests/varLib/avar_test.py
Log Message:
-----------
[avar] Keep unbuild return types consistent
Commit: 9590f539aefbcc9c82b8fedb2fb4b6b75122039a
https://github.com/fonttools/fonttools/commit/9590f539aefbcc9c82b8fedb2fb4b6b75122039a
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-03-03 (Tue, 03 Mar 2026)
Changed paths:
M Lib/fontTools/varLib/avar/unbuild.py
M Tests/varLib/avar_test.py
Log Message:
-----------
[avar] Fall back to axis tags in unbuild
Commit: 045d2f9589dc1201fe9bdf34ea7209193787540e
https://github.com/fonttools/fonttools/commit/045d2f9589dc1201fe9bdf34ea7209193787540e
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-03-03 (Tue, 03 Mar 2026)
Changed paths:
M Lib/fontTools/varLib/avar/map.py
M Tests/varLib/avar_test.py
Log Message:
-----------
[avar] Validate map CLI coordinates
Commit: 624a75fdf85c1f71fcee1fb0329baae9502eb691
https://github.com/fonttools/fonttools/commit/624a75fdf85c1f71fcee1fb0329baae9502eb691
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-03-03 (Tue, 03 Mar 2026)
Changed paths:
M Lib/fontTools/cu2qu/ufo.py
M Tests/cu2qu/ufo_test.py
Log Message:
-----------
[cu2qu] Reject non-positive UFO tolerances
Commit: 6b11c4edb571afffc65afddda8ebf320abf6694f
https://github.com/fonttools/fonttools/commit/6b11c4edb571afffc65afddda8ebf320abf6694f
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-03-03 (Tue, 03 Mar 2026)
Changed paths:
M Lib/fontTools/cu2qu/cu2qu.py
M Tests/cu2qu/cu2qu_test.py
Log Message:
-----------
[cu2qu] Validate curves_to_quadratic inputs
Commit: ae46bf0a1ff48249337b944b86e66462892311bf
https://github.com/fonttools/fonttools/commit/ae46bf0a1ff48249337b944b86e66462892311bf
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-03-03 (Tue, 03 Mar 2026)
Changed paths:
M Lib/fontTools/cu2qu/ufo.py
M Tests/cu2qu/ufo_test.py
Log Message:
-----------
[cu2qu] Validate UFO tolerance list lengths
Commit: b888074867997d8c7f6d4260e51f62e29fe5a3a7
https://github.com/fonttools/fonttools/commit/b888074867997d8c7f6d4260e51f62e29fe5a3a7
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-03-03 (Tue, 03 Mar 2026)
Changed paths:
M Lib/fontTools/cu2qu/cu2qu.py
Log Message:
-----------
[cu2qu] Fix public API docs
Commit: 372a176d888aabb08138ff3f6b5f57c18db1e9e4
https://github.com/fonttools/fonttools/commit/372a176d888aabb08138ff3f6b5f57c18db1e9e4
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-03-03 (Tue, 03 Mar 2026)
Changed paths:
M Lib/fontTools/qu2cu/qu2cu.py
M Tests/qu2cu/qu2cu_test.py
Log Message:
-----------
[qu2cu] Validate spline input boundaries
Commit: f111bc6014e94f293d86eb8b627653fbda00ca26
https://github.com/fonttools/fonttools/commit/f111bc6014e94f293d86eb8b627653fbda00ca26
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-03-03 (Tue, 03 Mar 2026)
Changed paths:
M Lib/fontTools/qu2cu/cli.py
M Tests/qu2cu/qu2cu_cli_test.py
Log Message:
-----------
[qu2cu] Reject variable fonts without asserts
Commit: d5be21bb531ae53f058c190c647abc75f6141e69
https://github.com/fonttools/fonttools/commit/d5be21bb531ae53f058c190c647abc75f6141e69
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-03-03 (Tue, 03 Mar 2026)
Changed paths:
M Lib/fontTools/qu2cu/qu2cu.py
M Tests/qu2cu/qu2cu_test.py
Log Message:
-----------
[qu2cu] Validate spline lengths
Commit: 372d1552857a5bc3053e4b03eea6d0e6b071ca81
https://github.com/fonttools/fonttools/commit/372d1552857a5bc3053e4b03eea6d0e6b071ca81
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-03-03 (Tue, 03 Mar 2026)
Changed paths:
M Lib/fontTools/qu2cu/qu2cu.py
Log Message:
-----------
[qu2cu] Document input validation
Commit: 8ea54fdab361975940ad410665d48f5ef997fb85
https://github.com/fonttools/fonttools/commit/8ea54fdab361975940ad410665d48f5ef997fb85
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-03-03 (Tue, 03 Mar 2026)
Changed paths:
M Lib/fontTools/qu2cu/cli.py
M Lib/fontTools/qu2cu/qu2cu.py
M Tests/qu2cu/qu2cu_cli_test.py
M Tests/qu2cu/qu2cu_test.py
Log Message:
-----------
[qu2cu] Reject non-positive tolerances
Commit: 7cf67099bccfa15adeb451d36cde7dd9ea3df3f2
https://github.com/fonttools/fonttools/commit/7cf67099bccfa15adeb451d36cde7dd9ea3df3f2
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-03 (Tue, 03 Mar 2026)
Changed paths:
M Lib/fontTools/feaLib/variableScalar.py
M Tests/feaLib/variableScalar_test.py
Log Message:
-----------
[feaLib] Pass axisOrder to VariationModel in VariableScalar.model()
VariableScalar.model() was creating a VariationModel without passing
axisOrder, so VariationModel defaulted to alphabetical axis tag order.
This produces different variation deltas than compilers that use
source-file axis order (e.g. fontc uses fvar order), leading to 1-unit
rounding differences in the final font binary.
The fix derives axisOrder from self.axes, which is already set in fvar
order by feaLib.builder.makeVariablePos() before model() is called.
Observed on NotoSans.glyphspackage: 6 GPOS mark attachment deltas
differed by 1 unit on J.salt and derivatives due to the brace layer
delta landing exactly on a .5 boundary with different floating-point
accumulation depending on axis order.
Commit: 2d018c34e250b6bfe1eda70979a74e6cda4d33d4
https://github.com/fonttools/fonttools/commit/2d018c34e250b6bfe1eda70979a74e6cda4d33d4
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-03 (Tue, 03 Mar 2026)
Changed paths:
M Lib/fontTools/feaLib/variableScalar.py
M Tests/feaLib/variableScalar_test.py
Log Message:
-----------
[feaLib] Round deltas iteratively in VariableScalar.add_to_variation_store()
VariableScalar.add_to_variation_store() was calling getDeltasAndSupports()
with the default round=noRound, then rounding all deltas at the end in
storeDeltas(). This bypasses the iterative rounding fix from #2214, where
each delta is rounded before it participates in subsequent delta
computations.
Now pass round=round to getDeltasAndSupports() to enable iterative
rounding during delta computation, and round=noRound to storeDeltas()
since deltas are already rounded.
This matches the behavior of OnlineVarStoreBuilder.storeMasters() and
fontc's VariationModel::deltas(), both of which round iteratively.
Commit: eeed958f686aab54bb56576cc8875025e1f7bf3e
https://github.com/fonttools/fonttools/commit/eeed958f686aab54bb56576cc8875025e1f7bf3e
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-03-03 (Tue, 03 Mar 2026)
Changed paths:
M Lib/fontTools/feaLib/variableScalar.py
M Tests/feaLib/variableScalar_test.py
Log Message:
-----------
Merge pull request #4053 from fonttools/fix-variablescalar-model
[feaLib] Fix VariableScalar axis ordering and delta rounding
Commit: 3b0b745750a52821329c88ada8efb09b62135f39
https://github.com/fonttools/fonttools/commit/3b0b745750a52821329c88ada8efb09b62135f39
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-03-03 (Tue, 03 Mar 2026)
Changed paths:
M Lib/fontTools/varLib/avar/build.py
M Lib/fontTools/varLib/avar/map.py
M Lib/fontTools/varLib/avar/unbuild.py
M Tests/varLib/avar_test.py
Log Message:
-----------
Merge pull request #4051 from fonttools/avar-bugfix
Avar bugfix
Commit: d03aab682a3e5890ff59f3e6c8255f597fe4bf1a
https://github.com/fonttools/fonttools/commit/d03aab682a3e5890ff59f3e6c8255f597fe4bf1a
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-03-03 (Tue, 03 Mar 2026)
Changed paths:
M Tests/qu2cu/qu2cu_cli_test.py
Log Message:
-----------
black
Commit: fd80a70968dcced2daf296bb211ee15fd4e63351
https://github.com/fonttools/fonttools/commit/fd80a70968dcced2daf296bb211ee15fd4e63351
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-03-03 (Tue, 03 Mar 2026)
Changed paths:
M Tests/varLib/models_test.py
Log Message:
-----------
[varLib.models] Add regression tests for branch fixes
Commit: b0a092ac58c688eadcca5803356239288ebc8945
https://github.com/fonttools/fonttools/commit/b0a092ac58c688eadcca5803356239288ebc8945
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-03-03 (Tue, 03 Mar 2026)
Changed paths:
M Lib/fontTools/varLib/__init__.py
Log Message:
-----------
[varLib] Use selected VF set for skip_vf
Commit: 02a742fdb62fe2266905980b01836618fd827941
https://github.com/fonttools/fonttools/commit/02a742fdb62fe2266905980b01836618fd827941
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-03-03 (Tue, 03 Mar 2026)
Changed paths:
M Lib/fontTools/cu2qu/cu2qu.py
M Lib/fontTools/cu2qu/ufo.py
M Lib/fontTools/qu2cu/cli.py
M Lib/fontTools/qu2cu/qu2cu.py
M Tests/cu2qu/cu2qu_test.py
M Tests/cu2qu/ufo_test.py
M Tests/qu2cu/qu2cu_cli_test.py
M Tests/qu2cu/qu2cu_test.py
Log Message:
-----------
Merge pull request #4052 from fonttools/cu2qu-qu2cu-bugfix
Cu2qu qu2cu bugfix
Commit: 428327e4764eb8d19fee5fb1c37ef86b03233e02
https://github.com/fonttools/fonttools/commit/428327e4764eb8d19fee5fb1c37ef86b03233e02
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-03-03 (Tue, 03 Mar 2026)
Changed paths:
M Lib/fontTools/varLib/models.py
M Tests/varLib/models_test.py
Log Message:
-----------
Merge pull request #4047 from fonttools/varLib.models-bugfixes
[varLib.models] bugfixes
Commit: 686b8fce1fbd254c22102feea328994e7e1b71f1
https://github.com/fonttools/fonttools/commit/686b8fce1fbd254c22102feea328994e7e1b71f1
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-03-03 (Tue, 03 Mar 2026)
Changed paths:
M Lib/fontTools/varLib/__init__.py
Log Message:
-----------
Merge pull request #4048 from fonttools/varLib-bugfixes
[`varLib.__init__`] bugfixes
Commit: 5da76d73514e0b405292ba9809b60d45977632a2
https://github.com/fonttools/fonttools/commit/5da76d73514e0b405292ba9809b60d45977632a2
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-03-04 (Wed, 04 Mar 2026)
Changed paths:
M Lib/fontTools/varLib/interpolatable.py
M Lib/fontTools/varLib/interpolatableHelpers.py
M Lib/fontTools/varLib/interpolatablePlot.py
M Lib/fontTools/varLib/interpolatableTestContourOrder.py
M Lib/fontTools/varLib/interpolatableTestStartingPoint.py
Log Message:
-----------
Merge pull request #4046 from fonttools/interpolatable-bugfixes
[`varLib.interpolatable`] bugfixes
Commit: 1c385c6154ec0b9dbd08169a8bab33299b7663af
https://github.com/fonttools/fonttools/commit/1c385c6154ec0b9dbd08169a8bab33299b7663af
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-05 (Thu, 05 Mar 2026)
Changed paths:
M .github/workflows/test.yml
M .github/workflows/wheels.yml
M Doc/source/designspaceLib/xml.rst
M Doc/source/misc/index.rst
A Doc/source/misc/visitor.rst
M Doc/source/ttLib/index.rst
M Doc/source/ttLib/tables.rst
R Doc/source/ttLib/tables/G_M_A_P_.rst
R Doc/source/ttLib/tables/G_P_K_G_.rst
R Doc/source/ttLib/tables/M_E_T_A_.rst
R Doc/source/ttLib/tables/S_I_N_G_.rst
A Doc/source/ttLib/ttVisitor.rst
M Lib/fontTools/__init__.py
M Lib/fontTools/cffLib/CFF2ToCFF.py
M Lib/fontTools/cffLib/__init__.py
M Lib/fontTools/cu2qu/cu2qu.py
M Lib/fontTools/cu2qu/ufo.py
M Lib/fontTools/designspaceLib/__init__.py
A Lib/fontTools/diff/__init__.py
A Lib/fontTools/diff/__main__.py
A Lib/fontTools/diff/color.py
A Lib/fontTools/diff/diff.py
A Lib/fontTools/diff/utils.py
M Lib/fontTools/feaLib/builder.py
M Lib/fontTools/feaLib/parser.py
M Lib/fontTools/feaLib/variableScalar.py
M Lib/fontTools/fontBuilder.py
M Lib/fontTools/misc/bezierTools.py
M Lib/fontTools/misc/configTools.py
M Lib/fontTools/misc/fixedTools.py
M Lib/fontTools/misc/visitor.py
M Lib/fontTools/misc/xmlWriter.py
M Lib/fontTools/otlLib/builder.py
M Lib/fontTools/pens/pointPen.py
M Lib/fontTools/qu2cu/cli.py
M Lib/fontTools/qu2cu/qu2cu.py
M Lib/fontTools/subset/__init__.py
M Lib/fontTools/subset/svg.py
M Lib/fontTools/svgLib/path/shapes.py
M Lib/fontTools/ttLib/removeOverlaps.py
M Lib/fontTools/ttLib/sfnt.py
M Lib/fontTools/ttLib/tables/D_S_I_G_.py
M Lib/fontTools/ttLib/tables/DefaultTable.py
R Lib/fontTools/ttLib/tables/G_M_A_P_.py
R Lib/fontTools/ttLib/tables/G_P_K_G_.py
R Lib/fontTools/ttLib/tables/M_E_T_A_.py
R Lib/fontTools/ttLib/tables/S_I_N_G_.py
M Lib/fontTools/ttLib/tables/TupleVariation.py
M Lib/fontTools/ttLib/tables/__init__.py
M Lib/fontTools/ttLib/tables/_a_v_a_r.py
M Lib/fontTools/ttLib/tables/_f_v_a_r.py
M Lib/fontTools/ttLib/tables/_g_l_y_f.py
M Lib/fontTools/ttLib/tables/_t_r_a_k.py
M Lib/fontTools/ttLib/tables/otBase.py
M Lib/fontTools/ttLib/tables/otConverters.py
M Lib/fontTools/ttLib/tables/ttProgram.py
M Lib/fontTools/ttLib/ttFont.py
M Lib/fontTools/ufoLib/__init__.py
M Lib/fontTools/ufoLib/glifLib.py
M Lib/fontTools/ufoLib/validators.py
M Lib/fontTools/unicodedata/Blocks.py
M Lib/fontTools/unicodedata/ScriptExtensions.py
M Lib/fontTools/unicodedata/Scripts.py
M Lib/fontTools/unicodedata/__init__.py
M Lib/fontTools/varLib/__init__.py
M Lib/fontTools/varLib/avar/build.py
M Lib/fontTools/varLib/avar/map.py
M Lib/fontTools/varLib/avar/unbuild.py
M Lib/fontTools/varLib/instancer/__init__.py
M Lib/fontTools/varLib/interpolatable.py
M Lib/fontTools/varLib/interpolatableHelpers.py
M Lib/fontTools/varLib/interpolatablePlot.py
M Lib/fontTools/varLib/interpolatableTestContourOrder.py
M Lib/fontTools/varLib/interpolatableTestStartingPoint.py
M Lib/fontTools/varLib/models.py
M NEWS.rst
M README.rst
M Tests/cu2qu/cu2qu_test.py
M Tests/cu2qu/ufo_test.py
M Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_Italics_Wght.designspace
M Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_Italics_WghtWdth.designspace
M Tests/designspaceLib/data/split_output/AktivGroteskVF_Italics_Wght.designspace
M Tests/designspaceLib/data/split_output/AktivGroteskVF_Italics_WghtWdth.designspace
M Tests/designspaceLib/data/split_output/MutatorSansVariable_Weight.designspace
M Tests/designspaceLib/data/split_output/MutatorSansVariable_Width.designspace
M Tests/designspaceLib/designspace_test.py
M Tests/feaLib/builder_test.py
A Tests/feaLib/data/cvparam_null.fea
A Tests/feaLib/data/cvparam_null.ttx
M Tests/feaLib/data/empty_filter_sets_and_mark_classes.ttx
M Tests/feaLib/data/spec9a2.fea
M Tests/feaLib/data/spec9a2.ttx
M Tests/feaLib/parser_test.py
M Tests/feaLib/variableScalar_test.py
M Tests/misc/bezierTools_test.py
M Tests/otlLib/builder_test.py
M Tests/pens/pointPen_test.py
M Tests/qu2cu/qu2cu_cli_test.py
M Tests/qu2cu/qu2cu_test.py
A Tests/subset/data/TestBASE.ttx
A Tests/subset/data/expect_BASE.ttx
M Tests/subset/subset_test.py
M Tests/svgLib/path/path_test.py
M Tests/ttLib/tables/TupleVariation_test.py
M Tests/ufoLib/GLIF2_test.py
M Tests/ufoLib/UFOConversion_test.py
M Tests/ufoLib/glifLib_test.py
M Tests/varLib/avar_test.py
M Tests/varLib/models_test.py
M Tests/varLib/varLib_test.py
M pyproject.toml
M requirements.txt
M setup.cfg
M setup.py
M tox.ini
Log Message:
-----------
Merge origin/main into varsca-interpolation
Resolve conflicts incorporating two main-branch bugfixes into the
refactored VariableScalarBuilder:
- Pass axisOrder to VariationModel (from axis_triples key order)
- Round deltas iteratively via getDeltasAndSupports(round=round)
and storeDeltas(round=noRound)
Commit: 76942525acbc87a23d5a05948574ad03350e9365
https://github.com/fonttools/fonttools/commit/76942525acbc87a23d5a05948574ad03350e9365
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-05 (Thu, 05 Mar 2026)
Changed paths:
M Lib/fontTools/feaLib/variableScalar.py
M Tests/feaLib/builder_test.py
Log Message:
-----------
[feaLib] Raise clear error for duplicate normalized locations in VariableScalar
When two user-locations normalise to the same location (e.g. one omitting
an axis that defaults to 0, another specifying it explicitly), raise a
VariationModelError instead of hitting an AssertionError from mismatched
location/value counts in VariationModel.getDeltasAndSupports().
The error flows through makeVariablePos's existing VarLibError handler,
producing a FeatureLibError with a helpful message.
Commit: 73c3e56932e0ce487679c37bd2f26351a93bbaeb
https://github.com/fonttools/fonttools/commit/73c3e56932e0ce487679c37bd2f26351a93bbaeb
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-05 (Thu, 05 Mar 2026)
Changed paths:
M Lib/fontTools/feaLib/variableScalar.py
Log Message:
-----------
[feaLib] Fix mutable default argument in VariableScalar.__init__
Commit: 8299652ed2bbee2c08fcacd7fddcefa27472d672
https://github.com/fonttools/fonttools/commit/8299652ed2bbee2c08fcacd7fddcefa27472d672
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-05 (Thu, 05 Mar 2026)
Changed paths:
M Lib/fontTools/feaLib/variableScalar.py
M Tests/feaLib/variableScalar_test.py
Log Message:
-----------
[feaLib] Add backwards-compat shim for VariableScalar.add_to_variation_store()
Downstream consumers (babelfont, fontFeatures) set .axes on VariableScalar
and call .add_to_variation_store() directly, bypassing feaLib's builder.
Add a thin deprecation shim that delegates to VariableScalarBuilder so
these callers continue working while they migrate to the new API.
Commit: 23f2a2fcd0da05ec75f483a1f751e201900545c3
https://github.com/fonttools/fonttools/commit/23f2a2fcd0da05ec75f483a1f751e201900545c3
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-05 (Thu, 05 Mar 2026)
Changed paths:
M Lib/fontTools/feaLib/variableScalar.py
M Tests/feaLib/variableScalar_test.py
Log Message:
-----------
black + add link to issue in test comment
Commit: 65181e0c27046b4841b2751341f5e5e03cbbf448
https://github.com/fonttools/fonttools/commit/65181e0c27046b4841b2751341f5e5e03cbbf448
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-05 (Thu, 05 Mar 2026)
Changed paths:
M Tests/feaLib/variableScalar_test.py
Log Message:
-----------
[feaLib] Replace VariableScalar interpolation test with one that exercises avar
The previous test used an avar map that collapsed to identity in normalized
space, making the result identical with or without avar mapping. Replace
with a test that uses a non-trivial avar (user 250 maps to design default)
and verifies the interpolated value differs from the no-avar case.
Commit: a06246b186cf851e6906171c21b20fc90c02d1db
https://github.com/fonttools/fonttools/commit/a06246b186cf851e6906171c21b20fc90c02d1db
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-05 (Thu, 05 Mar 2026)
Changed paths:
M Lib/fontTools/ttLib/tables/_c_m_a_p.py
M Tests/ttLib/tables/_c_m_a_p_test.py
Log Message:
-----------
[cmap] Fix CmapSubtable.__lt__ TypeError on Python 3
Remove __dict__ from comparison tuples in CmapSubtable.__lt__().
In Python 3, dict < dict raises TypeError, which caused sorting to
fail whenever two subtables shared the same (platformID, platEncID,
language) combination.
Fixes
https://github.com/fonttools/fonttools/issues/4035
Commit: 10dc3d316e9bf116057d31eabc6034c884a5eb69
https://github.com/fonttools/fonttools/commit/10dc3d316e9bf116057d31eabc6034c884a5eb69
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-05 (Thu, 05 Mar 2026)
Changed paths:
M Lib/fontTools/ttLib/tables/_c_m_a_p.py
M Tests/ttLib/tables/_c_m_a_p_test.py
Log Message:
-----------
[cmap] Raise error on duplicate (platformID, platEncID, language) at compile time
The OpenType spec requires each (platformID, platEncID, language)
combination to appear only once in the cmap table. Validate this
during compile and raise a clear ValueError listing the duplicates.
Commit: 614863e321ad113d79bbc1e997dcad7964183d83
https://github.com/fonttools/fonttools/commit/614863e321ad113d79bbc1e997dcad7964183d83
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-03-05 (Thu, 05 Mar 2026)
Changed paths:
M Lib/fontTools/ttLib/tables/_c_m_a_p.py
M Tests/ttLib/tables/_c_m_a_p_test.py
Log Message:
-----------
Merge pull request #4055 from fonttools/fix-cmap-subtable-sorting
[cmap] Fix subtable sorting crash and validate unique encoding records
Commit: b3a2f752df90b3aaaaf40c5545af8549adc31e06
https://github.com/fonttools/fonttools/commit/b3a2f752df90b3aaaaf40c5545af8549adc31e06
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-05 (Thu, 05 Mar 2026)
Changed paths:
M Lib/fontTools/feaLib/variableScalar.py
M Tests/feaLib/variableScalar_test.py
Log Message:
-----------
[feaLib] Refactor VariableScalarBuilder to work in user-space
Address review feedback from PR #4054:
- Rename normalise -> normalize (American spelling)
- Remove intermediate "normalized user-space" representation; locations
are now kept in user-space until the point of normalization+avar
mapping, which happen together in _normalize_location()
- Drop custom duplicate location detection; VariationModel raises its
own error for duplicate locations
- Add comment explaining exact-match shortcut in value_at_location()
- Keep typing.Self (only used under TYPE_CHECKING, fine for Python 3.10)
- Add test for from_ttf constructor with avar
- Add TODO for avar2 support
Commit: fb51455df3c6411b0fce35319a5b23ccfba21eb9
https://github.com/fonttools/fonttools/commit/fb51455df3c6411b0fce35319a5b23ccfba21eb9
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-06 (Fri, 06 Mar 2026)
Changed paths:
M Lib/fontTools/diff/__init__.py
M Tests/ttLib/ttFont_test.py
Log Message:
-----------
[diff] Use nargs="+" for -t/-x and fix empty list filtering (#4025)
- Change argparse nargs from "*" to "+" for --include/-t and --exclude/-x
so that passing the flag with no table names is rejected at the CLI level.
- Use truthiness checks instead of `is not None` in _iter_filtered_table_tags
so that [] and None are treated the same (both mean "no filtering").
This avoids the same [] vs None ambiguity that caused the ttx regression
in #4025.
- Add regression tests for saveXML table/skipTables filtering.
Commit: 3f2ff510d55570253b1ac895ed3ebeec6717a212
https://github.com/fonttools/fonttools/commit/3f2ff510d55570253b1ac895ed3ebeec6717a212
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-06 (Fri, 06 Mar 2026)
Changed paths:
M Lib/fontTools/ttLib/ttFont.py
Log Message:
-----------
[ttLib] Clarify saveXML docstring: falsy tables means dump all (#4025)
Make explicit that both None and [] are treated as "dump all tables",
which is the longstanding behavior.
Commit: d0d007bea8b5697624d95a74d644e9da1987e482
https://github.com/fonttools/fonttools/commit/d0d007bea8b5697624d95a74d644e9da1987e482
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-03-06 (Fri, 06 Mar 2026)
Changed paths:
M Lib/fontTools/designspaceLib/__init__.py
M Lib/fontTools/feaLib/builder.py
M Lib/fontTools/feaLib/variableScalar.py
M Lib/fontTools/varLib/models.py
M Tests/feaLib/builder_test.py
M Tests/feaLib/variableScalar_test.py
Log Message:
-----------
Merge pull request #4054 from fonttools/varsca-interpolation
Fix interpolation of variable scalars, and allow on pre-compiled fonts (2)
Commit: e10c60054b0427180d85f85d5b1fcd08979706a2
https://github.com/fonttools/fonttools/commit/e10c60054b0427180d85f85d5b1fcd08979706a2
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-03-06 (Fri, 06 Mar 2026)
Changed paths:
M Lib/fontTools/diff/__init__.py
M Lib/fontTools/ttLib/ttFont.py
M Tests/ttLib/ttFont_test.py
Log Message:
-----------
Merge pull request #4056 from fonttools/fix-4025-ttx-empty-tables
Add saveXML regression tests and fix diff table filtering
Commit: 1ca6e24819e9b395961f1d030f18b3f0726b2b50
https://github.com/fonttools/fonttools/commit/1ca6e24819e9b395961f1d030f18b3f0726b2b50
Author: Khaled Hosny <
kha...@aliftype.com>
Date: 2026-03-06 (Fri, 06 Mar 2026)
Changed paths:
M Lib/fontTools/feaLib/parser.py
Log Message:
-----------
[feaLib] Pass location to ConditionsetStatement
Otherwise, glyphsLib would fail while trying to save back a .glyphs file
that has a conditionset block.
Fixes
https://github.com/fontra/fontra-glyphs/issues/130
Commit: bbb4f1df601a2aecd44eb48f4c0f3febbec52dcd
https://github.com/fonttools/fonttools/commit/bbb4f1df601a2aecd44eb48f4c0f3febbec52dcd
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-03-06 (Fri, 06 Mar 2026)
Changed paths:
M Lib/fontTools/feaLib/parser.py
Log Message:
-----------
Merge pull request #4057 from fonttools/conditionset-location
[feaLib] Pass location to ConditionsetStatement
Commit: 90cd0ade05ea434c808a634829c7e2b02d1ac103
https://github.com/fonttools/fonttools/commit/90cd0ade05ea434c808a634829c7e2b02d1ac103
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-06 (Fri, 06 Mar 2026)
Changed paths:
M Lib/fontTools/feaLib/builder.py
M Tests/feaLib/builder_test.py
A Tests/feaLib/data/chain_context_multi_subst_class.fea
A Tests/feaLib/data/chain_context_multi_subst_class.ttx
M Tests/feaLib/data/contextual_inline_multi_sub_format_2.ttx
Log Message:
-----------
[feaLib] Merge chained multi subst rules with same context (#4016)
When MultipleSubstStatement.build() iterates over glyphs in a class,
add_multi_subst_chained_() was creating a separate ChainContextualRule
for each glyph. This resulted in one Format 3 subtable per glyph,
even when all glyphs shared the same backtrack/lookahead context and
the same lookup.
Now we check if the last rule has identical prefix, suffix, and lookup,
and merge the glyph into the existing rule's coverage set instead.
This matches the behavior of fea-rs for this case.
Commit: d240b292095f8ae8cf62de194e0e981f27252f8f
https://github.com/fonttools/fonttools/commit/d240b292095f8ae8cf62de194e0e981f27252f8f
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-03-07 (Sat, 07 Mar 2026)
Changed paths:
M Lib/fontTools/feaLib/builder.py
M Tests/feaLib/builder_test.py
A Tests/feaLib/data/chain_context_multi_subst_class.fea
A Tests/feaLib/data/chain_context_multi_subst_class.ttx
M Tests/feaLib/data/contextual_inline_multi_sub_format_2.ttx
Log Message:
-----------
Merge pull request #4058 from fonttools/fix-chain-context-multi-subst-subtables
Commit: fa6b8e8b503235dd573d7099896d4de27d671fd9
https://github.com/fonttools/fonttools/commit/fa6b8e8b503235dd573d7099896d4de27d671fd9
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-09 (Mon, 09 Mar 2026)
Changed paths:
M NEWS.rst
Log Message:
-----------
Update NEWS.rst
Commit: 258ac81a6131b63288d2583099d4da5315432a01
https://github.com/fonttools/fonttools/commit/258ac81a6131b63288d2583099d4da5315432a01
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-03-09 (Mon, 09 Mar 2026)
Changed paths:
M Lib/fontTools/colorLib/builder.py
M Tests/colorLib/builder_test.py
Log Message:
-----------
Merge pull request #4041 from gregm24/Open-Source-Contribution
colorLib: validate base glyphs before sorting to avoid KeyError
Commit: 7063bfe94c65b39fc7b9c0264f66ea9219086d09
https://github.com/fonttools/fonttools/commit/7063bfe94c65b39fc7b9c0264f66ea9219086d09
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-09 (Mon, 09 Mar 2026)
Changed paths:
M NEWS.rst
Log Message:
-----------
Update NEWS.rst
Commit: 10f59686c9c2bbf564d826a8c19d75fb8df065d9
https://github.com/fonttools/fonttools/commit/10f59686c9c2bbf564d826a8c19d75fb8df065d9
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-09 (Mon, 09 Mar 2026)
Changed paths:
M Lib/fontTools/__init__.py
M NEWS.rst
M setup.cfg
M setup.py
Log Message:
-----------
Release 4.62.0
Commit: 16c1a5c8971f5ea83a9f8f74d0fe0dc6af227122
https://github.com/fonttools/fonttools/commit/16c1a5c8971f5ea83a9f8f74d0fe0dc6af227122
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-09 (Mon, 09 Mar 2026)
Changed paths:
M Lib/fontTools/__init__.py
M setup.cfg
M setup.py
Log Message:
-----------
Bump version: 4.62.0 → 4.62.1.dev0
Commit: db470c298ec5fcca4127e683c902ab262d122962
https://github.com/fonttools/fonttools/commit/db470c298ec5fcca4127e683c902ab262d122962
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-09 (Mon, 09 Mar 2026)
Changed paths:
M Lib/fontTools/__init__.py
M setup.cfg
M setup.py
Log Message:
-----------
Revert "Bump version: 4.62.0 → 4.62.1.dev0"
This reverts commit 16c1a5c8971f5ea83a9f8f74d0fe0dc6af227122.
Commit: ee39edeaec03b90bc796c26bcbb6792740a4f9ee
https://github.com/fonttools/fonttools/commit/ee39edeaec03b90bc796c26bcbb6792740a4f9ee
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-09 (Mon, 09 Mar 2026)
Changed paths:
M Tests/misc/py23_test.py
Log Message:
-----------
[tests] Remove obsolete py23 OpenFuncWrapperTest
This test verified that fontTools.misc.py23.open (which is just
builtins.open re-exported) can roundtrip binary data through a pipe.
The py23 module is deprecated and nothing in fontTools imports it.
The test was failing on free-threaded Python 3.14 on Windows (cp314t-win32):
https://github.com/fonttools/fonttools/actions/runs/22860342656/job/66317680873#step:5:10804
Commit: 0aee8a74c407c4807cd2809ba11d324b659a3242
https://github.com/fonttools/fonttools/commit/0aee8a74c407c4807cd2809ba11d324b659a3242
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-03-09 (Mon, 09 Mar 2026)
Changed paths:
M Tests/misc/py23_test.py
Log Message:
-----------
Merge pull request #4060 from fonttools/remove-py23-pipe-test
[tests] Remove obsolete py23 OpenFuncWrapperTest
Commit: 211171b27a201f7294271484b389afd56f27cb08
https://github.com/fonttools/fonttools/commit/211171b27a201f7294271484b389afd56f27cb08
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-09 (Mon, 09 Mar 2026)
Changed paths:
M Lib/fontTools/__init__.py
M setup.cfg
M setup.py
Log Message:
-----------
Bump version: 4.62.0 → 4.62.1.dev0
Commit: 11e9bfa11a6aece727669e9c464b8c942324dcaf
https://github.com/fonttools/fonttools/commit/11e9bfa11a6aece727669e9c464b8c942324dcaf
Author: Jens Kutilek <
web...@kutilek.de>
Date: 2026-03-10 (Tue, 10 Mar 2026)
Changed paths:
M Lib/fontTools/cu2qu/cli.py
Log Message:
-----------
Fix typo in cu2qu help message
Commit: 2a6072fee98412ddcf5ff5d662c71967c60fabf8
https://github.com/fonttools/fonttools/commit/2a6072fee98412ddcf5ff5d662c71967c60fabf8
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-12 (Thu, 12 Mar 2026)
Changed paths:
M Lib/fontTools/feaLib/builder.py
Log Message:
-----------
Merge consecutive contextual rules with same context
Add _merge_contextual_rule() helper that merges consecutive contextual
rules sharing the same prefix, suffix, and lookups into a single rule
with broader input coverage. Applied to all contextual builder methods:
add_chain_context_subst, add_chain_context_pos, add_single_subst_chained_,
add_multi_subst_chained_, and add_single_pos_chained_.
This matches the broad merge strategy used by fea-rs, which merges all
contextual rule types in its shared ContextBuilder::add().
Fixes
https://github.com/fonttools/fonttools/issues/4016
Commit: bbdcfc20f4e074983ec838d39f0ba6568fcb640d
https://github.com/fonttools/fonttools/commit/bbdcfc20f4e074983ec838d39f0ba6568fcb640d
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-12 (Thu, 12 Mar 2026)
Changed paths:
M Tests/feaLib/builder_test.py
M Tests/feaLib/data/bug463.ttx
M Tests/feaLib/data/bug512.ttx
A Tests/feaLib/data/contextual_merge_gpos_named.fea
A Tests/feaLib/data/contextual_merge_gpos_named.ttx
A Tests/feaLib/data/contextual_merge_gsub_named.fea
A Tests/feaLib/data/contextual_merge_gsub_named.ttx
A Tests/feaLib/data/contextual_merge_ignore.fea
A Tests/feaLib/data/contextual_merge_ignore.ttx
M Tests/feaLib/data/feature_aalt.ttx
Log Message:
-----------
Add tests for contextual rule merge optimization
Update expected TTX output for bug463, bug512, and feature_aalt to
reflect merged contextual rules (fewer subtables, broader input
coverage).
Add new test cases for contextual rule merge beyond inline multi-subst:
- GSUB contextual substitution with named lookup references
- GPOS contextual positioning with named lookup references
- Ignore rules with no nested lookups
Commit: 0903764f84a971c1b4854ffabdf7a266000f5db9
https://github.com/fonttools/fonttools/commit/0903764f84a971c1b4854ffabdf7a266000f5db9
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-13 (Fri, 13 Mar 2026)
Changed paths:
M Lib/fontTools/feaLib/builder.py
M Lib/fontTools/otlLib/builder.py
M Tests/feaLib/builder_test.py
A Tests/feaLib/data/contextual_merge_alternate.fea
A Tests/feaLib/data/contextual_merge_alternate.ttx
Log Message:
-----------
Reuse and merge chained alternate subst lookups
Add find_chainable_alternate_subst() to find an existing AlternateSubst
lookup that can accommodate a new glyph without conflict. This allows
consecutive chained alternate rules to share a single nested lookup and
merge into one contextual rule via _merge_contextual_rule().
Previously each chained alternate rule unconditionally created a fresh
AlternateSubstBuilder, preventing both lookup reuse and rule merging.
Commit: 8060f6a1ae4e4077e5021d48a5f0e54c72d27151
https://github.com/fonttools/fonttools/commit/8060f6a1ae4e4077e5021d48a5f0e54c72d27151
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-13 (Fri, 13 Mar 2026)
Changed paths:
M Lib/fontTools/feaLib/builder.py
Log Message:
-----------
Rename _merge_contextual_rule to _add_contextual_rule
Fold the append logic into the method so callers don't need to
duplicate the fallback path
Commit: ad47e608c0796fb9796fc283ab5f871d2d768d57
https://github.com/fonttools/fonttools/commit/ad47e608c0796fb9796fc283ab5f871d2d768d57
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-03-13 (Fri, 13 Mar 2026)
Changed paths:
M Lib/fontTools/feaLib/builder.py
M Lib/fontTools/otlLib/builder.py
M Tests/feaLib/builder_test.py
M Tests/feaLib/data/bug463.ttx
M Tests/feaLib/data/bug512.ttx
A Tests/feaLib/data/contextual_merge_alternate.fea
A Tests/feaLib/data/contextual_merge_alternate.ttx
A Tests/feaLib/data/contextual_merge_gpos_named.fea
A Tests/feaLib/data/contextual_merge_gpos_named.ttx
A Tests/feaLib/data/contextual_merge_gsub_named.fea
A Tests/feaLib/data/contextual_merge_gsub_named.ttx
A Tests/feaLib/data/contextual_merge_ignore.fea
A Tests/feaLib/data/contextual_merge_ignore.ttx
M Tests/feaLib/data/feature_aalt.ttx
Log Message:
-----------
Merge pull request #4061 from fonttools/merge-chained-rules
[feaLib] Merge consecutive contextual rules with same context
Commit: da54a2924009c9a6497dad23f4a6be4a96a8b0e7
https://github.com/fonttools/fonttools/commit/da54a2924009c9a6497dad23f4a6be4a96a8b0e7
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-13 (Fri, 13 Mar 2026)
Changed paths:
M Lib/fontTools/__init__.py
M NEWS.rst
M setup.cfg
M setup.py
Log Message:
-----------
Release 4.62.1
Commit: 222326ec74411b62f065e3270fd626b559bd1b51
https://github.com/fonttools/fonttools/commit/222326ec74411b62f065e3270fd626b559bd1b51
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-13 (Fri, 13 Mar 2026)
Changed paths:
M Lib/fontTools/__init__.py
M setup.cfg
M setup.py
Log Message:
-----------
Bump version: 4.62.1 → 4.62.2.dev0
Commit: 69f6a9cf330e5d76486f884a473fa7a826289999
https://github.com/fonttools/fonttools/commit/69f6a9cf330e5d76486f884a473fa7a826289999
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-13 (Fri, 13 Mar 2026)
Changed paths:
M .github/workflows/wheels.yml
M Lib/fontTools/cu2qu/cu2qu.py
M Lib/fontTools/qu2cu/qu2cu.py
M MANIFEST.in
M setup.cfg
M setup.py
Log Message:
-----------
Build abi3 wheels for Cython extensions
Commit: c760aaab4abbbb0d069b80f8b10334a429738319
https://github.com/fonttools/fonttools/commit/c760aaab4abbbb0d069b80f8b10334a429738319
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-03-13 (Fri, 13 Mar 2026)
Changed paths:
M .github/workflows/wheels.yml
M Lib/fontTools/cu2qu/cu2qu.py
M Lib/fontTools/qu2cu/qu2cu.py
M MANIFEST.in
M setup.cfg
M setup.py
Log Message:
-----------
Merge pull request #4064 from fonttools/abi3-wheels
Build abi3 wheels for Cython extensions
Commit: e966c83147f36cb50b7124b70836fe3c9ef8e8e9
https://github.com/fonttools/fonttools/commit/e966c83147f36cb50b7124b70836fe3c9ef8e8e9
Author: Cosimo Lupo <
cl...@google.com>
Date: 2026-03-16 (Mon, 16 Mar 2026)
Changed paths:
M .github/workflows/wheels.yml
M Lib/fontTools/cu2qu/cu2qu.py
M Lib/fontTools/qu2cu/qu2cu.py
M MANIFEST.in
M setup.cfg
M setup.py
Log Message:
-----------
Revert "Merge pull request #4064 from fonttools/abi3-wheels"
This reverts commit c760aaab4abbbb0d069b80f8b10334a429738319, reversing
changes made to 222326ec74411b62f065e3270fd626b559bd1b51.
benchmarks show abi3 give ~27% performance penalty for the cython
modules, let's shelve it for the time being.
https://github.com/fonttools/fonttools/pull/4064#issuecomment-4069498011
Commit: e3f215b13e00abfec50eba416d68621d2da3fcda
https://github.com/fonttools/fonttools/commit/e3f215b13e00abfec50eba416d68621d2da3fcda
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-03-16 (Mon, 16 Mar 2026)
Changed paths:
M .github/workflows/wheels.yml
M Lib/fontTools/cu2qu/cu2qu.py
M Lib/fontTools/qu2cu/qu2cu.py
M MANIFEST.in
M setup.cfg
M setup.py
Log Message:
-----------
Merge pull request #4066 from fonttools/revert-abi3
Revert "Build abi3 wheels for Cython extensions"
Commit: 8e66093b45b2732901c06f458c3849bd242f6365
https://github.com/fonttools/fonttools/commit/8e66093b45b2732901c06f458c3849bd242f6365
Author: Just van Rossum <
justva...@gmail.com>
Date: 2026-03-17 (Tue, 17 Mar 2026)
Changed paths:
M Lib/fontTools/ufoLib/__init__.py
Log Message:
-----------
Fix typo in doc string
Commit: def7b5bfe50df3c783d23f7fa0ef4da6d2629661
https://github.com/fonttools/fonttools/commit/def7b5bfe50df3c783d23f7fa0ef4da6d2629661
Author: Just van Rossum <
justva...@gmail.com>
Date: 2026-03-17 (Tue, 17 Mar 2026)
Changed paths:
M Lib/fontTools/ufoLib/__init__.py
Log Message:
-----------
Merge pull request #4067 from fonttools/justvanrossum-patch-1
[ufoLib] Fix typo in doc string
Commit: 29a392f2b67be8ad0229a75e75893c8bd585d792
https://github.com/fonttools/fonttools/commit/29a392f2b67be8ad0229a75e75893c8bd585d792
Author: Thatchapon Unprasert <
thatcha...@outlook.com>
Date: 2026-03-18 (Wed, 18 Mar 2026)
Changed paths:
M Doc/source/ttx.rst
M Lib/fontTools/ttLib/tables/__init__.py
A Lib/fontTools/ttLib/tables/_b_g_c_l.py
A Tests/ttLib/tables/_b_g_c_l_test.py
Log Message:
-----------
Add support for Apple Color Emoji `bgcl` table (#4065)
* Add support for Apple Color Emoji `bgcl` table
* Remove obsoleted code
* Fix lint
* Fix lint
* Update desc
* Update description
* Remove unneeded
* Use getTableClass
Commit: bb1109e90c11fb64d3730c9c9069e12624f82a4a
https://github.com/fonttools/fonttools/commit/bb1109e90c11fb64d3730c9c9069e12624f82a4a
Author: Will <
wi...@wmedrano.dev>
Date: 2026-03-27 (Fri, 27 Mar 2026)
Changed paths:
A Lib/fontTools/misc/iftSparseBitSet.py
A Lib/fontTools/ttLib/tables/I_F_T_.py
A Lib/fontTools/ttLib/tables/I_F_T_X_.py
M Lib/fontTools/ttLib/tables/otBase.py
M Lib/fontTools/ttLib/tables/otConverters.py
M Lib/fontTools/ttLib/tables/otData.py
M Lib/fontTools/ttLib/tables/otTables.py
A Tests/misc/iftSparseBitSet_test.py
M Tests/ttLib/tables/otBase_test.py
Log Message:
-----------
Add IFT table (#4072)
* Add IFT table
* Use a flags enum
* Run formatter
Commit: 88fe4f30ea91b48d1ef67d63462ad7fc66b21b00
https://github.com/fonttools/fonttools/commit/88fe4f30ea91b48d1ef67d63462ad7fc66b21b00
Author: Will <
wi...@wmedrano.dev>
Date: 2026-04-05 (Sun, 05 Apr 2026)
Changed paths:
M Lib/fontTools/ttLib/tables/otConverters.py
M Lib/fontTools/ttLib/tables/otData.py
A Lib/fontTools/ttLib/tables/otDataSchema.py
M Lib/fontTools/ttLib/tables/otTables.py
Log Message:
-----------
Create explicit schema/type for otData.py (#4076)
* Create schema for otData.py
* Fix tests
* Use named tuple
Commit: 34be2443a7539b0b36467e9cca63ef53d4506fd6
https://github.com/fonttools/fonttools/commit/34be2443a7539b0b36467e9cca63ef53d4506fd6
Author: Thatchapon Unprasert <
3608783+...@users.noreply.github.com>
Date: 2026-04-07 (Tue, 07 Apr 2026)
Changed paths:
M Doc/source/ttLib/tables.rst
A Doc/source/ttLib/tables/D__e_b_g.rst
A Doc/source/ttLib/tables/G_V_A_R_.rst
A Doc/source/ttLib/tables/I_F_T_.rst
A Doc/source/ttLib/tables/I_F_T_X_.rst
A Doc/source/ttLib/tables/V_A_R_C_.rst
A Doc/source/ttLib/tables/_b_g_c_l.rst
M Doc/source/ttx.rst
M Lib/fontTools/ttLib/tables/__init__.py
M Lib/fontTools/ttLib/ttFont.py
A MetaTools/check_table_coverage.py
A Tests/metaTools/check_table_coverage_test.py
Log Message:
-----------
ci: add table coverage check and fix outstanding registration gaps (#4080)
* ci: add check_table_coverage script and fix outstanding registration gaps
Add MetaTools/check_table_coverage.py, a CI script that verifies every
table module in Lib/fontTools/ttLib/tables/ is registered in all
required locations:
A. tables/__init__.py (auto-generated via buildTableList.py)
B. Doc/source/ttx.rst (auto-generated via buildTableList.py)
C. ttFont.py (TYPE_CHECKING import + @overload stubs)
D. Doc/source/ttLib/tables/<module>.rst (per-table automodule stub)
E. Doc/source/ttLib/tables.rst (toctree entry)
F. Tests/ttLib/tables/<module>_test.py (unit tests, warning only)
Tables intentionally documented in a shared RST (e.g. TSI* tables in
VTT_related.rst) are handled via a GROUPED_IN map so they do not
produce false positives. Pre-existing test-file gaps are listed in
KNOWN_GAPS and emit warnings rather than errors so the check can be
enabled without blocking on existing debt.
Integrate the check into tox (tox -e check-tables) and add a
dedicated check-tables job to .github/workflows/test.yml.
While adding the script, fix the outstanding registration gaps it
surfaces:
- Run buildTableList.py to add IFT and IFTX to tables/__init__.py
and Doc/source/ttx.rst.
- Add TYPE_CHECKING imports and @overload stubs for IFT, IFTX, and
bgcl in ttFont.py.
- Add per-table RST docs for Debg, GVAR, IFT, IFTX, VARC, and bgcl.
- Add toctree entries for all six new RST files in tables.rst.
* style: black formatting for check_table_coverage.py
* refactor: move table coverage check into the regular pytest suite
The check functions from MetaTools/check_table_coverage.py are now also
exercised as five ordinary pytest tests in
Tests/metaTools/check_table_coverage_test.py, one per check category
(init_py, ttx_rst, ttfont_py, rst_docs, tables_rst_toctree).
This means the checks run automatically on every platform and Python
version in the existing test matrix, with no separate CI job or tox
environment needed. The dedicated check-tables tox env and the
corresponding GitHub Actions job are removed.
* remove unnecessary Tests/metaTools/__init__.py
Commit: f5e25068d050668d14b72ae4991cf8d59a275aa4
https://github.com/fonttools/fonttools/commit/f5e25068d050668d14b72ae4991cf8d59a275aa4
Author: dependabot[bot] <49699333+dependabot[bot]@
users.noreply.github.com>
Date: 2026-04-22 (Wed, 22 Apr 2026)
Changed paths:
M requirements.txt
Log Message:
-----------
Bump lxml from 6.0.2 to 6.1.0 (#4082)
Bumps [lxml](
https://github.com/lxml/lxml) from 6.0.2 to 6.1.0.
- [Release notes](
https://github.com/lxml/lxml/releases)
- [Changelog](
https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](
https://github.com/lxml/lxml/compare/lxml-6.0.2...lxml-6.1.0)
---
updated-dependencies:
- dependency-name: lxml
dependency-version: 6.1.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <
sup...@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@
users.noreply.github.com>
Commit: d73de432a7d8b0e4e54c58970709e9ebb8369500
https://github.com/fonttools/fonttools/commit/d73de432a7d8b0e4e54c58970709e9ebb8369500
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-04-22 (Wed, 22 Apr 2026)
Changed paths:
M Tests/cu2qu/cu2qu_test.py
Log Message:
-----------
[cu2qu] Add failing test for split_cubic_into_three complex division
Same class of Cython-vs-pure-Python divergence fixed in
calc_cubic_points by PR #3930, but in split_cubic_into_three
which has its own / 3.0 expressions. Cython's C complex division
(__divdc3) uses multiply-by-reciprocal internally, producing a
1-ULP difference from Python's scalar division. This causes ±1
off-curve coordinate rounding on fonts with fractional default-
master coordinates (e.g. JosefinSans-Italic).
https://github.com/fonttools/fonttools/issues/3928
Commit: 37a013acc7622a4e58ce849324f8c5284685aef7
https://github.com/fonttools/fonttools/commit/37a013acc7622a4e58ce849324f8c5284685aef7
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-04-22 (Wed, 22 Apr 2026)
Changed paths:
M Lib/fontTools/cu2qu/cu2qu.py
Log Message:
-----------
[cu2qu] Use _complex_div_by_real in split_cubic_into_three
Apply the same fix from PR #3930 to the two remaining / 3.0
expressions in split_cubic_into_three, which were missed by
the original calc_cubic_points fix.
https://github.com/fonttools/fonttools/issues/3928
Commit: 74c193fec73b5a193462046712954325076ce77c
https://github.com/fonttools/fonttools/commit/74c193fec73b5a193462046712954325076ce77c
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-04-22 (Wed, 22 Apr 2026)
Changed paths:
M Tests/feaLib/variableScalar_test.py
Log Message:
-----------
[test] Fix flaky test_deprecated_add_to_variation_store on Ubuntu py313
The test asserted len(w) == 1 on the full warnings list, but on some
platforms extra non-DeprecationWarning warnings are captured, causing
a spurious failure. Filter for DeprecationWarning before asserting.
Commit: 1419daa6680c5c899713598956caa69ad47bcd23
https://github.com/fonttools/fonttools/commit/1419daa6680c5c899713598956caa69ad47bcd23
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-04-22 (Wed, 22 Apr 2026)
Changed paths:
M Lib/fontTools/cu2qu/cu2qu.py
M Tests/cu2qu/cu2qu_test.py
Log Message:
-----------
Merge pull request #4083 from fonttools/fix-cu2qu-split-three-complex-div
[cu2qu] Use _complex_div_by_real in split_cubic_into_three
Commit: 6740d59b00b7594f1ec2e48dc59e79fd49b39fd4
https://github.com/fonttools/fonttools/commit/6740d59b00b7594f1ec2e48dc59e79fd49b39fd4
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-05-01 (Fri, 01 May 2026)
Changed paths:
M Tests/designspaceLib/designspace_test.py
Log Message:
-----------
Add failing test for map_backward with many-to-one axis map
https://github.com/googlefonts/ufo2ft/issues/978
Commit: 10f3119b7ef075639892ee48bfdb2d8ffffa7e0f
https://github.com/fonttools/fonttools/commit/10f3119b7ef075639892ee48bfdb2d8ffffa7e0f
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-05-01 (Fri, 01 May 2026)
Changed paths:
M Lib/fontTools/designspaceLib/__init__.py
Log Message:
-----------
Fix map_backward for many-to-one axis maps
The old implementation inverted the axis map via a dict comprehension,
which silently dropped entries when multiple user-space values mapped
to the same design-space value (a flat segment in the avar sense).
This produced wrong interpolation for nearby design values, leading to
incorrect normalized coordinates for any code relying on map_backward.
Replace with a sorted list of (design, user) pairs that preserves both
endpoints of flat segments, so the inverse is correct on both sides.
https://github.com/googlefonts/ufo2ft/issues/978
Commit: 6d64598a63f83bcd59d29cf3f22dd25343bd9688
https://github.com/fonttools/fonttools/commit/6d64598a63f83bcd59d29cf3f22dd25343bd9688
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-05-01 (Fri, 01 May 2026)
Changed paths:
M Tests/designspaceLib/designspace_test.py
Log Message:
-----------
Add more tests for map_backward with many-to-one axis maps
Commit: 06e266ce70ec578d549c2df0e180a84d9323baf2
https://github.com/fonttools/fonttools/commit/06e266ce70ec578d549c2df0e180a84d9323baf2
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-05-01 (Fri, 01 May 2026)
Changed paths:
M Lib/fontTools/designspaceLib/__init__.py
M Tests/designspaceLib/designspace_test.py
Log Message:
-----------
Merge pull request #4085 from fonttools/fix-map-backward-non-injective
[designspaceLib] Fix map_backward for many-to-one axis maps
Commit: 7d0902b2e27ec1433b015b3b8a79391d7c8604cb
https://github.com/fonttools/fonttools/commit/7d0902b2e27ec1433b015b3b8a79391d7c8604cb
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-05-13 (Wed, 13 May 2026)
Changed paths:
M Lib/fontTools/ttLib/tables/O_S_2f_2.py
M Tests/ttLib/tables/O_S_2f_2_test.py
Log Message:
-----------
OS/2: fix setUnicodeRanges round-trip for reserved bits 123-127
Bits 123-127 are reserved in the OpenType spec and not assigned to any
Unicode block, so the cap at 123 in setUnicodeRanges was intentional.
However, getUnicodeRanges reads all 128 raw bits, so a font with those
reserved bits already set (by another tool) will have them returned by
getUnicodeRanges but rejected by setUnicodeRanges -- causing a crash in
recalcUnicodeRanges(pruneOnly=True), which preserves bits it cannot
evaluate rather than clearing them.
Accept bits 0-127 to allow the round-trip, without assigning any
meaning to the reserved range.
Fixes #4087
Commit: d6eabd1edf7bfa950b6b85c393e4c185dee36d7f
https://github.com/fonttools/fonttools/commit/d6eabd1edf7bfa950b6b85c393e4c185dee36d7f
Author: Khaled Hosny <
kha...@aliftype.com>
Date: 2026-05-13 (Wed, 13 May 2026)
Changed paths:
M Lib/fontTools/ttLib/tables/F__e_a_t.py
M Tests/ttLib/tables/data/graphite/graphite_tests.ttx.Feat
A Tests/ttLib/tables/data/graphite/graphite_tests.ttx.Feat.setup
Log Message:
-----------
Feat: show name table strings as comments next to label IDs in ttx
Similar to what we do in fvar, STAT, trak, etc.
Commit: e84db3ab426a251256ebec7904c03dc73e25932b
https://github.com/fonttools/fonttools/commit/e84db3ab426a251256ebec7904c03dc73e25932b
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-05-14 (Thu, 14 May 2026)
Changed paths:
M Lib/fontTools/ttLib/tables/O_S_2f_2.py
M Tests/ttLib/tables/O_S_2f_2_test.py
Log Message:
-----------
Merge pull request #4088 from fonttools/fix-setUnicodeRanges-bits-123-127
[OS/2] fix setUnicodeRanges round-trip for reserved bits 123-127
Commit: 9e55ea54c184b0d4c0830525f72e69c6c1a32691
https://github.com/fonttools/fonttools/commit/9e55ea54c184b0d4c0830525f72e69c6c1a32691
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-05-14 (Thu, 14 May 2026)
Changed paths:
M Lib/fontTools/ttLib/tables/F__e_a_t.py
M Tests/ttLib/tables/data/graphite/graphite_tests.ttx.Feat
A Tests/ttLib/tables/data/graphite/graphite_tests.ttx.Feat.setup
Log Message:
-----------
Merge pull request #4089 from fonttools/graphite-feat-labels
Feat: show name table strings as comments next to label IDs in ttx
Commit: 0e999b55f05ad0dd8423f389673a32de9c5199bb
https://github.com/fonttools/fonttools/commit/0e999b55f05ad0dd8423f389673a32de9c5199bb
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-05-14 (Thu, 14 May 2026)
Changed paths:
M setup.py
Log Message:
-----------
Declare Cython extensions as free-threading compatible
Add the `freethreading_compatible` Cython compiler directive when building
on Python 3.13+, so that importing the compiled extensions on free-threaded
Python (3.13t/3.14t) no longer re-enables the GIL.
Fixes #4073
Commit: 382a35fb5e96c6ff38a1e7775a24e20bf122a66d
https://github.com/fonttools/fonttools/commit/382a35fb5e96c6ff38a1e7775a24e20bf122a66d
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-05-14 (Thu, 14 May 2026)
Changed paths:
M setup.py
Log Message:
-----------
Merge pull request #4090 from fonttools/fix-freethreading-compat
Declare Cython extensions as free-threading compatible
Commit: 6b40ecb6f13e076916044ecd8f0fc13ab5f957f6
https://github.com/fonttools/fonttools/commit/6b40ecb6f13e076916044ecd8f0fc13ab5f957f6
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-05-14 (Thu, 14 May 2026)
Changed paths:
M NEWS.rst
Log Message:
-----------
Add changelog entries for 4.63.0
Commit: 978d9edccb60ea0e5fbad7015cb11817c3532328
https://github.com/fonttools/fonttools/commit/978d9edccb60ea0e5fbad7015cb11817c3532328
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-05-14 (Thu, 14 May 2026)
Changed paths:
M Lib/fontTools/__init__.py
M NEWS.rst
M setup.cfg
M setup.py
Log Message:
-----------
Release 4.63.0
Commit: 67ff24a36d89422ef877bad0311fd0d2028e6903
https://github.com/fonttools/fonttools/commit/67ff24a36d89422ef877bad0311fd0d2028e6903
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-05-14 (Thu, 14 May 2026)
Changed paths:
M Lib/fontTools/__init__.py
M setup.cfg
M setup.py
Log Message:
-----------
Bump version: 4.63.0 → 4.63.1.dev0
Commit: 10791aaf9f91ecb91ee797d9ad2d94c6b2ca3524
https://github.com/fonttools/fonttools/commit/10791aaf9f91ecb91ee797d9ad2d94c6b2ca3524
Author: Miguel Sousa <
mso...@adobe.com>
Date: 2026-05-21 (Thu, 21 May 2026)
Changed paths:
M Lib/fontTools/feaLib/parser.py
M Tests/feaLib/builder_test.py
A Tests/feaLib/data/bug1196.fea
A Tests/feaLib/data/bug1196.ttx
M Tests/feaLib/parser_test.py
Log Message:
-----------
[feaLib] Fix name-table parsing for multibyte Mac encodings (#1196) (#4092)
* [feaLib] Fix name-table parsing for multibyte Mac encodings (#1196)
The unescape_string_ helper used to decode each "\XX" escape as a single
byte, which broke multibyte encodings (x_mac_japanese_ttx and friends)
whenever one character's bytes were split across escapes or across an
escape/literal-ASCII boundary (e.g. "\95F" = Shift-JIS 0x95 0x46 = 彦).
Build the full byte sequence from literal chars + \XX escapes and decode
it in one pass.
* Use bytearray.decode() directly
Commit: 7223f42ad9cf3030c24427de6981754c451ed8b1
https://github.com/fonttools/fonttools/commit/7223f42ad9cf3030c24427de6981754c451ed8b1
Author: Jens Kutilek <
web...@kutilek.de>
Date: 2026-05-26 (Tue, 26 May 2026)
Changed paths:
M Lib/fontTools/ttLib/tables/ttProgram.py
Log Message:
-----------
IDEF[ ] should also indent (#4093)
Commit: af05c2cdd3324e557d04ace4d45bac5fa87d36b2
https://github.com/fonttools/fonttools/commit/af05c2cdd3324e557d04ace4d45bac5fa87d36b2
Author: Takeru Suzuki <
terk...@gmail.com>
Date: 2026-06-01 (Mon, 01 Jun 2026)
Changed paths:
M Lib/fontTools/subset/__init__.py
Log Message:
-----------
[subset] keep East Asian spacing palt by default (#4094)
https://github.com/harfbuzz/harfbuzz/pull/6007
Commit: 7fc2aa089b1bdc0d03157de2423e9b6681d22c20
https://github.com/fonttools/fonttools/commit/7fc2aa089b1bdc0d03157de2423e9b6681d22c20
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-06-01 (Mon, 01 Jun 2026)
Changed paths:
M Lib/fontTools/subset/__init__.py
Log Message:
-----------
Revert "[subset] keep East Asian spacing palt by default (#4094)" (#4095)
This reverts commit af05c2cdd3324e557d04ace4d45bac5fa87d36b2.
Commit: 12a5acc3edb015b09847beb500223e14e45efce3
https://github.com/fonttools/fonttools/commit/12a5acc3edb015b09847beb500223e14e45efce3
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-06-01 (Mon, 01 Jun 2026)
Changed paths:
M Tests/varLib/data/test_results/Mutator_Getvar-instance.ttx
Log Message:
-----------
Fix test expectations
Commit: c5d5359f7ab9989306ee0ff5897d834d0f1b5c29
https://github.com/fonttools/fonttools/commit/c5d5359f7ab9989306ee0ff5897d834d0f1b5c29
Author: Takeru Suzuki <
terk...@gmail.com>
Date: 2026-06-01 (Mon, 01 Jun 2026)
Changed paths:
M Lib/fontTools/subset/__init__.py
Log Message:
-----------
[subset] keep East Asian spacing palt by default (#4094)
https://github.com/harfbuzz/harfbuzz/pull/6007
Commit: d3cc5d0a3e8f272c0f23fc5243e2bd533f3d6180
https://github.com/fonttools/fonttools/commit/d3cc5d0a3e8f272c0f23fc5243e2bd533f3d6180
Author: Qunxin Liu <
qx...@google.com>
Date: 2026-06-03 (Wed, 03 Jun 2026)
Changed paths:
M Lib/fontTools/subset/__init__.py
Log Message:
-----------
[subset] bug fix
No need to keep constructions for glyphs that are only added
during math closure.
See also:
https://github.com/harfbuzz/harfbuzz/issues/5998
Commit: cd3a16cbec652b32549c851cb7bcb3d659005b01
https://github.com/fonttools/fonttools/commit/cd3a16cbec652b32549c851cb7bcb3d659005b01
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-06-15 (Mon, 15 Jun 2026)
Changed paths:
M Lib/fontTools/subset/__init__.py
Log Message:
-----------
Merge pull request #4096 from qxliu76/fix_math
[subset] bug fix for MATH table
Commit: 0dbc9eab01ccc6f285350c82e2e35a4f2e52919b
https://github.com/fonttools/fonttools/commit/0dbc9eab01ccc6f285350c82e2e35a4f2e52919b
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-06-15 (Mon, 15 Jun 2026)
Changed paths:
A Tests/subset/data/test_math_closure.ttx
M Tests/subset/subset_test.py
Log Message:
-----------
[subset] add regression test for MATH closure construction fix
A glyph pulled into the subset only by MATH variant closure must not
keep its own MathGlyphConstruction. Closure is a single pass, so the
variants such a construction references are not themselves closed over,
and keeping it leaves dangling references to glyphs absent from the
subset. The existing MATH test fonts never place a size variant in its
own coverage, so they cannot exercise this; this test builds a font
that does.
Commit: df323ee5281dad3ee0035d2502c9ebf01f708589
https://github.com/fonttools/fonttools/commit/df323ee5281dad3ee0035d2502c9ebf01f708589
Author: Jens Kutilek <
web...@kutilek.de>
Date: 2026-06-16 (Tue, 16 Jun 2026)
Changed paths:
M Lib/fontTools/ttLib/sfnt.py
M Lib/fontTools/ttLib/ttCollection.py
M Tests/ttLib/ttCollection_test.py
Log Message:
-----------
Implement support for TrueType Collection v2
Commit: a55035a7f786e18362641f80626f9b2d60a270f8
https://github.com/fonttools/fonttools/commit/a55035a7f786e18362641f80626f9b2d60a270f8
Author: Jens Kutilek <
web...@kutilek.de>
Date: 2026-06-16 (Tue, 16 Jun 2026)
Changed paths:
M Lib/fontTools/ttLib/sfnt.py
M Lib/fontTools/ttLib/ttCollection.py
Log Message:
-----------
Use constants
Commit: 230de9d2ecd8a05f141f8b8468f7e1ccbf1868eb
https://github.com/fonttools/fonttools/commit/230de9d2ecd8a05f141f8b8468f7e1ccbf1868eb
Author: Jens Kutilek <
web...@kutilek.de>
Date: 2026-06-16 (Tue, 16 Jun 2026)
Changed paths:
M Lib/fontTools/ttLib/ttCollection.py
M Tests/ttLib/ttCollection_test.py
A Tests/ttx/data/TestTTCv2.ttc
Log Message:
-----------
Fix and test for roundtrip from binary to TTCollection to binary without decompiling the DSIG table
Commit: 275cda908415f40d4fb09826e54a053fc2b01d56
https://github.com/fonttools/fonttools/commit/275cda908415f40d4fb09826e54a053fc2b01d56
Author: Harry Dalton <
harry....@daltonmaag.com>
Date: 2026-06-17 (Wed, 17 Jun 2026)
Changed paths:
M Lib/fontTools/ufoLib/kerning.py
Log Message:
-----------
Make glyph-to-group construction accessible outside of lookup function
This improves ergonomics for constructing glyph-to-group mappings prior
to repeated kern lookups: you get the convenience of fonttools
constructing the mappings, but avoid the repeated cost on each call.
Commit: 687a952196821cd0578f8d512eec52f29818c3d8
https://github.com/fonttools/fonttools/commit/687a952196821cd0578f8d512eec52f29818c3d8
Author: Harry Dalton <
harry....@daltonmaag.com>
Date: 2026-06-17 (Wed, 17 Jun 2026)
Changed paths:
M Lib/fontTools/ufoLib/kerning.py
Log Message:
-----------
Fix documentation typo
Commit: 151a34cda30daa5d6b48de4435fba2e48f3afb67
https://github.com/fonttools/fonttools/commit/151a34cda30daa5d6b48de4435fba2e48f3afb67
Author: Harry Dalton <
harry....@daltonmaag.com>
Date: 2026-06-17 (Wed, 17 Jun 2026)
Changed paths:
M Lib/fontTools/ufoLib/kerning.py
Log Message:
-----------
Fix type typo in groups argument docs
Co-authored-by: Cosimo Lupo <
cos...@anthrotype.com>
Commit: 04e45da730fca80aa84f33f8ccf02643ce656a54
https://github.com/fonttools/fonttools/commit/04e45da730fca80aa84f33f8ccf02643ce656a54
Author: Harry Dalton <
harry....@daltonmaag.com>
Date: 2026-06-17 (Wed, 17 Jun 2026)
Changed paths:
M Lib/fontTools/ufoLib/kerning.py
Log Message:
-----------
Document accelerated example
Commit: 02e6c1837245dc07086552e77d0b54d5a312e04c
https://github.com/fonttools/fonttools/commit/02e6c1837245dc07086552e77d0b54d5a312e04c
Author: Harry Dalton <
harry....@daltonmaag.com>
Date: 2026-06-17 (Wed, 17 Jun 2026)
Changed paths:
M Lib/fontTools/ufoLib/kerning.py
Log Message:
-----------
Clarify groups argument docs further, in both functions
Commit: ac8bca59919d4075e07f090d98cc5905dbe24319
https://github.com/fonttools/fonttools/commit/ac8bca59919d4075e07f090d98cc5905dbe24319
Author: Harry Dalton <
harry....@daltonmaag.com>
Date: 2026-06-17 (Wed, 17 Jun 2026)
Changed paths:
M Lib/fontTools/ufoLib/kerning.py
Log Message:
-----------
Document that groups are expected to be pre-validated
Commit: 431ca5771611e98cfe06876802fa8ee11485ca28
https://github.com/fonttools/fonttools/commit/431ca5771611e98cfe06876802fa8ee11485ca28
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-06-17 (Wed, 17 Jun 2026)
Changed paths:
M Lib/fontTools/ttLib/tables/_g_l_y_f.py
M Tests/ttLib/tables/_g_l_y_f_test.py
Log Message:
-----------
[glyf] Use reverse glyph map for O(1) __setitem__ membership
table__g_l_y_f.__setitem__ tested `glyphName not in self.glyphOrder`, a linear
scan of the glyphOrder list on every assignment, so repeatedly assigning glyphs
over a pre-populated glyphOrder was O(n^2) in the glyph count -- several seconds
of pure scanning for a 60k-glyph font.
Use the reverse glyph map (_reverseGlyphOrder) for O(1) membership instead,
rebuilding it when it is missing or its length no longer matches glyphOrder, and
invalidating it on __delitem__. Reordering goes through setGlyphOrder, which
already clears the map; editing glyphOrder directly behind the table's back is
unsupported.
Related to #2605, a separate correctness issue (the TTFont-level
_reverseGlyphOrderDict going stale, see #3582), not changed here.
Commit: 3b44a54ae741a257ecbb31305dc59800ebe9ebd0
https://github.com/fonttools/fonttools/commit/3b44a54ae741a257ecbb31305dc59800ebe9ebd0
Author: Harry Dalton <
harry....@daltonmaag.com>
Date: 2026-06-17 (Wed, 17 Jun 2026)
Changed paths:
M Lib/fontTools/ufoLib/kerning.py
Log Message:
-----------
Merge pull request #4102 from daltonmaag/kerning-groups-helper
[ufoLib] Make glyph-to-group construction accessible outside of lookup function
Commit: 77d5fa9f80ae708224c0ae29dd71c877c34dd97c
https://github.com/fonttools/fonttools/commit/77d5fa9f80ae708224c0ae29dd71c877c34dd97c
Author: Harry Dalton <
harry....@daltonmaag.com>
Date: 2026-06-17 (Wed, 17 Jun 2026)
Changed paths:
M Doc/source/index.rst
Log Message:
-----------
Update minimum version in docs
Commit: 9e008130149b5d0cb5176358623019f484504278
https://github.com/fonttools/fonttools/commit/9e008130149b5d0cb5176358623019f484504278
Author: Jens Kutilek <
web...@kutilek.de>
Date: 2026-06-17 (Wed, 17 Jun 2026)
Changed paths:
M Tests/ttLib/ttCollection_test.py
Log Message:
-----------
Check that the collection fonts can be accessed
Commit: 541c1d52019e5a974cbf64f52833729fcd3b4c4f
https://github.com/fonttools/fonttools/commit/541c1d52019e5a974cbf64f52833729fcd3b4c4f
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-06-17 (Wed, 17 Jun 2026)
Changed paths:
M Lib/fontTools/ttLib/tables/_g_l_y_f.py
M Tests/ttLib/tables/_g_l_y_f_test.py
Log Message:
-----------
Merge pull request #4103 from fonttools/glyf-setitem-perf
[glyf] Use reverse glyph map for O(1) __setitem__ membership
Commit: c5c6b5c8a00edfad60cffe96cadb8d993dd49ac1
https://github.com/fonttools/fonttools/commit/c5c6b5c8a00edfad60cffe96cadb8d993dd49ac1
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-06-18 (Thu, 18 Jun 2026)
Changed paths:
M Doc/source/index.rst
Log Message:
-----------
Merge pull request #4104 from daltonmaag/min-version-in-docs
Update minimum version in docs
Commit: 6f4ca912b6d07ec7c64569fcad16683bdd03db8c
https://github.com/fonttools/fonttools/commit/6f4ca912b6d07ec7c64569fcad16683bdd03db8c
Author: Jens Kutilek <
web...@kutilek.de>
Date: 2026-06-18 (Thu, 18 Jun 2026)
Changed paths:
M Lib/fontTools/ttLib/sfnt.py
Log Message:
-----------
Rename ttcHeaderFormat2 to ttcTailFormatV2
Commit: ae3ece5c0db4ff779958f4dc36f936b416219fa5
https://github.com/fonttools/fonttools/commit/ae3ece5c0db4ff779958f4dc36f936b416219fa5
Author: Jens Kutilek <
web...@kutilek.de>
Date: 2026-06-18 (Thu, 18 Jun 2026)
Changed paths:
M Lib/fontTools/ttLib/sfnt.py
Log Message:
-----------
Also check for valid version in writeTTCHeader
Commit: 8c8a516e93b9961d485c8e04703f71cbeb06da11
https://github.com/fonttools/fonttools/commit/8c8a516e93b9961d485c8e04703f71cbeb06da11
Author: Jens Kutilek <
web...@kutilek.de>
Date: 2026-06-18 (Thu, 18 Jun 2026)
Changed paths:
M Lib/fontTools/ttLib/ttCollection.py
Log Message:
-----------
Save a V2 TTC if TTCollection.dsig is present, even if it is None
Commit: 9de0e7aa92d01b4d28e81c29a1b64948da009ed5
https://github.com/fonttools/fonttools/commit/9de0e7aa92d01b4d28e81c29a1b64948da009ed5
Author: Jens Kutilek <
web...@kutilek.de>
Date: 2026-06-18 (Thu, 18 Jun 2026)
Changed paths:
M Tests/ttLib/ttCollection_test.py
Log Message:
-----------
Update tests
Commit: 92931fd8d61ef842200f23496f143b22f7c51e0c
https://github.com/fonttools/fonttools/commit/92931fd8d61ef842200f23496f143b22f7c51e0c
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-06-18 (Thu, 18 Jun 2026)
Changed paths:
M Lib/fontTools/ttLib/tables/otTables.py
M Tests/ttLib/tables/otTables_test.py
Log Message:
-----------
Avoid false success resolving lookup overflows
Commit: 5e84a4c24c88cc687c1c9890fcbb6ed5213fad98
https://github.com/fonttools/fonttools/commit/5e84a4c24c88cc687c1c9890fcbb6ed5213fad98
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-06-19 (Fri, 19 Jun 2026)
Changed paths:
M Lib/fontTools/ttLib/sfnt.py
M Lib/fontTools/ttLib/ttCollection.py
M Tests/ttLib/ttCollection_test.py
A Tests/ttx/data/TestTTCv2.ttc
Log Message:
-----------
Merge pull request #4100 from fonttools/ttc-v2
Commit: d4cde0a215d92e77b2dec9aecfca21409c06f6cf
https://github.com/fonttools/fonttools/commit/d4cde0a215d92e77b2dec9aecfca21409c06f6cf
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-06-22 (Mon, 22 Jun 2026)
Changed paths:
M Lib/fontTools/ttLib/ttCollection.py
Log Message:
-----------
Pin a single head.modified timestamp across TTCollection.save
Saving a TTC with recalcTimestamp=True restamps each font's head from
timestampNow() (1-second granularity); if the clock ticks between two fonts'
head.compile() calls their heads diverge, no longer dedup, and the saved size
shifts by a whole head table (+56 bytes) -- the flaky TTC v2 roundtrip test
failures. Stamp one timestamp across the collection so the heads stay shareable.
https://github.com/fonttools/fonttools/issues/4110
Commit: c261dc5516b36430ab079d6b24844d8931d2202c
https://github.com/fonttools/fonttools/commit/c261dc5516b36430ab079d6b24844d8931d2202c
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-06-22 (Mon, 22 Jun 2026)
Changed paths:
M Tests/ttLib/ttCollection_test.py
Log Message:
-----------
Add regression test for deterministic TTCollection.save
Forces timestampNow() to tick on every call and checks the two fonts' head
tables still share one 'modified' (so a clock tick adds no extra head table).
Commit: ca105fa4b5f133a5fde7d7d5359474c993afd52d
https://github.com/fonttools/fonttools/commit/ca105fa4b5f133a5fde7d7d5359474c993afd52d
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-06-22 (Mon, 22 Jun 2026)
Changed paths:
M Lib/fontTools/ttLib/ttCollection.py
M Tests/ttLib/ttCollection_test.py
Log Message:
-----------
Merge pull request #4111 from fonttools/ttc-deterministic-head-timestamp
Pin a single head.modified timestamp across TTCollection.save
Commit: 57493798b5fc3363206189cd0255e593d6de0a6a
https://github.com/fonttools/fonttools/commit/57493798b5fc3363206189cd0255e593d6de0a6a
Author: AmitMY <
am...@nagish.com>
Date: 2026-06-22 (Mon, 22 Jun 2026)
Changed paths:
M Lib/fontTools/ttLib/tables/otTables.py
M Tests/ttLib/tables/otTables_test.py
Log Message:
-----------
Give an actionable error when LookupList overflow is unrecoverable
When a LookupList -> Lookup offset overflows and every lookup is already an
Extension lookup, fixLookupOverFlows has nothing left to promote and silently
returned 0, so compile re-raised a bare OTLOffsetOverflowError with no
explanation. Log a clear, actionable message instead.
The log is guarded on overflowRecord.SubTableIndex is None so it only fires for
genuine LookupList -> Lookup overflows, not for the subtable-overflow fallback
path (where fixLookupOverFlows is re-tried with SubTableIndex set and the
"LookupList offset overflowed" wording would be misleading). The advice is also
conditioned on have_uharfbuzz: suggest installing uharfbuzz only when it isn't
already installed; otherwise suggest reducing the number of lookups.
Co-Authored-By: Claude Opus 4.8 (1M context) <
nor...@anthropic.com>
Commit: bf587c50401f5a0036b9498682a753a92447ffbd
https://github.com/fonttools/fonttools/commit/bf587c50401f5a0036b9498682a753a92447ffbd
Author: Cosimo Lupo <
cos...@anthrotype.com>
Date: 2026-06-22 (Mon, 22 Jun 2026)
Changed paths:
M Lib/fontTools/ttLib/tables/otTables.py
M Tests/ttLib/tables/otTables_test.py
Log Message:
-----------
Merge pull request #4109 from AmitMY/fix-lookuplist-overflow-message
Commit: 11760625df5cf8cdde2d1dffe285a8946e97a139
https://github.com/fonttools/fonttools/commit/11760625df5cf8cdde2d1dffe285a8946e97a139
Author: dependabot[bot] <49699333+dependabot[bot]@
users.noreply.github.com>
Date: 2026-06-23 (Tue, 23 Jun 2026)
Changed paths:
M .github/workflows/test.yml
M .github/workflows/wheels.yml
Log Message:
-----------
Bump actions/checkout from 6 to 7 (#4112)
Bumps [actions/checkout](
https://github.com/actions/checkout) from 6 to 7.
- [Release notes](
https://github.com/actions/checkout/releases)
- [Changelog](
https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](
https://github.com/actions/checkout/compare/v6...v7)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <
sup...@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@
users.noreply.github.com>
Commit: 06f9e986d30c04adeda8aa40c9fe9f96267c1407
https://github.com/fonttools/fonttools/commit/06f9e986d30c04adeda8aa40c9fe9f96267c1407
Author: Jens Kutilek <
web...@kutilek.de>
Date: 2026-06-23 (Tue, 23 Jun 2026)
Changed paths:
M NEWS.rst
Log Message:
-----------
Update NEWS.rst [skip ci]
Commit: fec4e74985ede2f98c6e3b54ea2c83417db1338c
https://github.com/fonttools/fonttools/commit/fec4e74985ede2f98c6e3b54ea2c83417db1338c
Author: Jens Kutilek <
web...@kutilek.de>
Date: 2026-06-23 (Tue, 23 Jun 2026)
Changed paths:
M NEWS.rst
Log Message:
-----------
Remove title line [skip ci]
Commit: e8bc4078c07a289a40ae466b9ec573af9e3df78e
https://github.com/fonttools/fonttools/commit/e8bc4078c07a289a40ae466b9ec573af9e3df78e
Author: Rob Hagemans <
rob.ha...@hotmail.com>
Date: 2026-06-30 (Tue, 30 Jun 2026)
Changed paths:
M Doc/source/ttx.rst
M Lib/fontTools/ttLib/tables/__init__.py
M Lib/fontTools/ttLib/ttFont.py
Log Message:
-----------
add `bhed`, `bdat`, and `bloc` tables as variants of `head`, `EBDT`, and `EBLC`
Commit: 4981fa915fd13b7319c2383e0ca8a30c7b3f264e
https://github.com/fonttools/fonttools/commit/4981fa915fd13b7319c2383e0ca8a30c7b3f264e
Author: Rob Hagemans <
rob.ha...@hotmail.com>
Date: 2026-06-30 (Tue, 30 Jun 2026)
Changed paths:
A Doc/source/ttLib/tables/_b_d_a_t.rst
A Doc/source/ttLib/tables/_b_h_e_d.rst
A Doc/source/ttLib/tables/_b_l_o_c.rst
A Lib/fontTools/ttLib/tables/_b_d_a_t.py
A Lib/fontTools/ttLib/tables/_b_h_e_d.py
A Lib/fontTools/ttLib/tables/_b_l_o_c.py
Log Message:
-----------
oops, actually add the tables
Commit: 4801a311136bfdbc35e6b1b1ddbeae9e57fa0bbe
https://github.com/fonttools/fonttools/commit/4801a311136bfdbc35e6b1b1ddbeae9e57fa0bbe
Author: Rob Hagemans <
rob.ha...@hotmail.com>
Date: 2026-06-30 (Tue, 30 Jun 2026)
Changed paths:
M Lib/fontTools/ttLib/tables/_b_d_a_t.py
M Lib/fontTools/ttLib/tables/_b_h_e_d.py
M Lib/fontTools/ttLib/tables/_b_l_o_c.py
Log Message:
-----------
reformat w/ black
Commit: 76102529a196aeb221676120ab46249e1454e809
https://github.com/fonttools/fonttools/commit/76102529a196aeb221676120ab46249e1454e809
Author: Rob Hagemans <
rob.ha...@hotmail.com>
Date: 2026-06-30 (Tue, 30 Jun 2026)
Changed paths:
M Doc/source/ttLib/tables.rst
Log Message:
-----------
update tables.rst
Commit: 0462906af4fc1a336705192257e4d2a6c696f5c8
https://github.com/fonttools/fonttools/commit/0462906af4fc1a336705192257e4d2a6c696f5c8
Author: Rob Hagemans <
rob.ha...@hotmail.com>
Date: 2026-06-30 (Tue, 30 Jun 2026)
Changed paths:
M Lib/fontTools/ttLib/ttFont.py
Log Message:
-----------
add overload stubs
Commit: c23db9898fa63c1cc6e987bd1481e2652f7f2b9e
https://github.com/fonttools/fonttools/commit/c23db9898fa63c1cc6e987bd1481e2652f7f2b9e
Author: Rob Hagemans <
rob.ha...@hotmail.com>
Date: 2026-06-30 (Tue, 30 Jun 2026)
Changed paths:
M Lib/fontTools/ttLib/tables/_b_l_o_c.py
Log Message:
-----------
update bloc dependencies
Commit: 41af9f64813b77ac426ae5cbb5fd47dbbd630803
https://github.com/fonttools/fonttools/commit/41af9f64813b77ac426ae5cbb5fd47dbbd630803
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-06-30 (Tue, 30 Jun 2026)
Changed paths:
M Doc/source/ttLib/tables.rst
A Doc/source/ttLib/tables/_b_d_a_t.rst
A Doc/source/ttLib/tables/_b_h_e_d.rst
A Doc/source/ttLib/tables/_b_l_o_c.rst
M Doc/source/ttx.rst
M Lib/fontTools/ttLib/tables/__init__.py
A Lib/fontTools/ttLib/tables/_b_d_a_t.py
A Lib/fontTools/ttLib/tables/_b_h_e_d.py
A Lib/fontTools/ttLib/tables/_b_l_o_c.py
M Lib/fontTools/ttLib/ttFont.py
Log Message:
-----------
Merge pull request #4115 from robhagemans/bdat-bhed-bloc
add `bhed`, `bdat`, `bloc` tables as variants of `head`, `EBDT`, `EBLC`
Commit: c265801a89e80adcc8231f560dc9dd2fcc3b7ca8
https://github.com/fonttools/fonttools/commit/c265801a89e80adcc8231f560dc9dd2fcc3b7ca8
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-07-01 (Wed, 01 Jul 2026)
Changed paths:
M .github/workflows/test.yml
M .github/workflows/wheels.yml
M Doc/source/index.rst
M Doc/source/ttLib/tables.rst
A Doc/source/ttLib/tables/D__e_b_g.rst
R Doc/source/ttLib/tables/G_M_A_P_.rst
R Doc/source/ttLib/tables/G_P_K_G_.rst
A Doc/source/ttLib/tables/G_V_A_R_.rst
A Doc/source/ttLib/tables/I_F_T_.rst
A Doc/source/ttLib/tables/I_F_T_X_.rst
R Doc/source/ttLib/tables/M_E_T_A_.rst
R Doc/source/ttLib/tables/S_I_N_G_.rst
A Doc/source/ttLib/tables/V_A_R_C_.rst
A Doc/source/ttLib/tables/_b_d_a_t.rst
A Doc/source/ttLib/tables/_b_g_c_l.rst
A Doc/source/ttLib/tables/_b_h_e_d.rst
A Doc/source/ttLib/tables/_b_l_o_c.rst
M Doc/source/ttx.rst
M Lib/fontTools/__init__.py
M Lib/fontTools/cffLib/__init__.py
M Lib/fontTools/colorLib/builder.py
M Lib/fontTools/cu2qu/cli.py
M Lib/fontTools/cu2qu/cu2qu.py
M Lib/fontTools/cu2qu/ufo.py
M Lib/fontTools/designspaceLib/__init__.py
M Lib/fontTools/diff/__init__.py
M Lib/fontTools/feaLib/builder.py
M Lib/fontTools/feaLib/parser.py
M Lib/fontTools/feaLib/variableScalar.py
A Lib/fontTools/misc/iftSparseBitSet.py
M Lib/fontTools/otlLib/builder.py
M Lib/fontTools/qu2cu/cli.py
M Lib/fontTools/qu2cu/qu2cu.py
M Lib/fontTools/subset/__init__.py
M Lib/fontTools/svgLib/path/shapes.py
M Lib/fontTools/ttLib/sfnt.py
M Lib/fontTools/ttLib/tables/F__e_a_t.py
R Lib/fontTools/ttLib/tables/G_M_A_P_.py
R Lib/fontTools/ttLib/tables/G_P_K_G_.py
A Lib/fontTools/ttLib/tables/I_F_T_.py
A Lib/fontTools/ttLib/tables/I_F_T_X_.py
R Lib/fontTools/ttLib/tables/M_E_T_A_.py
M Lib/fontTools/ttLib/tables/O_S_2f_2.py
R Lib/fontTools/ttLib/tables/S_I_N_G_.py
M Lib/fontTools/ttLib/tables/__init__.py
A Lib/fontTools/ttLib/tables/_b_d_a_t.py
A Lib/fontTools/ttLib/tables/_b_g_c_l.py
A Lib/fontTools/ttLib/tables/_b_h_e_d.py
A Lib/fontTools/ttLib/tables/_b_l_o_c.py
M Lib/fontTools/ttLib/tables/_c_m_a_p.py
M Lib/fontTools/ttLib/tables/_g_l_y_f.py
M Lib/fontTools/ttLib/tables/otBase.py
M Lib/fontTools/ttLib/tables/otConverters.py
M Lib/fontTools/ttLib/tables/otData.py
A Lib/fontTools/ttLib/tables/otDataSchema.py
M Lib/fontTools/ttLib/tables/otTables.py
M Lib/fontTools/ttLib/tables/ttProgram.py
M Lib/fontTools/ttLib/ttCollection.py
M Lib/fontTools/ttLib/ttFont.py
M Lib/fontTools/ufoLib/__init__.py
M Lib/fontTools/ufoLib/kerning.py
M Lib/fontTools/varLib/__init__.py
M Lib/fontTools/varLib/avar/build.py
M Lib/fontTools/varLib/avar/map.py
M Lib/fontTools/varLib/avar/unbuild.py
M Lib/fontTools/varLib/interpolatable.py
M Lib/fontTools/varLib/interpolatableHelpers.py
M Lib/fontTools/varLib/interpolatablePlot.py
M Lib/fontTools/varLib/interpolatableTestContourOrder.py
M Lib/fontTools/varLib/interpolatableTestStartingPoint.py
M Lib/fontTools/varLib/models.py
A MetaTools/check_table_coverage.py
M NEWS.rst
M Tests/colorLib/builder_test.py
M Tests/cu2qu/cu2qu_test.py
M Tests/cu2qu/ufo_test.py
M Tests/designspaceLib/designspace_test.py
M Tests/feaLib/builder_test.py
A Tests/feaLib/data/bug1196.fea
A Tests/feaLib/data/bug1196.ttx
M Tests/feaLib/data/bug463.ttx
M Tests/feaLib/data/bug512.ttx
A Tests/feaLib/data/chain_context_multi_subst_class.fea
A Tests/feaLib/data/chain_context_multi_subst_class.ttx
M Tests/feaLib/data/contextual_inline_multi_sub_format_2.ttx
A Tests/feaLib/data/contextual_merge_alternate.fea
A Tests/feaLib/data/contextual_merge_alternate.ttx
A Tests/feaLib/data/contextual_merge_gpos_named.fea
A Tests/feaLib/data/contextual_merge_gpos_named.ttx
A Tests/feaLib/data/contextual_merge_gsub_named.fea
A Tests/feaLib/data/contextual_merge_gsub_named.ttx
A Tests/feaLib/data/contextual_merge_ignore.fea
A Tests/feaLib/data/contextual_merge_ignore.ttx
M Tests/feaLib/data/feature_aalt.ttx
M Tests/feaLib/parser_test.py
M Tests/feaLib/variableScalar_test.py
A Tests/metaTools/check_table_coverage_test.py
A Tests/misc/iftSparseBitSet_test.py
M Tests/misc/py23_test.py
M Tests/qu2cu/qu2cu_cli_test.py
M Tests/qu2cu/qu2cu_test.py
A Tests/subset/data/test_math_closure.ttx
M Tests/subset/subset_test.py
M Tests/svgLib/path/path_test.py
M Tests/ttLib/tables/O_S_2f_2_test.py
A Tests/ttLib/tables/_b_g_c_l_test.py
M Tests/ttLib/tables/_c_m_a_p_test.py
M Tests/ttLib/tables/_g_l_y_f_test.py
M Tests/ttLib/tables/data/graphite/graphite_tests.ttx.Feat
A Tests/ttLib/tables/data/graphite/graphite_tests.ttx.Feat.setup
M Tests/ttLib/tables/otBase_test.py
M Tests/ttLib/tables/otTables_test.py
M Tests/ttLib/ttCollection_test.py
M Tests/ttLib/ttFont_test.py
A Tests/ttx/data/TestTTCv2.ttc
M Tests/varLib/avar_test.py
M Tests/varLib/data/test_results/Mutator_Getvar-instance.ttx
M Tests/varLib/models_test.py
M requirements.txt
M setup.cfg
M setup.py
Log Message:
-----------
Merge branch 'main' into avar2-instancing
Commit: 0c0efb8ea2645ea0578a741894e0654858c163ba
https://github.com/fonttools/fonttools/commit/0c0efb8ea2645ea0578a741894e0654858c163ba
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-07-01 (Wed, 01 Jul 2026)
Changed paths:
M Lib/fontTools/varLib/instancer/__init__.py
Log Message:
-----------
[instancer] Fix avar2 offset compensation corrupting shared varIdx axes
avar2's DeltaSetIndexMap may map several fvar axes to a single shared IVS
delta row (a legal storage optimization; the parametric Amstelvar test font
does exactly this: GRAD & XOPQ share one varIdx, YOPQ/YTLC/YTUC share
another, etc.). _instantiateAvarV2 writes each restricted/pinned axis's
offset-compensation deltas (empty-region bias + tents) into that axis's delta
row, so when the row was shared the offsets leaked into every other axis
reading it, corrupting their final normalized coordinates by up to ~1.0 (full
scale) and producing grossly wrong rendering.
Before adding offset compensation, privatize shared rows: any offset-receiving
axis whose varIdx is referenced by more than one axis gets its own copy of the
delta row (identical contents, so the rebased delta is preserved) and its
VarIdxMap entry is repointed to it. Sharers keep the clean row; offsets land on
private rows. VarStore.optimize() re-shares identical rows afterwards. This is a
minimal, local change that leaves the IVS<->TupleVariation conversion untouched.
Verified against a differential harness (avar2 spec pipeline as ground truth)
across all 12 single-axis and 66 pairwise restrictions plus pin/moved-default
cases: free-axis contamination drops from up to 16145/16384 F2Dot14 units to 0,
end to end (final coords and rendered glyf+hmtx).
Co-Authored-By: Claude Opus 4.8 (1M context) <
nor...@anthropic.com>
Commit: ee3f1428e6d1095282b5b812a3e340a91f6b5c72
https://github.com/fonttools/fonttools/commit/ee3f1428e6d1095282b5b812a3e340a91f6b5c72
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-07-01 (Wed, 01 Jul 2026)
Changed paths:
M Tests/varLib/instancer/instancer_test.py
Log Message:
-----------
[instancer] Add avar2 shared-varIdx regression tests
Add a differential oracle (_avar2_final_coords) that computes final normalized
coordinates via the avar2 spec pipeline (fvar normalization + avar
renormalizeLocation), and parametrized tests asserting a partial instance
reproduces the original font's final coordinates for every surviving axis at
sampled user locations.
Covers the cases the previous tests missed: multiple axes sharing one avar2
varIdx (restricting/pinning them), a restricted axis whose default moves, and a
free axis whose shared-varIdx partner is restricted or pinned. Each case fails
on the pre-fix code (final coordinates of untouched axes diverge by thousands
of F2Dot14 units) and passes with the fix.
Co-Authored-By: Claude Opus 4.8 (1M context) <
nor...@anthropic.com>
Commit: 3382ab80617665cc78338806d008600d080d1174
https://github.com/fonttools/fonttools/commit/3382ab80617665cc78338806d008600d080d1174
Author: Behdad Esfahbod <
beh...@behdad.org>
Date: 2026-07-01 (Wed, 01 Jul 2026)
Changed paths:
M Lib/fontTools/varLib/instancer/__init__.py
M Tests/varLib/instancer/instancer_test.py
Log Message:
-----------
[instancer] Fix avar2 offset compensation at interior coords when default moves
The avar2 offset compensation modeled the inverse renormalization
offset(z) = inv_renorm(z) - z as two tents with a single kink at the new
default (z=0). That is exact only at the new min/default/max. When a partial
instance MOVES an axis's default, inv_renorm has an additional kink where the
OLD default lands in the new intermediate space (where the old intermediate
coordinate crosses 0), so interior user coordinates between the old and new
default were wrong -- e.g. restricting XTRA (324,562,640) to (421,586,617) and
evaluating at XTRA=519 gave a final coordinate off by ~0.12 normalized (2013
F2Dot14 units), a visible rendering error. (The design doc's claim that
inv_renorm is "always two-piece linear" holds only when the default is fixed.)
Collect the offset function's actual breakpoints -- the new min/default/max
plus the old-default position when it falls inside the new range -- and feed
them to a VariationModel to synthesize the correct tents. This reduces exactly
to the previous two tents when the default is unchanged (z_old == 0), so
fixed-default instancing is unaffected.
Add regression tests sampling moved-default restrictions at interior points
(unique-varIdx and shared-varIdx axes); both fail before this change and pass
after. Verified across an 894-scenario differential sweep (all single/pair/
triple restrict, pin+moved, and all-moved combinations): 0 failures.
Co-Authored-By: Claude Opus 4.8 (1M context) <
nor...@anthropic.com>
Compare:
https://github.com/fonttools/fonttools/compare/20b8b5ad870a...3382ab806176
To unsubscribe from these emails, change your notification settings at
https://github.com/fonttools/fonttools/settings/notifications