NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #157 most downloaded on PyPI
Tools to manipulate font files
Last release 2 days ago
29 Sep 2026
Release timing varies
gaps range from 9 days to 4 months
Nearly every release is documented
notes for 59 of the last 60 stable releases
2 versions withdrawn
withdrawn after publishing
13 years old
238 releases · first in 2013
[feaLib] Fixed issue whereby lookups from DFLT/dflt were not included in the DFLT/non-dflt language systems (#1307).
--layout-scripts option to add/exclude set of OpenType layout scripts that will be preserved. By default all scripts are retained ('*') (#1303).[feaLib] In the OTL table builder, when the name table is excluded from the list of tables to be built, skip compiling featureNames blocks, as the rec
name table is excluded from the list of tables to be built, skip compiling featureNames blocks, as the records referenced in FeatureParams table don't exist (68951b7).ExtensionLookup if other offset-overflow methods fail (05f95f0).subtable; break statements in PairPos lookups; previously these were ignored (#1279, #1300, #1302).MarkBasePos subtables (#1297).--flavor option, or the value of TTFont.sfntVersion (d7ac0ad).TTLibError exception (#1285).dflt under DFLT script (#1278, #1292).One column per quarter.
[featureVars] Added experimental module to build FeatureVariations tables. Still needs to be hooked up to varLib.build (#1240).
FeatureVariations tables. Still needs to be hooked up to varLib.build (#1240).otRound to round floats to nearest integer towards positive Infinity. This is now used where we deal with visual data like X/Y coordinates, advance widths/heights, variation deltas, and similar (#1274, #1248).SubtableStatement to string (#1275).OS/2.usWeightClass and usWidthClass, and post.italicAngle based on the 'wght', 'wdth' and 'slnt' axis values (#1276, #1264).logging.lastResort handler on py27. Moved LastResortLogger to the loggingTools module (#1277).[ttGlyphPen] Issue a warning and skip building non-existing components (googlei18n/fontmake#411).
[ttGlyphPen] Issue a warning and skip building non-existing components (https://github.com/googlei18n/fontmake/issues/411).
[tests] Fixed issue running ttx_test.py from a tagged commit.
[designspaceLib] Added new conditionset element to rule element in designspace document. Bumped format attribute to 4.0 (previously, it was formatted
conditionset element to rule element in designspace document.format attribute to 4.0 (previously, it was formatted as an integer).checkDefault, checkAxes methods, and any kind of guessing about the axes when the <axes> element is missing. The default master is expected at the intersection of all default
values for each axis (#1254, #1255, #1267).cvar table when glyf table is not present, as is the case for CFF2 fonts.maxp.numGlyphs when post or cmap are missing.__len__ method to _TTGlyphSet.GlyphCoordinates never overflow signed shorts (#1230).itertools.izip shadowing the built-in zip.log property of LogMixin class (fbab12).[designspace] Added a new optional layer attribute to the source element, and a corresponding layerName attribute to the SourceDescriptor object (#125
layer attribute to the source element, and a corresponding layerName attribute to the SourceDescriptor object (#1253).conditionset element to the rule element to the spec, but not implemented in designspace reader/writer yet (#1254).--master-finder command-line option (#1249).--font-number command-line option for collections.kind argument to T1Font constructor (c5c161c).TTFont class, so it can be used in with statements to auto-close the file when exiting the context (#1232).[varLib] Improved support-resolution algorithm. Previously, the on-axis masters would always cut the space. They don't anymore. That's more consistent
main() entry point, that takes positions and prints model results.matplotlib.[otBase] Don't fail during ValueRecord copy if src has more items. We drop hinting in the subsetter by simply changing ValueFormat, without cleaning u
ValueRecord copy if src has more items.
We drop hinting in the subsetter by simply changing ValueFormat, without cleaning up the actual ValueRecords. This was causing assertion error if a variable font was subsetted without hinting and then passed directly to the mutator for instantiation without first it saving to disk (https://github.com/fonttools/fonttools/commit/d3a6a4e9e4a8a9f9e083abcac43405237863bb0c).[varLib] Don't remap the same DeviceTable twice in VarStore optimizer (#1206).
DeviceTable twice in VarStore optimizer (#1206).--disable-iup option to fonttools varLib script, and a optimize=True keyword argument to varLib.build function, to optionally disable IUP optimization while building varfonts.[ttGlyphPen] Decompose composite glyphs if any components' transform is too large to fit a F2Dot14 value, or clamp transform values that are (almost)
F2Dot14 value, or clamp transform values that are (almost) equal to +2.0 to make them fit and avoid decomposing (#1200,
#1204, #1205).-g option to dump glyphs from the glyf table splitted as individual ttx files (#153, #1035, #1132, #1202).ufoLib.filenames module to fontTools.misc.filenames, used for the ttx split-glyphs option (#1202).cvParameters blocks in Character Variant feautures cv01-cv99 (#860, #1169).checksum.py script to generate/check SHA1 hash of ttx files (#1197).gvar phantom points could turn up to be negative (#1198).ValueRecord Device objects (54fd71f).location is no longer a required positional argument, but an optional kewyord argument (defaults to None). This will make it easier to construct feature AST from code (#1201).[designspaceLib] Added an optional lib element to the designspace as a whole, as well as to the instance elements, to store arbitrary data in a proper
lib element to the designspace as a whole, as well as to the instance elements, to store arbitrary data in a property list dictionary, similar to the UFO's lib.font attribute to the SourceDescriptor, to allow operating on in-memory font objects (#1175).-s option (#1188).IncludedFeaNotFound custom exception subclass, raised when an included feature file cannot be found (#1186).VarIdxMap to use glyph names internally instead of glyph indexes. The old ttx dumps of HVAR/VVAR tables that contain indexes can still be imported (21cbab8, 38a0ffb).numFonts attribute of SFNTReader object (#1181).LangSysRecords (#1180).--name-IDs from 0 to 6 by default (#1170, #605, #114).width module to calculate optimal CFF default and nominal glyph widths.[subset] Support subsetting endchar acting as seac-like components in CFF (fixes #1162).
3.22.0
endchar acting as seac-like components in CFF (fixes #1162).ast.FeatureFile object.tables argument to only build some tables instead of all (#1159, #1163).safeEval with ast.literal_eval (#1139).include statements (#1154).ttCollection module to read/write TrueType and OpenType Collections.TTCollection class with a fonts attribute containing a list of TTFont instances, the methods save and saveXML, plus some list-like methods. The importXML method is not implemented yet (#17).ot_tag_to_script function that converts from OpenType script tag to Unicode script code.designspaceLib subpackage, originally from Erik Van Blokland's designSpaceDocument:
https://github.com/LettError/designSpaceDocumentscript_horizontal_direction function that returns either "LTR" or "RTL" given a unicode script code.ot_tags_from_script function to get the list of OpenType script tags associated with unicode script code (#1150).CapturingLogHandler.assertRegex method, match the fully formatted log message.approximate_fallback argument in calcQuadraticArcLength. Added calcCubicArcLength (#1142).[varLib] Fixed merging PairPos Format1/2 with missing subtables (#1125).
[feaLib] Allow mixed single/multiple substitutions
*.afm test assets to MAINFEST.in (#1137).SVG tables containing color palettes (#1124)[cmap] when compiling format6 subtable, don't assume gid0 is always called '.notdef' (1e42224).
[unicodedata] Fixed issue with script and script_extension functions returning inconsistent short vs long names. They both return the short four-lette
script and script_extension functions returning inconsistent short vs long names. They both return the short four-letter script codes now. Added script_name and script_code functions to look up the long human-readable script name from the script code, and viceversa (#1109, #1111).The latter still works but with a pending deprecation warning (#1104).
fontTools.unicodedata which exports the same interface as the built-in unicodedata module, with the addition of a few functions that are missing from the latter, such as script, script_extension and block. Added a MetaTools/buildUCD.py script to download and parse data files from the Unicode Character Database and generate python modules containing lists of ranges and property values.__str__ method to all ast elements (delegates to the asFea method).Parser constructor now accepts a glyphNames iterable instead of glyphMap dict. The latter still works but with a pending deprecation warning (#1104).pens.perimeterPen module (#1101).redirect_stdout and redirect_stderr context managers (#1097).[varLib] Try set of used points instead of all points when testing whether to share points between tuples (#1090).
[varLib] Try set of used points instead of all points when testing whether to share points between tuples (#1090).
[CFF2] Fixed issue with reading/writing PrivateDict BlueValues to TTX file. Read the commit message 8b02b5a and issue #1030 for more details. NOTE: this change invalidates all the TTX files containing CFF2 tables that where dumped with previous verisons of fonttools. CFF2 Subr items can have values on the stack after the last operator, thus a CFF2Subr class was added to accommodate this (#1091).
[_k_e_r_n] Fixed compilation of AAT kern version=1.0 tables (#1089, #1094)
[ttLib] Added getBestCmap() convenience method to TTFont class and cmap table class that returns a preferred Unicode cmap subtable given a list of options (#1092).
[morx] Emit more meaningful subtable flags. Implement InsertionMorphAction
[feaLib] Fixed writing back nested glyph classes (#1086).
[feaLib] Fixed writing back nested glyph classes (#1086).
[TupleVariation] Reactivated shared points logic, bugfixes (#1009).
[AAT] Implemented morx ligature subtables (#1082).
[reverseContourPen] Keep duplicate lineTo following a moveTo (#1080, https://github.com/googlei18n/cu2qu/issues/51).
[varLib.mutator] Suport instantiation of GPOS, GDEF and MVAR (#1079).
[sstruct] Fixed issue with unicode_literals and struct module in old versions of python 2.7 (#993).
[svgPathPen] Added an SVGPathPen that translates segment pen commands into SVG path descriptions. Copied from Tal Leming's ufo2svg.svgPathPen https://
[svgPathPen] Added an SVGPathPen that translates segment pen commands into SVG path descriptions. Copied from Tal Leming's ufo2svg.svgPathPen https://github.com/typesupply/ufo2svg/blob/d69f992/Lib/ufo2svg/svgPathPen.py
[reverseContourPen] Added ReverseContourPen, a filter pen that draws contours with the winding direction reversed, while keeping the starting point (#1071).
[filterPen] Added ContourFilterPen to manipulate contours as a whole rather than segment by segment.
[arrayTools] Added Vector class to apply math operations on an array of numbers, and pairwise function to loop over pairs of items in an iterable.
[varLib] Added support for building and interpolation of cvar table (f874cf6, a25a401).
[head] Try using SOURCE_DATE_EPOCH environment variable when setting the head modified timestamp to ensure reproducible builds (#1063). See https://re
[head] Try using SOURCE_DATE_EPOCH environment variable when setting the head modified timestamp to ensure reproducible builds (#1063). See https://reproducible-builds.org/specs/source-date-epoch/
[VTT] Decode VTT's TSI* tables text as UTF-8 (#1060).
Added support for Graphite font tables: Feat, Glat, Gloc, Silf and Sill. Thanks @mhosken! (#1054).
[varLib] Default to using axis "name" attribute if "labelname" element is missing (588f524).
[merge] Added support for merging Script records. Remove unused features and lookups after merge (d802580, 556508b).
Added fontTools.svgLib package. Includes a parser for SVG Paths that supports the Pen protocol (#1051). Also, added a snippet to convert SVG outlines to UFO GLIF (#1053).
[AAT] Added support for ankr, bsln, mort, morx, gcid, and cidg.
[subset] Implemented subsetting of prop, opbd, bsln, lcar.
[otConverters] Implemented __add__ and __radd__ methods on otConverters._LazyList that decompile a lazy list before adding it to another list or _Lazy
[otConverters] Implemented __add__ and __radd__ methods on otConverters._LazyList that decompile a lazy list before adding it to another list or _LazyList instance. Fixes an AttributeError in the subset module when attempting to sum _LazyList objects (6ef48bd2, 1aef1683).
[AAT] Support the opbd table with optical bounds (a47f6588).
[AAT] Support prop table with glyph properties (d05617b4).
[AAT] Added support for AAT lookups. The lcar table can be decompiled and recompiled; futher work needed to handle morx table (#1025).
[AAT] Added support for AAT lookups. The lcar table can be decompiled and recompiled; futher work needed to handle morx table (#1025).
[subset] Keep (empty) DefaultLangSys for Script 'DFLT' (6eb807b5).
[subset] Support GSUB/GPOS.FeatureVariations (fe01d87b).
[varLib] In models.supportScalars, ignore an axis when its peak value is 0 (fixes #1020).
[varLib] Add default mappings to all axes in avar to fix rendering issue in some rasterizers (19c4b377, 04eacf13).
[varLib] Flatten multiple tail PairPosFormat2 subtables before merging (c55ef525).
[ttLib] Added support for recalculating font bounding box in CFF and head tables, and min/max values in hhea and vhea tables (#970).
[cffLib] Deprecated maxstack operator, per OpenType spec update 1.8.1.
[varLib.merger] Remove Extensions subtables before merging (f7c20cf8).
[varLib] Initialize the avar segment map with required default entries (#1014).
[varLib] Implemented optimal IUP optmiziation (#1019).
[otData] Add AxisValueFormat4 for STAT table v1.2 from OT v1.8.2 (#1015).
[name] Fixed BCP46 language tag for Mac langID=9: 'si' -> 'sl'.
[subset] Return value from _DehintingT2Decompiler.op_hintmask (c0d672ba).
[cffLib] Allow to get TopDict by index as well as by name (dca96c9c).
[cffLib] Removed global isCFF2 state; use one set of classes for both CFF and CFF2, maintaining backward compatibility existing code (#1007).
[cffLib] Deprecated maxstack operator, per OpenType spec update 1.8.1.
[cffLib] Added missing default (-100) for UnderlinePosition (#983).
[feaLib] Enable setting nameIDs greater than 255 (#1003).
[varLib] Recalculate ValueFormat when merging SinglePos (#996).
[varLib] Do not emit MVAR if there are no entries in the variation store (#987).
[ttx] For -x option, pad with space if table tag length is < 4.
[feaLib.builder] Removed duplicate lookups optimization. The original lookup order and semantics of the feature file are preserved (#976).
[feaLib.builder] Removed duplicate lookups optimization. The original lookup order and semantics of the feature file are preserved (#976).
[varLib.mutator] Implement IUP optimization (#969).
[varLib.mutator] Implement IUP optimization (#969).
[_g_l_y_f.GlyphCoordinates] Changed __bool__() semantics to match those of other iterables (e46f949). Removed __abs__() (3db5be2).
[varLib.interpolate_layout] Added mapped keyword argument to interpolate_layout to allow disabling avar mapping: if False (default), the location is mapped using the map element of the axes in designspace file; if True, it is assumed that location is in designspace's internal space and no mapping is performed (#950, #975).
[varLib.interpolate_layout] Import designspace-loading logic from varLib.
[varLib] Fixed bug with recombining PairPosClass2 subtables (81498e5, #914).
[cffLib.specializer] When copying iterables, cast to list (462b7f86).
[pens.t2CharStringPen] Fixed AttributeError when calling addComponent in T2CharStringPen (#965).
[pens.t2CharStringPen] Fixed AttributeError when calling addComponent in T2CharStringPen (#965).
[cffLib.specializer] Added new specializer module to optimize CFF charstrings, used by the T2CharStringPen (#948).
[cffLib.specializer] Added new specializer module to optimize CFF charstrings, used by the T2CharStringPen (#948).
[varLib.mutator] Sort glyphs by component depth before calculating composite glyphs' bounding boxes to ensure deltas are correctly caclulated (#945).
[_g_l_y_f] Fixed loss of precision in GlyphCoordinates by using 'd' (double) instead of 'f' (float) as array.array typecode (#963, #964).
[t2CharStringPen] Initial support for specialized Type2 path operators: vmoveto, hmoveto, vlineto, hlineto, vvcurveto, hhcurveto, vhcurveto and hvcurv
[t2CharStringPen] Initial support for specialized Type2 path operators: vmoveto, hmoveto, vlineto, hlineto, vvcurveto, hhcurveto, vhcurveto and hvcurveto. This should produce more compact charstrings (#940, #403).
[Doc] Added Sphinx sources for the documentation. Thanks @gferreira (#935).
[fvar] Expose flags in XML (#932)
[name] Add helper function for building multi-lingual names (#921)
[varLib] Fixed kern merging when a PairPosFormat2 has ClassDef1 with glyphs that are NOT present in the Coverage (1b5e1c4, #939).
[varLib] Fixed non-deterministic ClassDef order with PY3 (f056c12, #927).
[feLib] Throw an error when the same glyph is defined in multiple mark classes within the same lookup (3e3ff00, #453).
[varLib] Added support for building avar table, using the designspace elements.
[varLib] Added support for building avar table, using the designspace <map> elements.
[varLib] Removed unused build(..., axisMap) argument. Axis map should be specified in designspace file now. We do not accept nonstandard axes if <axes> element is not present.
[varLib] Removed "custom" axis from the standard_axis_map. This was added before when glyphsLib was always exporting the (unused) custom axis.
[varLib] Added partial support for building MVAR table; does not implement gasp table variations yet.
[pens] Added FilterPen base class, for pens that control another pen; factored out addComponent method from BasePen into a separate abstract DecomposingPen class; added DecomposingRecordingPen, which records components decomposed as regular contours.
[TSI1] Fixed computation of the textLength of VTT private tables (#913).
[loggingTools] Added LogMixin class providing a log property to subclasses, which returns a logging.Logger named after the latter.
[loggingTools] Added assertRegex method to CapturingLogHandler.
[py23] Added backport for python 3's types.SimpleNamespace class.
[EBLC] Fixed issue with python 3 zip iterator.
[pens] Added pen to draw glyphs using WxPython GraphicsPath class: https://wxpython.org/docs/api/wx.GraphicsPath-class.html
[pens] Added pen to draw glyphs using WxPython GraphicsPath class: https://wxpython.org/docs/api/wx.GraphicsPath-class.html
[varLib.merger] Fixed issue with recombining multiple PairPosFormat2 subtables (#888)
[varLib] Do not encode gvar deltas that are all zeroes, or if all values are smaller than tolerance.
[ttLib] _TTGlyphSet glyphs now also have height and tsb (top side bearing) attributes from the vmtx table, if present.
[glyf] In GlyphCoordintes class, added __bool__ / __nonzero__ methods, and array property to get raw array.
[ttx] Support reading TTX files with BOM (#896)
[CFF2] Fixed the reporting of the number of regions in the font.
[varLib.merger] Fixed issue while recombining multiple PairPosFormat2 subtables if they were split because of offset overflows (9798c30).
[varLib.merger] Fixed issue while recombining multiple PairPosFormat2 subtables if they were split because of offset overflows (9798c30).
[varLib.merger] Only merge multiple PairPosFormat1 subtables if there is at least one of the fonts with a non-empty Format1 subtable (0f5a46b).
[varLib.merger] Fixed IndexError with empty ClassDef1 in PairPosFormat2 (aad0d46).
[varLib.merger] Avoid reusing Class2Record (mutable) objects (e6125b3).
[varLib.merger] Calculate ClassDef1 and ClassDef2's Format when merging PairPosFormat2 (23511fd).
[macUtils] Added missing ttLib import (b05f203).
[feaLib] Added (partial) support for parsing feature file comments # ... appearing in between statements (#879).
[feaLib] Added (partial) support for parsing feature file comments # ... appearing in between statements (#879).
[feaLib] Cleaned up syntax tree for FeatureNames.
[ttLib] Added support for reading/writing CFF2 table (thanks to @readroberts at Adobe), and TTFA (ttfautohint) table.
[varLib] Fixed regression introduced with 3.8.0 in the calculation of NumShorts, i.e. the number of deltas in ItemVariationData's delta sets that use a 16-bit representation (b2825ff).
New pens: MomentsPen, StatisticsPen, RecordingPen, and TeePen.
New pens: MomentsPen, StatisticsPen, RecordingPen, and TeePen.
[misc] Added new fontTools.misc.symfont module, for symbolic font statistical analysis; requires sympy (http://www.sympy.org/en/index.html)
[varLib] Added experimental fontTools.varLib.interpolatable module for finding wrong contour order between different masters
[varLib] designspace.load() now returns a dictionary, instead of a tuple, and supports <axes> element (#864); the 'masters' item was renamed 'sources', like the <sources> element in the designspace document
[ttLib] Fixed issue with recalculating head modified timestamp when saving CFF fonts
[ttLib] In TupleVariation, round deltas before compiling (#861, fixed #592)
[feaLib] Ignore duplicate glyphs in classes used as MarkFilteringSet and MarkAttachmentType (#863)
[merge] Changed the gasp table merge logic so that only the one from the first font is retained, similar to other hinting tables (#862)
[Tests] Added tests for the varLib package, as well as test fonts from the "Annotated OpenType Specification" (AOTS) to exercise ttLib's table readers/writers (<https://github.com/adobe-type-tools/aots>)
[subset] Keep advance widths when stripping ".notdef" glyph outline in CID-keyed CFF fonts
[subset] Keep advance widths when stripping ".notdef" glyph outline in CID-keyed CFF fonts (#845)
[feaLib] Zero values now produce the same results as makeotf (#633, #848)
[feaLib] More compact encoding for “Contextual positioning with in-line single positioning rules” (#514)
[subset] Fixed issue with --no-hinting option whereby advance widths in Type 2 charstrings were also being stripped (#709, #343)
[subset] Fixed issue with --no-hinting option whereby advance widths in Type 2 charstrings were also being stripped (#709, #343)
[feaLib] include statements now resolve relative paths like makeotf (#838)
[feaLib] table name now handles Unicode codepoints beyond the Basic Multilingual Plane, also supports old-style MacOS platform encodings (#842)
[feaLib] correctly escape string literals when emitting feature syntax (#780)
[ttx, mtiLib] Preserve ordering of glyph alternates in GSUB type 3 (#833).
[ttx, mtiLib] Preserve ordering of glyph alternates in GSUB type 3 (#833).
[feaLib] Glyph names can have dashes, as per new AFDKO syntax v1.20 (#559).
[feaLib] feaLib.Parser now needs the font's glyph map for parsing.
[varLib] Fix regression where GPOS values were stored as 0.
[varLib] Allow merging of class-based kerning when ClassDefs are different
[varLib] Fix building variation of PairPosFormat2 (b5c34ce).
[varLib] Fix building variation of PairPosFormat2 (b5c34ce).
Populate defaults even for otTables that have postRead (e45297b).
Fix compiling of MultipleSubstFormat1 with zero 'out' glyphs (b887860).
[varLib.merger] Fixed "TypeError: reduce() of empty sequence with no initial value" (3717dc6).
[varLib.merger] Fixed "TypeError: reduce() of empty sequence with no initial value" (3717dc6).
[py23] Fixed unhandled exception occurring at interpreter shutdown in the "last resort" logging handler (972b3e6).
[py23] Fixed unhandled exception occurring at interpreter shutdown in the "last resort" logging handler (972b3e6).
[agl] Ensure all glyph names are of native 'str' type; avoid mixing 'str' and 'unicode' in TTFont.glyphOrder (d8c4058).
Fixed inconsistent title levels in README.rst that caused PyPI to incorrectly render the reStructuredText page.
[varLib] Refactored and improved the variation-font-building process.
[varLib] Refactored and improved the variation-font-building process.
Assembly code in the fpgm, prep, and glyf tables is now indented in XML output for improved readability. The instruction element is written as a simple tag if empty (#819).
[ttx] Fixed 'I/O operation on closed file' error when dumping multiple TTXs to standard output with the '-o -' option.
The unit test modules (*_test.py) have been moved outside of the fontTools package to the Tests folder, thus they are no longer installed (#811).
Font tables read from XML can now be written back to XML with no loss.
Font tables read from XML can now be written back to XML with no loss.
GSUB/GPOS LookupType is written out in XML as an element, not comment. (#792)
When parsing cmap table, do not store items mapped to glyph id 0. (#790)
[otlLib] Make ClassDef sorting deterministic. Fixes #766 (7d1ddb2)
[mtiLib] Added unit tests (#787)
[cvar] Implemented cvar table
[gvar] Renamed GlyphVariation to TupleVariation to match OpenType terminology.
[otTables] Handle gracefully empty VarData.Item array when compiling XML. (#797)
[varLib] Re-enabled generation of HVAR table for fonts with TrueType outlines; removed --build-HVAR command-line option.
[feaLib] The parser can now be extended to support non-standard statements in FEA code by using a customized Abstract Syntax Tree. See, for example, feaLib.builder_test.test_extensions and baseClass.feax (#794, fixes #773).
[feaLib] Added feaLib command to the 'fonttools' command-line tool; applies a feature file to a font. fonttools feaLib -h for help.
[pens] The T2CharStringPen now takes an optional roundTolerance argument to control the rounding of coordinates (#804, fixes #769).
[ci] Measure test coverage on all supported python versions and OSes, combine coverage data and upload to https://codecov.io/gh/fonttools/fonttools (#786)
[ci] Configured Travis and Appveyor for running tests on Python 3.6 (#785, 55c03bc)
The manual pages installation directory can be customized through FONTTOOLS_MANPATH environment variable (#799, fixes #84).
[Snippets] Added otf2ttf.py, for converting fonts from CFF to TrueType using the googlei18n/cu2qu module (#802)
[feaLib] Added support for generating FEA text from abstract syntax tree (AST) objects (#776). Thanks @mhosken
[feaLib] Added support for generating FEA text from abstract syntax tree (AST) objects (#776). Thanks @mhosken
Added agl.toUnicode function to convert AGL-compliant glyph names to Unicode strings (#774)
Implemented MVAR table (b4d5381)
[setup] We no longer use versioneer.py to compute fonttools version from git metadata, as this has caused issues for some users (#767). Now we bump th
[setup] We no longer use versioneer.py to compute fonttools version from git metadata, as this has caused issues for some users (#767). Now we bump the version strings manually with a custom release command of setup.py script.
The standalone sstruct and xmlWriter modules, deprecated since vesion 3.2.0, have been removed. They can be imported from the fontTools.misc package.
round3 function, allow the second argument to be None (#757)sstruct and xmlWriter modules, deprecated since vesion 3.2.0, have been removed. They can be imported from the fontTools.misc package.[py23] optimized performance of round3 function; added backport for py35 math.isclose()
[varLib] Do not emit null axes in fvar (1bebcec). Thanks @robmck-ms
[OS/2] fix checking fsSelection bits matching head.macStyle bits
[OS/2] fix checking fsSelection bits matching head.macStyle bits
[varLib] added --build-HVAR option to generate HVAR table for fonts with TrueType outlines. For CFF2, it is enabled by default.
[setup.py] remove undocumented/deprecated 'extra_path' Distutils argument. This means that we no longer create a "FontTools" subfolder in site-package…
fonttools ttx, fonttools subset, etc.TTFont.saveXML for overriding os-specific line endings (passed on to XMLWriter instances).restore Makefile as an alternative way to build/check/install
Fix 'ttLibVersion' attribute in TTX files still showing '3.0' instead of '3.1'. Use setuptools_scm to manage package versions.
Fix 'ttLibVersion' attribute in TTX files still showing '3.0' instead of '3.1'. Use setuptools_scm to manage package versions.
[feaLib] New library to parse and compile Adobe FDK OpenType Feature files. [mtiLib] New library to parse and compile Monotype 'FontDame' OpenType Lay
[feaLib] New library to parse and compile Adobe FDK OpenType Feature files. [mtiLib] New library to parse and compile Monotype 'FontDame' OpenType Layout Tables files. [voltLib] New library to parse Microsoft VOLT project files. [otlLib] New library to work with OpenType Layout tables. [varLib] New library to work with OpenType Font Variations. [pens] Add ttGlyphPen to draw to TrueType glyphs, and t2CharStringPen to draw to Type 2 Charstrings (CFF); add areaPen and perimeterPen. [ttLib.tables] Implement 'meta' and 'trak' tables. [ttx] Add --flavor option for compiling to 'woff' or 'woff2'; add --with-zopfli option to use Zopfli to compress WOFF 1.0 fonts. [subset] Support subsetting 'COLR'/'CPAL' and 'CBDT'/'CBLC' color fonts tables, and 'gvar' table for variation fonts. [Snippets] Add symfont.py, for symbolic font statistics analysis; interpolatable.py, a preliminary script for detecting interpolation errors; {merge,dump}_woff_metadata.py. [classifyTools] Helpers to classify things into classes. [CI] Run tests on Windows, Linux and macOS using Appveyor and Travis CI; check unit test coverage with Coverage.py/Coveralls; automatic deployment to PyPI on tags. [loggingTools] Use Python built-in logging module to print messages. [py23] Make round() behave like Python 3 built-in round(); define round2() and round3().
Add Snippet scripts for cmap subtable format conversion, printing GSUB/GPOS features, building a GX font from two masters
Add Snippet scripts for cmap subtable format conversion, printing GSUB/GPOS features, building a GX font from two masters
TTX WOFF2 support and a -f option to overwrite output file(s)
Support GX tables: avar, gvar, fvar, meta
Support feat and gzip-compressed SVG tables
Upgrade Mac East Asian encodings to native implementation if available
Add Roman Croatian and Romanian encodings, codecs for mac-extended East Asian encodings
Implement optimal GLYF glyph outline packing; disabled by default
Load all OpenType sub-structures lazily
Add a Qt pen
Add VDMX table converter
Load all OpenType sub-structures lazily
Add support for cmap format 13.
Add pyftmerge tool
Update to Unicode 6.3.0d3
Add pyftinspect tool
Add support for Google CBLC/CBDT color bitmaps, standard EBLC/EBDT embedded bitmaps, and SVG table (thanks to Read Roberts at Adobe)
Add support for loading, saving and ttx'ing WOFF file format
Add support for Microsoft COLR/CPAL layered color glyphs
Support PyPy
Support Jython, by replacing numpy with array/lists modules and removed it, pure-Python StringIO, not cStringIO
Add pyftsubset and Subsetter object, supporting CFF and TTF
Add to ttx args for -q for quiet mode, -z to choose a bitmap dump format
Option to write to arbitrary files
Option to write to arbitrary files
Better dump format for DSIG
Better detection of OTF XML
Fix issue with Apple's kern table format
Fix mangling of TT glyph programs
Fix issues related to mona.ttf
Fix Windows Installer instructions
Fix some modern MacOS issues
Fix minor issues and typos
TrueType Collection (TTC) support
TrueType Collection (TTC) support
Python 2.6 support
Update Unicode data to 5.2.0
Couple of bug fixes
Fixed embarrassing bug: the master checksum in the head table is now calculated correctly even on little-endian platforms (such as Intel).
Fixed embarrassing bug: the master checksum in the head table is now calculated correctly even on little-endian platforms (such as Intel).
Made the cmap format 4 compiler smarter: the binary data it creates is now more or less as compact as possible. TTX now makes more compact data than in any shipping font I've tested it with.
Dump glyph names as a separate "GlyphOrder" pseudo table as opposed to as part of the glyf table (obviously needed for CFF-OTF's).
Added proper support for the CFF table.
Don't barf on empty tables (questionable, but "there are font out there...")
When writing TT glyf data, align glyphs on 4-byte boundaries. This seems to be the current recommendation by MS. Also: don't barf on fonts which are already 4-byte aligned.
Windows installer contributed bu Adam Twardoch! Yay!
Changed the command line interface again, now by creating one new tool replacing the old ones: ttx It dumps and compiles, depending on input file types. The options have changed somewhat.
The -d option is back (output dir)
ttcompile's -i options is now called -m (as in "merge"), to avoid clash with dump's -i.
The -s option ("split tables") no longer creates a directory, but instead outputs a small .ttx file containing references to the individual table files. This is not a true link, it's a simple file name, and the referenced file should be in the same directory so ttcompile can find them.
compile no longer accepts a directory as input argument. Instead it can parse the new "mini-ttx" format as output by "ttx -s".
all arguments are input files
Renamed the command line programs and moved them to the Tools subdirectory. They are now installed by the setup.py install script.
Added OpenType support. BASE, GDEF, GPOS, GSUB and JSTF are (almost) fully supported. The XML output is not yet final, as I'm still considering to output certain subtables in a more human-friendly manner.
Fixed 'kern' table to correctly accept subtables it doesn't know about, as well as interpreting Apple's definition of the 'kern' table headers correctly.
Fixed bug where glyphnames were not calculated from 'cmap' if it was (one of the) first tables to be decompiled. More specifically: it cmap was the first to ask for a glyphID -> glyphName mapping.
Switched XML parsers: use expat instead of xmlproc. Should be faster.
Removed my UnicodeString object: I now require Python 2.0 or up, which has unicode support built in.
Removed assert in glyf table: redundant data at the end of the table is now ignored instead of raising an error. Should become a warning.
Fixed bug in hmtx/vmtx code that only occured if all advances were equal.
Fixed subtle bug in TT instruction disassembler.
Couple of fixes to the 'post' table.
Updated OS/2 table to latest spec.
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →