single |
|CI Build Status| |Coverage Status| |PyPI| |Gitter Chat|
What is this?
~~~~~~~~~~~~~
| fontTools is a library for manipulating fonts, written in Python. The
project includes the TTX tool, that can convert TrueType and OpenType
fonts to and from an XML text format, which is also called TTX. It
supports TrueType, OpenType, AFM and to an extent Type 1 and some
Mac-specific formats. The project has an `MIT open-source
license `__.
| Among other things this means you can use it free of charge.
[User documentation] and
[developer documentation]
are available at [Read the Docs].
Installation
~~~~~~~~~~~~
FontTools requires [Python] 3.9
or later. We try to follow the same schedule of minimum Python version
support as
NumPy (see [NEP 29]).
The package is listed in the Python Package Index (PyPI), so you can
install it with [pip]:
Changelog
~~~~~~~~~
4.60.1 (released 2025-09-29)
----------------------------
- [ufoLib] Reverted accidental method name change in
``UFOReader.getKerningGroupConversionRenameMaps``
that broke compatibility with downstream projects like defcon (#3948,
#3947, robotools/defcon#478).
- [ufoLib] Added test coverage for getKerningGroupConversionRenameMaps
method (#3950).
- [subset] Don't try to subset BASE table; pass it through by default
instead (#3949).
- [subset] Remove empty BaseRecord entries in MarkBasePos lookups (#3897,
#3892).
- [subset] Add pruning for MarkLigPos and MarkMarkPos lookups (#3946).
- [subset] Remove duplicate features when subsetting (#3945).
- [Docs] Added documentation for the visitor module (#3944).
4.60.0 (released 2025-09-17)
----------------------------
- [pointPen] Allow reverseFlipped parameter of DecomposingPointPen to take
a ReverseFlipped
enum value to control whether/how to reverse contour direction of flipped
components, in addition to
the existing True/False. This allows to set
``ReverseFlipped.ON_CURVE_FIRST`` to ensure that
the decomposed outline starts with an on-curve point before being
reversed, for better consistency
with other segment-oriented contour transformations. The change is
backward compatible, and the
default behavior hasn't changed (#3934).
- [filterPen] Added ContourFilterPointPen, base pen for buffered contour
operations, and
OnCurveStartPointPen filter to ensure contours start with an on-curve
point (#3934).
- [cu2qu] Fixed difference in cython vs pure-python complex division by
real number (#3930).
- [varLib.avar] Refactored and added some new sub-modules and scripts
(#3926).
* ``varLib.avar.build`` module to build avar (and a missing fvar)
binaries into a possibly empty TTFont,
* ``varLib.avar.unbuild`` module to print a .designspace snippet that
would generate the same avar binary,
* ``varLib.avar.map`` module to take TTFont and do the mapping, in
user/normalized space,
* ``varLib.avar.plan module moved from varLib.avarPlanner``.
The bare ``fonttools varLib.avar`` script is deprecated, in favour of
``fonttools varLib.avar.build`` (or unbuild).
- [interpolatable] Clarify linear_sum_assignment backend options and
minimal dependency
usage (#3927).
- [post] Speed up build_psNameMapping (#3923).
- [ufoLib] Added typing annotations to fontTools.ufoLib (#3875).
4.59.2 (released 2025-08-27)
----------------------------
- [varLib] Clear USE_MY_METRICS component flags when inconsistent across
masters (#3912).
- [varLib.instancer] Avoid negative advance width/height values when
instatiating HVAR/VVAR,
(unlikely in well-behaved fonts) (#3918).
- [subset] Fix shaping behaviour when pruning empty mark sets (#3915,
harfbuzz/harfbuzz#5499).
- [cu2qu] Fixed ``dot()`` product of perpendicular vectors not always
returning exactly 0.0
in all Python implementations (#3911)
- [varLib.instancer] Implemented fully-instantiating avar2 fonts (#3909).
- [feaLib] Allow float values in VariableScalar's axis locations (#3906,
|