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.58.4 (released 2025-06-13)
----------------------------
- [feaLib] Allow for empty MarkFilter & MarkAttach sets (#3856).
4.58.3 (released 2025-06-13)
----------------------------
- [feaLib] Fixed iterable check for Python 3.13.4 and newer (#3854, #3855).
4.58.2 (released 2025-06-06)
----------------------------
- [ttLib.reorderGlyphs] Handle CFF2 when reordering glyphs (#3852)
- [subset] Copy name IDs in use before scrapping or scrambling them for
webfonts (#3853)
4.58.1 (released 2025-05-28)
----------------------------
- [varLib] Make sure that fvar named instances only reuse name ID 2 or 17
if they are at the default location across all axes, to match OT spec
requirement (#3831).
- [feaLib] Improve single substitution promotion to multiple/ligature
substitutions, fixing a few bugs as well (#3849).
- [loggingTools] Make ``Timer._time`` a static method that doesn't take
self, makes it easier to override (#3836).
- [featureVars] Use None for empty ConditionSet, which translates to a null
offset in the compiled table (#3850).
- [feaLib] Raise an error on conflicting ligature substitution rules
instead of silently taking the last one (#3835).
- Add typing annotations to T2CharStringPen (#3837).
- [feaLib] Add single substitutions that were promoted to multiple or
ligature substitutions to aalt feature (#3847).
- [featureVars] Create a default LangSys in a ScriptRecord if missing when
adding feature variations to existing GSUB later in the build (#3838).
- [symfont] Added a ``main()``.
- [cffLib.specializer] Fix rmoveto merging when blends used (#3839, #3840).
- [pyftmerge] Add support for cmap format 14 in the merge tool (#3830).
- [varLib.instancer/cff2] Fix vsindex of Private dicts when instantiating
(#3828, #3232).
- Update text file read to use UTF-8 with optional BOM so it works with
e.g. Windows Notepad.exe (#3824).
- [varLib] Ensure that instances only reuse name ID 2 or 17 if they are at
the default location across all axes (#3831).
- [varLib] Create a dflt LangSys in a ScriptRecord when adding variations
later, to fix an avoidable crash in an edge case (#3838).
4.58.0 (released 2025-05-10)
----------------------------
- Drop Python 3.8, require 3.9+ (#3819)
- [HVAR, VVAR] Prune unused regions when using a direct mapping (#3797)
- [Docs] Improvements to ufoLib documentation (#3721)
- [Docs] Improvements to varLib documentation (#3727)
- [Docs] Improvements to Pens and pen-module documentation (#3724)
- [Docs] Miscellany updates to docs (misc modules and smaller modules)
(#3730)
- [subset] Close codepoints over BiDi mirror variants. (#3801)
- [feaLib] Fix serializing ChainContextPosStatement and
ChainContextSubstStatement in some rare cases (#3788)
- [designspaceLib] Clarify user expectations for getStatNames (#2892)
- [GVAR] Add support for new `GVAR` table (#3728)
- [TSI0, TSI5] Derive number of entries to decompile from data length
(#2477)
- [ttLib] Fix `AttributeError` when reporting table overflow (#3808)
- [ttLib] Apply rounding more often in getCoordinates (#3798)
- [ttLib] Ignore component bounds if empty (#3799)
- [ttLib] Change the separator for duplicate glyph names from "#" to "."
|