4.29.1 (released 2022-02-01)
----------------------------
- [colorLib] Fixed rounding issue with radial gradient's start/end circles inside
one another
- [freetypePen] Handle rotate/skew transform when auto-computing width/height of the
buffer; raise PenError wen missing moveTo
4.29.0 (released 2022-01-24)
----------------------------
- [ufoLib] Fixed illegal characters and expanded reserved filenames
- [COLRv1] Don't emit useless PaintColrLayers of lenght=1 in LayerListBuilder
- [ttx] Removed legacy ``waitForKeyPress`` method on Windows
- [pens] Added FreeTypePen that uses ``freetype-py`` and the pen protocol for
rasterizating outline paths
- [unicodedata] Updated the script direction list to Unicode 14.0
Bumped unicodedata2 dependency to 14.0
- [psLib] Fixed type of ``fontName`` in ``suckfont``
This flag should be set for packages that import pkg_resources
and thus need setuptools after the build step.
Set this flag for packages that need it and bump PKGREVISION.
4.28.5 (released 2021-12-19)
----------------------------
- [svgPathPen] Continuation of 2471: make sure all occurrences of ``str()`` are now
replaced with user-defined ``ntos`` callable.
- [merge] Refactored code into submodules, plus several bugfixes and improvements:
fixed duplicate-glyph-resolution GSUB-lookup generation code; use tolerance in glyph
comparison for empty glyph's width; ignore space of default ignorable glyphs;
downgrade duplicates-resolution missing-GSUB from assert to warn; added --drop-tables
option.
4.28.4 (released 2021-12-15)
----------------------------
- [merge] Merge GDEF marksets in Lookups properly
- [feaLib] Have ``fontTools feaLib`` script exit with error code when build fails
- [svgPathPen] Added ``ntos`` option to customize number formatting (e.g. rounding)
- [subset] Speed up subsetting of large CFF fonts
- [otTables] Speculatively promote lookups to extension to speed up compilation. If the
offset to lookup N is too big to fit in a ushort, the offset to lookup N+1 is going to
be too big as well, so we promote to extension all lookups from lookup N onwards
4.28.3 (released 2021-12-03)
----------------------------
- [subset] Fixed bug while subsetting ``COLR`` table, whereby incomplete layer records
pointing to missing glyphs were being retained leading to ``struct.error`` upon
compiling. Make it so that ``glyf`` glyph closure, which follows the ``COLR`` glyph
closure, does not influence the ``COLR`` table subsetting
- [docs] Fully document the ``cmap`` and ``glyf`` tables
- [colorLib.unbuilder] Fixed CLI by deleting no longer existing parameter (180bb1867).
4.28.2 (released 2021-11-22)
----------------------------
- [otlLib] Remove duplicates when building coverage
- [docs] Add interrogate configuration
- [docs] Remove comment about missing “start” optional argument to ``calcChecksum``
- [cu2qu/cli] Adapt to the latest ufoLib2.
- [subset] Support subsetting SVG table and remove it from the list of drop by default tables
- [subset] add ``--pretty-svg`` option to pretty print SVG table contents
- [merge] Support merging ``CFF`` tables (CID-keyed ``CFF`` is still not supported)
- [merge] Support ``--output-file``
- [docs] Split table docs into individual pages
- [feaLib] Forbid empty classes
- [docs] Improve documentation for ``fontTools.ttLib.ttFont``
4.28.1 (released 2021-11-08)
----------------------------
- [subset] Fixed AttributeError while traversing a color glyph's Paint graph when there is no
LayerList, which is optional
4.28.0 (released 2021-11-05)
----------------------------
- Dropped support for EOL Python 3.6, require Python 3.7
- [ufoLib/glifLib] Make filename-clash checks faster by using a set instead of a list
- [subset] Don't crash if optional ClipList and LayerList are ``None`` (empty)
- [OT-SVG] Removed support for old deprecated version 1 and embedded color palettes,
which were never officially part of the OpenType SVG spec. Upon compile, reuse offsets
to SVG documents that are identical
- [feaLib] Added support for Variable Feature File syntax. This is experimental and subject
to change until it is finalized in the Adobe FEA spec
- [unicodedata] Update Scripts/ScriptExtensions/Blocks to UnicodeData 14.0
4.27.1 (released 2021-09-23)
----------------------------
- [otlLib] Fixed error when chained contextual lookup builder overflows
- [bezierTools] Fixed two floating-point bugs: one when computing `t` for a point
lying on an almost horizontal/vertical line; another when computing the intersection
point between a curve and a line
4.27.0 (released 2021-09-14)
----------------------------
- [ttLib/otTables] Cleaned up virtual GID handling: allow virtual GIDs in ``Coverage``
and ``ClassDef`` readers; removed unused ``allowVID`` argument from ``TTFont``
constructor, and ``requireReal`` argument in ``TTFont.getGlyphID`` method.
Make ``TTFont.setGlyphOrder`` clear reverse glyphOrder map, and assume ``glyphOrder``
internal attribute is never modified outside setGlyphOrder; added ``TTFont.getGlyphNameMany``
and ``getGlyphIDMany``
- [py23] Dropped internal use of ``fontTools.py23`` module to fix deprecation warnings
in client code that imports from fontTools
- [subset] Fix subsetting COLRv1 clip boxes when font is loaded lazily
4.26.2 (released 2021-08-09)
----------------------------
- [otTables] Added missing ``CompositeMode.PLUS`` operator
4.26.1 (released 2021-08-03)
----------------------------
- [transform] Added ``transformVector`` and ``transformVectors`` methods to the
``Transform`` class. Similar to ``transformPoint`` but ignore the translation
part
4.26.0 (released 2021-08-03)
----------------------------
- [xmlWriter] Default to ``"\n"`` for ``newlinestr`` instead of platform-specific
``os.linesep``
- [otData] Define COLRv1 ClipList and ClipBox
- [removeOverlaps/instancer] Added --ignore-overlap-errors option to work around
Skia PathOps.Simplify bug
- NOTE: This will be the last version to support Python 3.6. FontTools will require
Python 3.7 or above from the next release
4.25.2 (released 2021-07-26)
----------------------------
- [COLRv1] Various changes to sync with the latest CORLv1 draft spec. In particular:
define COLR.VarIndexMap, remove/inline ColorIndex struct, add VarIndexBase to ``PaintVar*`` tables
add reduced-precicion specialized transform Paints;
define Angle as fraction of half circle encoded as F2Dot14;
use FWORD (int16) for all Paint center coordinates;
change PaintTransform to have an offset to Affine2x3;
- [ttLib] when importing XML, only set sfntVersion if the font has no reader and is empty
4.25.1 (released 2021-07-16)
----------------------------
- [ttGlyphPen] Fixed bug in ``TTGlyphPointPen``, whereby open contours (i.e. starting
with segmentType "move") would throw ``NotImplementedError``. They are now treated
as if they are closed, like with the ``TTGlyphPen``
4.25.0 (released 2021-07-05)
----------------------------
- [tfmLib] Added new library for parsing TeX Font Metric (TFM) files
- [TupleVariation] Make shared tuples order deterministic on python < 3.7 where
Counter (subclass of dict) doesn't remember insertion order
- [otData] Renamed COLRv1 structs to remove 'v1' suffix and match the updated draft
spec: 'LayerV1List' -> 'LayerList', 'BaseGlyphV1List' -> 'BaseGlyphList',
'BaseGlyphV1Record' -> 'BaseGlyphPaintRecord'
Added 8 new ``PaintScale*`` tables: with/without centers, uniform vs non-uniform.
Added ``*AroundCenter`` variants to ``PaintRotate`` and ``PaintSkew``: the default
versions no longer have centerX/Y, but default to origin.
``PaintRotate``, ``PaintSkew`` and ``PaintComposite`` formats were re-numbered.
NOTE: these are breaking changes; clients using the experimental COLRv1 API will
have to be updated
- [pointPens] Allow ``GuessSmoothPointPen`` to accept a tolerance. Fixed call to
``math.atan2`` with x/y parameters inverted. Sync the code with fontPens
- [post] Fixed parsing ``post`` table format 2.0 when it contains extra garbage
at the end of the stringData array
- [subset] drop empty features unless 'size' with FeatureParams table
- [otlLib] Added ``otlLib.optimize`` module; added GPOS compaction algorithm.
The compaction can be run on existing fonts with ``fonttools otlLib.optimize``
or using the snippet ``compact_gpos.py``. There's experimental support for
compacting fonts at compilation time using an environment variable, but that
might be removed later
4.24.4 (released 2021-05-25)
----------------------------
- [subset/instancer] Fixed ``AttributeError`` when instantiating a VF that
contains GPOS ValueRecords with ``Device`` tables but without the respective
non-Device values (e.g. ``XAdvDevice`` without ``XAdvance``). When not
explicitly set, the latter are assumed to be 0.
4.24.3 (released 2021-05-20)
----------------------------
- [otTables] Fixed ``AttributeError`` in methods that split LigatureSubst,
MultipleSubst and AlternateSubst subtables when an offset overflow occurs.
The ``Format`` attribute was removed in v4.22.0.
4.24.2 (released 2021-05-20)
----------------------------
- [ttGlyphPen] Fixed typing annotation of TTGlyphPen glyphSet parameter.
- Fixed two instances of DeprecationWarning: invalid escape sequence.
4.24.1 (released 2021-05-20)
----------------------------
- [subset] Fixed AttributeError when SinglePos subtable has None Value (ValueFormat 0)
4.24.0 (released 2021-05-17)
----------------------------
- [pens] Add ``ttGlyphPen.TTGlyphPointPen`` similar to ``TTGlyphPen``.
4.23.1 (released 2021-05-14)
----------------------------
- [subset] Fix ``KeyError`` after subsetting ``COLR`` table that initially contains
both v0 and v1 color glyphs when the subset only requested v1 glyphs; we were
not pruning the v0 portion of the table.
- [colorLib] Set ``LayerV1List`` attribute to ``None`` when empty, it's optional
in CORLv1.
4.23.0 (released 2021-05-13)
----------------------------
- [designspaceLib] Allow to use ``\\UNC`` absolute paths on Windows.
- [varLib.merger] Fixed bug where ``VarLibMergeError`` was raised with incorrect
parameters.
- [feaLib] Allow substituting a glyph class with ``NULL`` to delete multiple glyphs
.
- [glyf] Fixed ``NameError`` exception in ``getPhantomPoints``.
- [removeOverlaps] Retry pathops.simplify after rounding path coordinates to integers
if it fails the first time using floats, to work around a rare and hard to debug
Skia bug.
- [varLib] Added support for building, reading, writing and optimizing 32-bit
``ItemVariationStore`` as used in COLRv1 table.
- [otBase/otConverters] Add array readers/writers for int types.
- [feaLib] Allow more than one lookahead glyph/class in contextual positioning with
"value at end".
- [COLRv1] Default varIdx should be 0xFFFFFFFF.
- [pens] Make RecordingPointPen actually pass on identifiers; replace asserts with
explicit ``PenError`` exception.
- [mutator] Round lsb for CF2 fonts as well.
4.22.1 (released 2021-04-26)
----------------------------
- [feaLib] Skip references to named lookups if the lookup block definition
is empty, similarly to makeotf. This also fixes an ``AttributeError`` while
generating ``aalt`` feature.
- [subset] Fixed bug with ``--no-hinting`` implementation for Device tables.
The previous code was alwyas dropping Device tables if no-hinting was
requested, but some Device tables (DeltaFormat=0x8000) are also used to encode
variation indices and need to be retained.
- [otBase] Fixed bug in getting the ValueRecordSize when decompiling ``MVAR``
table with ``lazy=True``.
- [varLib/glyf/gvar] Optimized and simplified ``GlyphCoordinates`` and
``TupleVariation`` classes, use ``bytearray`` where possible, refactored
phantom-points calculations. We measured about 30% speedup in total time
of loading master ttfs, building gvar, and saving.
- [subset] Fixed ``AssertionError`` while pruning unused CPAL palettes when
``0xFFFF`` is present.
4.22.0 (released 2021-04-01)
----------------------------
- [ttLib] Remove .Format from Coverage, ClassDef, SingleSubst, LigatureSubst,
AlternateSubst, MultipleSubst.
ATTENTION: This will change your TTX dumps!
- [misc.arrayTools] move Vector to its own submodule, and rewrite as a tuple
subclass.
- [docs] Added a terminology section for varLib.
- [varLib] Move rounding to VariationModel, to avoid error accumulation from
multiple deltas
- [varLib] Explain merge errors in more human-friendly terms
- [otlLib] Correct some documentation
- [varLib/otlLib] Allow merging into VariationFont without first saving GPOS
PairPos2
- [subset] Improve PairPosFormat2 subsetting
- [ttLib] TTFont.save: create file on disk as late as possible
- [cffLib] Add missing CFF2 dict operators LanguageGroup and ExpansionFactor
ATTENTION: This will change your TTX dumps!
4.21.1 (released 2021-02-26)
[pens] Reverted breaking change that turned AbstractPen and AbstractPointPen into abstract base classes.
4.21.0 (released 2021-02-26)
[feaLib] Indent anchor statements in asFea() to make them more legible and diff-able.
[pens] Turn AbstractPen and AbstractPointPen into abstract base classes.
[feaLib] Added support for parsing and building STAT table from AFDKO feature files.
[instancer] Added option to update name table of generated instance using STAT table's axis values.
[bezierTools] Added functions to compute bezier point-at-time, as well as line-line, curve-line and curve-curve intersections.
4.20.0 (released 2021-02-15)
[COLRv1] Added unbuildColrV1 to deconstruct COLRv1 otTables to raw json-able data structure; it does the reverse of buildColrV1.
[feaLib] Allow sub X by NULL sequence to delete a glyph.
[arrayTools] Fixed Vector division.
[COLRv1] Define new PaintSweepGradient.
[otTables] Moved Paint.Format enum class outside of Paint class definition, now named PaintFormat. It was clashing with paint instance Format attribute and thus was breaking lazy load of COLR table which relies on magic __getattr__.
[COLRv1] Replace hand-coded builder functions with otData-driven dynamic implementation.
[COLRv1] Define additional static (non-variable) Paint formats.
[subset] Added support for subsetting COLR v1 and CPAL tables.
[fontBuilder] Allow setupFvar to optionally take designspaceLib.AxisDescriptor objects. Added new setupAvar method. Support localised names for axes and named instances.
4.19.1 (released 2021-01-28)
[woff2] An initial off-curve point with an overlap flag now stays an off-curve point after compression.
4.19.0 (released 2021-01-25)
[codecs] Handle errors parameter different from 'strict' for the custom extended mac encodings.
[featureVars] Raise better error message when a script is missing the required default language system.
[COLRv1] Avoid abrupt change caused by rounding PaintRadialGradient.c0 when the start circle almost touches the end circle's perimeter.
[COLRv1] Support building unlimited lists of paints as 255-ary trees of PaintColrLayers tables.
[subset] Prune redundant format-12 cmap subtables when all non-BMP characters are dropped.
[basePen] Raise MissingComponentError instead of bare KeyError when a referenced component is missing
4.18.2 (released 2020-12-16)
----------------------------
- [COLRv1] Implemented ``PaintTranslate`` paint format.
- [varLib.cff] Fixed unbound local variable error.
- [otlLib] Don't crash when creating OpenType class definitions if some glyphs
occur more than once.
4.18.1 (released 2020-12-09)
----------------------------
- [colorLib] Speed optimization for ``LayerV1ListBuilder``.
- [mutator] Fixed missing tab in ``interpolate_cff2_metrics`` (0957dc7a).
4.18.0 (released 2020-12-04)
----------------------------
- [COLRv1] Update to latest draft: added ``PaintRotate`` and ``PaintSkew``.
- [woff2] Support new ``brotlicffi`` bindings for PyPy.
- [glifLib] Added ``expectContentsFile`` parameter to ``GlyphSet``, for use when
reading existing UFOs, to comply with the specification stating that a
``contents.plist`` file must exist in a glyph set.
- [subset] Allow ``LangSys`` tags in ``--layout-scripts`` option. For example:
``--layout-scripts=arab.dflt,arab.URD,latn``; this will keep ``DefaultLangSys``
and ``URD`` language for ``arab`` script, and all languages for ``latn`` script.
- [varLib.interpolatable] Allow UFOs to be checked; report open paths, non existant
glyphs; add a ``--json`` option to produce a machine-readable list of
incompatibilities
- [pens] Added ``QuartzPen`` to create ``CGPath`` from glyph outlines on macOS.
Requires pyobjc.
- [feaLib] You can export ``FONTTOOLS_LOOKUP_DEBUGGING=1`` to enable feature file
debugging info stored in ``Debg`` table.
- [otlLib] Build more efficient format 1 and format 2 contextual lookups whenever
possible
4.17.1 (released 2020-11-16)
----------------------------
- [colorLib] Fixed regression in 4.17.0 when building COLR v0 table; when color
layers are stored in UFO lib plist, we can't distinguish tuples from lists so
we need to accept either types (e5439eb9, googlefonts/ufo2ft/issues#426).
4.17.0 (released 2020-11-12)
----------------------------
- [colorLib/otData] Updated to latest draft ``COLR`` v1 spec (#2092).
- [svgLib] Fixed parsing error when arc commands' boolean flags are not separated
by space or comma (#2094).
- [varLib] Interpret empty non-default glyphs as 'missing', if the default glyph is
not empty (#2082).
- [feaLib.builder] Only stash lookup location for ``Debg`` if ``Builder.buildLookups_``
has cooperated (#2065, #2067).
- [varLib] Fixed bug in VarStore optimizer (#2073, #2083).
- [varLib] Add designspace lib key for custom feavar feature tag (#2080).
- Add HashPointPen adapted from psautohint. With this pen, a hash value of a glyph
can be computed, which can later be used to detect glyph changes (#2005).
4.16.1 (released 2020-10-05)
----------------------------
- [varLib.instancer] Fixed ``TypeError`` exception when instantiating a VF with
a GSUB table 1.1 in which ``FeatureVariations`` attribute is present but set to
``None`` -- indicating that optional ``FeatureVariations`` is missing (#2077).
- [glifLib] Make ``x`` and ``y`` attributes of the ``point`` element required
even when validation is turned off, and raise a meaningful ``GlifLibError``
message when that happens (#2075).
4.16.0 (released 2020-09-30)
----------------------------
- [removeOverlaps] Added new module and ``removeOverlaps`` function that merges
overlapping contours and components in TrueType glyphs. It requires the
`skia-pathops <https://github.com/fonttools/skia-pathops>`__ module.
Note that removing overlaps invalidates the TrueType hinting (#2068).
- [varLib.instancer] Added ``--remove-overlaps`` command-line option.
The ``overlap`` option in ``instantiateVariableFont`` now takes an ``OverlapMode``
enum: 0: KEEP_AND_DONT_SET_FLAGS, 1: KEEP_AND_SET_FLAGS (default), and 2: REMOVE.
The latter is equivalent to calling ``removeOverlaps`` on the generated static
instance. The option continues to accept ``bool`` value for backward compatibility.
4.15.0 (released 2020-09-21)
----------------------------
- [plistlib] Added typing annotations to plistlib module. Set up mypy static
typechecker to run automatically on CI (#2061).
- [ttLib] Implement private ``Debg`` table, a reverse-DNS namespaced JSON dict.
- [feaLib] Optionally add an entry into the ``Debg`` table with the original
lookup name (if any), feature name / script / language combination (if any),
and original source filename and line location. Annotate the ttx output for
a lookup with the information from the Debg table (#2052).
- [sfnt] Disabled checksum checking by default in ``SFNTReader`` (#2058).
- [Docs] Document ``mtiLib`` module (#2027).
- [varLib.interpolatable] Added checks for contour node count and operation type
of each node (#2054).
- [ttLib] Added API to register custom table packer/unpacker classes (#2055).
4.14.0
- [feaLib] Allow anonymous classes in LookupFlags definitions.
- [Docs] Better document DesignSpace rules processing order.
- [ttLib] Fixed 21-year old bug in ``maxp.maxComponentDepth`` calculation.
- [varLib.models] Fixed misspelled argument name in CLI entry point (81d0042a).
- [subset] When subsetting GSUB v1.1, fixed TypeError by checking whether the
optional FeatureVariations table is present (e63ecc5b).
- [Snippets] Added snippet to show how to decompose glyphs in a TTF.
- [otlLib] Generate GSUB type 5 and GPOS type 7 contextual lookups where appropriate.
4.13.0
- [feaLib/otlLib] Moved lookup subtable builders from feaLib to otlLib; refactored
some common code
- [docs] Document otlLib module
- [glifLib] Fixed bug with some UFO .glif filenames clashing on case-insensitive
filesystems
- [colorLib] Updated COLRv1 implementation following changes in the draft spec
4.12.1:
- [_n_a_m_e] Fixed error in ``addMultilingualName`` with one-character names.
Only attempt to recovered malformed UTF-16 data from a ``bytes`` string,
not from unicode ``str``.
4.12.0:
- [otlLib/varLib] Ensure that the ``AxisNameID`` in the ``STAT`` and ``fvar``
tables is grater than 255 as per OpenType spec.
- [docs] Document more modules in ``fontTools.misc`` package: ``filenames``,
``fixedTools``, ``intTools``, ``loggingTools``, ``macCreatorType``, ``macRes``,
``plistlib``.
- [OS/2] Don't calculate whole sets of unicode codepoints, use faster and more memory
efficient ranges and bisect lookups.
- [voltLib] Support writing back abstract syntax tree as VOLT data.
- [voltLib] Accept DO_NOT_TOUCH_CMAP keyword.
- [subset/merge] Fixed a namespace clash involving a private helper class.
4.11.0:
- [feaLib] Introduced ``includeDir`` parameter on Parser and IncludingLexer to
explicitly specify the directory to search when ``include()`` statements are
encountered.
- [ufoLib] Silently delete duplicate glyphs within the same kerning group when reading
groups.
- [ttLib] Set version of COLR table when decompiling COLRv1 (commit 9d8a7e2).
4.10.2:
- [sfnt] Fixed ``NameError: SimpleNamespace`` while reading TTC header. The regression
was introduced with 4.10.1 after removing ``py23`` star import.
4.10.1:
- [sfnt] Make ``SFNTReader`` pickleable even when TTFont is loaded with lazy=True
option and thus keeps a reference to an external file.
- [feaLib.ast] Restore backward compatibility (broken in 4.10 for
``ChainContextPosStatement`` and ``ChainContextSubstStatement`` classes.
Make them accept either list of lookups or list of lists of lookups.
- [docs] Document some modules in ``fontTools.misc`` package: ``arrayTools``,
``bezierTools`` ``cliTools`` and ``eexec``.
- [ttLib._n_a_m_e] Fixed ``findMultilingualName()`` when name record's ``string`` is
encoded as bytes sequence.
4.10.0:
- [varLib] Allow feature variations to be active across the entire space.
- [ufoLib] Added support for ``formatVersionMinor`` in UFO's ``fontinfo.plist`` and for
``formatMinor`` attribute in GLIF file as discussed in unified-font-object/ufo-spec#78.
No changes in reading or writing UFOs until an upcoming (non-0) minor update of the
UFO specification is published.
- [merge] Fixed merging fonts with different versions of ``OS/2`` table.
- [subset] Fixed ``AttributeError`` while subsetting ``ContextSubst`` and ``ContextPos``
Format 3 subtable.
- [ttLib.table._m_e_t_a] if data happens to be ascii, emit comment in TTX.
- [feaLib] Support multiple lookups per glyph position.
- [psCharStrings] Use inheritance to avoid repeated code in initializer.
- [Doc] Improved documentation for the following modules: ``afmLib``, ``agl``
, ``cffLib``, ``cu2qu``, ``encodings``, ``feaLib``, ``merge``.
- [Doc] Split off developer-centric info to new page, making front page of docs more
user-focused. List all utilities and sub-modules with brief descriptions.
Make README more concise and focused.
- [otlLib] Add function to build STAT table from high-level description.
- [ttLib._n_a_m_e] Add ``findMultilingualName()`` method.
- [unicodedata] Update ``RTL_SCRIPTS`` for Unicode 13.0.
- [gvar] Sort ``gvar`` XML output by glyph name, not glyph order.
- [Doc] Added help options to ``fonttools`` command line tool.
Ensure all fonttools CLI tools have help documentation.
- [ufoLib] Only write fontinfo.plist when there actually is content.
4.9.0:
- [subset] Fixed subsetting of FeatureVariations table. The subsetter no longer drops
FeatureVariationRecords that have empty substitutions as that will keep the search
going and thus change the logic. It will only drop empty records that occur at the
end of the FeatureVariationRecords array.
- [subset] Remove FeatureVariations table and downgrade GSUB/GPOS to version 0x10000
when FeatureVariations contain no FeatureVariationRecords after subsetting.
- [agl] Add support for legacy Adobe Glyph List of glyph names in ``fontTools.agl``
.
- [feaLib] Ignore superfluous script statements.
- [feaLib] Hide traceback by default on ``fonttools feaLib`` command line.
Use ``--traceback`` option to show.
- [feaLib] Check lookup index in chaining sub/pos lookups and print better error
message.
- [feaLib] Fix building chained alt substitutions.
- [Doc] Included all fontTools modules in the sphinx-generated documentation, and
published it to ReadTheDocs for continuous documentation of the fontTools project
. Check it out at https://fonttools.readthedocs.io/. Thanks to Chris Simpkins!
- [transform] The ``Transform`` class is now subclass of ``typing.NamedTuple``. No
change in functionality.
Thes are not supported by pkg_alternatives, and lead to breakage as found
in <http://mail-index.netbsd.org/tech-pkg/2020/05/06/msg023089.html>.
In many cases these were unnecessary anyway, as they match the corresponding
command that pkg_alternatives will have automatically detected manual page
entries for, plus many of them did not support PKGMANDIR.
In the one case (databases/py-peewee) where the manual page does not match
the command name, pkg_alternatives will need to be enhanced to support this
before it can be re-enabled.
4.8.1 (released 2020-04-17)
---------------------------
- [feaLib] Fixed ``AttributeError: 'NoneType' has no attribute 'getAlternateGlyphs'``
when ``aalt`` feature references a chain contextual substitution lookup
4.8.0 (released 2020-04-16)
---------------------------
- [feaLib] If Parser is initialized without a ``glyphNames`` parameter, it cannot
distinguish between a glyph name containing an hyphen, or a range of glyph names;
instead of raising an error, it now interprets them as literal glyph names, while
also outputting a logging warning to alert user about the ambiguity
- [feaLib] When serializing AST to string, emit spaces around hyphens that denote
ranges. Also, fixed an issue with CID ranges when round-tripping AST->string->AST
- [Snippets/otf2ttf] In otf2ttf.py script update LSB in hmtx to match xMin
- [colorLib] Added experimental support for building ``COLR`` v1 tables as per
the `colr-gradients-spec <https://github.com/googlefonts/colr-gradients-spec/blob/master/colr-gradients-spec.md>`__
draft proposal. **NOTE**: both the API and the XML dump of ``COLR`` v1 are
susceptible to change while the proposal is being discussed and formalized
4.7.0:
- [cu2qu] Added ``fontTools.cu2qu`` package, imported from the original
`cu2qu <https://github.com/googlefonts/cu2qu>`__ project. The ``cu2qu.pens`` module
was moved to ``fontTools.pens.cu2quPen``. The optional cu2qu extension module
can be compiled by installing `Cython <https://cython.org/>` before installing
fonttools from source (i.e. git repo or sdist tarball). The wheel package that
is published on PyPI (i.e. the one ``pip`` downloads, unless ``--no-binary``
option is used), will continue to be pure-Python for now
4.6.0:
- [varLib] Added support for building variable ``BASE`` table version 1.1
- [CPAL] Added ``fromRGBA`` method to ``Color`` class
4.5.0:
- [designspaceLib] Added ``add{Axis,Source,Instance,Rule}Descriptor`` methods to
``DesignSpaceDocument`` class, to initialize new descriptor objects using keyword
arguments, and at the same time append them to the current document
- [unicodedata] Update to Unicode 13.0
4.4.3:
- [varLib] Always build ``gvar`` table for TrueType-flavored Variable Fonts,
even if it contains no variation data. The table is required according to
the OpenType spec
4.4.2:
- [ttx] Annotate ``LookupFlag`` in XML dump with comment explaining what bits
are set and what they mean
- [feaLib] Added more descriptive message to ``IncludedFeaNotFound`` error
4.4.1:
- [woff2] Skip normalizing ``glyf`` and ``loca`` tables if these are missing from
a font (e.g. in NotoColorEmoji using ``CBDT/CBLC`` tables).
- [timeTools] Use non-localized date parsing in ``timestampFromString``, to fix
error when non-English ``LC_TIME`` locale is set
- [fontBuilder] Make sure the CFF table generated by fontBuilder can be used by varLib
without having to compile and decompile the table first. This was breaking in
converting the CFF table to CFF2 due to some unset attributes
4.4.0:
- [colorLib] Added ``fontTools.colorLib.builder`` module, initially with ``buildCOLR``
and ``buildCPAL`` public functions. More color font formats will follow
- [fontBuilder] Added ``setupCOLR`` and ``setupCPAL`` methods
- [ttGlyphPen] Quantize ``GlyphComponent.transform`` floats to ``F2Dot14`` to fix
round-trip issue when computing bounding boxes of transformed components
- [glyf] If a component uses reference points (``firstPt`` and ``secondPt``) for
alignment (instead of X and Y offsets), compute the effective translation offset
*after* having applied any transform
- [glyf] When all glyphs have zero contours, compile ``glyf`` table data as a single
null byte in order to pass validation by OTS and Windows
- [feaLib] Parsing feature code now ensures that referenced glyph names are part of
the known glyph set, unless a glyph set was not provided.
- [varLib] When filling in the default axis value for a missing location of a source or
instance, correctly map the value forward.
- [varLib] The avar table can now contain mapping output values that are greater than
OR EQUAL to the preceeding value, as the avar specification allows this.
- [varLib] The errors of the module are now ordered hierarchically below VarLibError.
4.3.0:
- [EBLC/CBLC] Fixed incorrect padding length calculation for Format 3 IndexSubTable
- [varLib] Fixed error when merging OTL tables and TTFonts were loaded as ``lazy=True``
- [varLib] Allow to use master fonts containing ``CFF2`` table when building VF
- [ttLib] Make ``recalcBBoxes`` option work also with ``CFF2`` table
- [feaLib] Don't reset ``lookupflag`` in lookups defined inside feature blocks.
They will now inherit the current ``lookupflag`` of the feature. This is what
Adobe ``makeotf`` also does in this case
- [feaLib] Fixed bug with mixed single/multiple substitutions. If a single substitution
involved a glyph class, we were incorrectly using only the first glyph in the class
4.2.5:
- [feaLib] Do not fail on duplicate multiple substitutions, only warn
- [subset] Optimize SinglePos subtables to Format 1 if all ValueRecords are the same
4.2.4:
- [unicodedata] Update RTL_SCRIPTS for Unicode 11 and 12.
4.2.3:
- [otTables] Fixed bug when splitting `MarkBasePos` subtables as offsets overflow.
The mark class values in the split subtable were not being updated, leading to
invalid mark-base attachments.
- [feaLib] Only log a warning instead of error when features contain duplicate
substitutions.
- [glifLib] Strip XML comments when parsing with lxml
4.2.2:
- [subset] Fixed issue with subsetting FeatureVariations table when the index
of features changes as features get dropped. The feature index need to be
remapped to point to index of the remaining features.
- [fontBuilder] Added `addFeatureVariations` method to `FontBuilder` class. This
is a shorthand for calling `featureVars.addFeatureVariations` on the builder's
TTFont object.
- [glyf] Fixed the flags bug in glyph.drawPoints() like we did for glyph.draw()
4.2.1:
- [glyf] Use the ``flagOnCurve`` bit mask in ``glyph.draw()``, so that we ignore
the ``overlap`` flag that may be set when instantiating variable fonts.
4.2.0:
- [pens] Added the following pens:
* ``roundingPen.RoundingPen``: filter pen that rounds coordinates and components'
offsets to integer;
* ``roundingPen.RoundingPointPen``: like the above, but using PointPen protocol.
* ``filterPen.FilterPointPen``: base class for filter point pens;
* ``transformPen.TransformPointPen``: filter point pen to apply affine transform;
* ``recordingPen.RecordingPointPen``: records and replays point-pen commands.
- [ttGlyphPen] Always round float coordinates and component offsets to integers
.
- [ufoLib] When converting kerning groups from UFO2 to UFO3, avoid confusing
groups with the same name as one of the glyphs
4.1.0:
- [instancer] Implemented restricting axis ranges (level 3 partial instancing).
You can now pass ``{axis_tag: (min, max)}`` tuples as input to the
``instantiateVariableFont`` function. Note that changing the default axis
position is not supported yet. The command-line script also accepts axis ranges
in the form of colon-separated float values, e.g. ``wght=400:700``.
- [instancer] Never drop STAT ``DesignAxis`` records, but only prune out-of-range
``AxisValue`` records.
- [otBase/otTables] Enforce that VarStore.RegionAxisCount == fvar.axisCount, even
when regions list is empty to appease OTS < v8.0.
- [designspaceLib] Defined new ``processing`` attribute for ``<rules>`` element,
with values "first" or "last", plus other editorial changes to DesignSpace
specification. Bumped format version to 4.1.
- [varLib] Improved error message when masters' glyph orders do not match
- [featureVars] Allow to specify custom feature tag in ``addFeatureVariations``;
allow said feature to already exist, in which case we append new lookup indices
to existing features. Implemented ``<rules>`` attribute ``processing`` according to
DesignSpace specification update in. Depending on this flag, we generate
either an 'rvrn' (always processed first) or a 'rclt' feature (follows lookup order,
therefore last).
- [ttCollection] Added support for context manager auto-closing via ``with`` statement
like with ``TTFont``.
- [unicodedata] Require unicodedata2 >= 12.1.0.
- [py2.py3] Removed yet more PY2 vestiges.
- [_n_a_m_e] Fixed issue when comparing NameRecords with different string types.
- [fixedTools] Changed ``fixedToFloat`` to not do any rounding but simply return
``value / (1 << precisionBits)``. Added ``floatToFixedToStr`` and
``strToFixedToFloat`` functions to be used when loading from or dumping to XML.
Fixed values (e.g. fvar axes and instance coordinates, avar mappings, etc.) are
are now stored as un-rounded decimal floats upon decompiling.
- [feaLib] Fixed handling of multiple ``LigatureCaret`` statements for the same glyph.
Only the first rule per glyph is used, additional ones are ignored.
4.0.2:
- [voltLib] Added support for ``ALL`` and ``NONE`` in ``PROCESS_MARKS``.
- [Silf] Fixed issue in ``Silf`` table compilation and decompilation regarding str vs
bytes in python3.
- [merge] Handle duplicate glyph names better: instead of appending font index to
all glyph names, use similar code like we use in ``post`` and ``CFF`` tables.
4.0.1:
- [otTables] Support fixing offset overflows in ``MultipleSubst`` lookup subtables
- [subset] Prune empty strikes in ``EBDT`` and ``CBDT`` table data.
- [pens] Fixed issue in ``PointToSegmentPen`` when last point of closed contour has
same coordinates as the starting point and was incorrectly dropped.
- [Graphite] Fixed ``Sill`` table output to pass OTS.
- [name] Added ``removeNames`` method to ``table__n_a_m_e`` class.
- [ttLib] Added aliases for renamed entries ``ascender`` and ``descender`` in
``hhea`` table.
4.0.0:
- NOTE: The v4.x version series only supports Python 3.6 or greater. You can keep
using fonttools 3.x if you need support for Python 2.
- [py23] Removed all the python2-only code since it is no longer reachable, thus
unused; only the Python3 symbols were kept, but these are no-op. The module is now
DEPRECATED and will removed in the future.
- [ttLib] Fixed UnboundLocalError for empty loca/glyph tables. Also, allow
the glyf table to be incomplete when dumping to XML.
- [varLib.models] Fixed KeyError while sorting masters and there are no on-axis for
a given axis (38a8eb0e).
- [cffLib] Make sure glyph names are unique.
- [feaLib] Fix feature parser to correctly handle octal numbers
3.43.1 (released 2019-06-19)
- [subset] Fixed regression when passing --flavor=woff2 option with an input font
that was already compressed as WOFF 1.0
3.43.0 (released 2019-06-18)
- [woff2] Added support for compressing/decompressing WOFF2 fonts with non-transformed
glyf and loca tables, as well as with transformed hmtx table.
Removed Snippets/woff2_compress.py and Snippets/woff2_decompress.py scripts,
and replaced them with a new console entry point fonttools ttLib.woff2
that provides two sub-commands compress and decompress.
- [varLib.cff] Fixed bug when merging CFF2 PrivateDicts. The PrivateDict
data from the first region font was incorrecty used for all subsequent fonts.
The bug would only affect variable CFF2 fonts with hinting
Also, fixed a merging bug when VF masters have no blends or marking glyphs
- [loggingTools] Removed unused backport of LastResortLogger class.
- [subset] Gracefully handle partial MATH table
- [featureVars] Avoid duplicate references to rvrn feature record in
DefaultLangSys tables when calling addFeatureVariations on a font that
does not already have a GSUB table (aa8a5bc6).
- [varLib] Fixed merging of class-based kerning. Before, the process could introduce
rogue kerning values and variations for random classes against class zero (everything
not otherwise classed).
- [varLib] Fixed merging GPOS tables from master fonts with different number of
SinglePos subtables
- [unicodedata] Updated Blocks, Scripts and ScriptExtensions to Unicode 12.1.
3.42.0 (released 2019-05-28)
- [OS/2] Fixed sign of fsType: it should be uint16, not int16
- [subset] Skip out-of-range class values in mark attachment
- [fontBuilder] Add an empty DSIG table with setupDummyDSIG method
- [varLib.merger] Fixed bug whereby GDEF.GlyphClassDef were being dropped
when generating instance via varLib.mutator
- [varLib] Added command-line options -v and -q to configure logging
- [subset] Update font extents in head table
- [subset] Make --retain-gids truncate empty glyphs after the last non-empty glyph
- [requirements] Updated unicodedata2 backport for Unicode 12.0.
3.41.2 (released 2019-05-13)
- [cffLib] Fixed issue when importing a CFF2 variable font from XML, whereby
the VarStore state was not propagated to PrivateDict
- [varLib] Don't drop post glyph names when building CFF2 variable font
3.41.1 (released 2019-05-13)
- [designspaceLib] Added loadSourceFonts method to load source fonts using
custom opener function
- [head] Round font bounding box coordinates to integers to fix compile error
if CFF font has float coordinates
- [feaLib] Don't write None in ast.ValueRecord.asFea()
- [subset] Fixed issue AssertionError when using --desubroutinize option
- [graphite] Fixed bug in Silf table's decompile method unmasked by
previous typo fix
decompile method
3.41.0:
- [varLib/cffLib] Added support for building CFF2 variable font from sparse
masters, or masters with more than one model (multiple VarStore.VarData).
In cffLib.specializer, added support for CFF2 CharStrings with
blend operators.
- [subset] Fixed subsetting HVAR and VVAR with --retain-gids option,
and when advances mapping is null while sidebearings mappings are non-null
- Added otlLib.maxContextCalc module to compute OS/2.usMaxContext value.
Calculate it automatically when compiling features with feaLib. Added option
--recalc-max-context to subset module
- [otBase/otTables] Fixed AttributeError on missing OT table fields after
importing font from TTX
- [Silf] Fixed typo Silf table's decompile method
- [otlLib] Better compress GPOS SinglePos (LookupType 1) subtables
3.40.0:
- [subset] Fixed error while subsetting VVAR with --retain-gids
option
- [designspaceLib] Use up-to-date default location in findDefault method
- [voltLib] Allow passing file-like object to Parser.
- [arrayTools/glyf] calcIntBounds (used to compute bounding boxes of glyf
table's glyphs) now uses otRound instead of round3
- [svgLib] Added support for converting more SVG shapes to path d strings
(ellipse, line, polyline), as well as support for transform attributes.
Only matrix transformations are currently supported
- [varLib] Added support for building VVAR table from vmtx and VORG
tables
- [fontBuilder] Enable making CFF2 fonts with post table format 2
- Fixed DeprecationWarning on invalid escape sequences
3.39.0:
- [ttLib/glyf] Raise more specific error when encountering recursive
component references.
- [Doc/designspaceLib] Defined new public.skipExportGlyphs lib key.
- [varLib] Use vmtx to compute vertical phantom points; or hhea.ascent
and head.unitsPerEM if vmtx is missing.
- [gvar/cvar] Sort XML element's min/value/max attributes in TupleVariation
toXML to improve readability of TTX dump.
- [varLib.plot] Added support for 2D plots with only 1 variation axis.
- [designspaceLib] Use axes maps when normalizing locations in
DesignSpaceDocument, and when finding default source.
- [mutator] Set OVERLAP_SIMPLE and OVERLAP_COMPOUND glyf flags by
default in instantiateVariableFont. Added --no-overlap cli option
to disable this.
- [subset] Fixed subsetting VVAR table.
Fixed subsetting an HVAR table that has an AdvanceWidthMap when the
option --retain-gids is used.
- [feaLib] Added forceChained in MultipleSubstStatement.
Fixed double indentation of subtable statement.
Added support for subtable statement in more places than just PairPos
lookups.
Handle lookupflag 0 and lookupflag without a value.
- [varLib] In load_designspace, provide a default English name for the
ital axis tag.
- Remove pyftinspect because it is unmaintained and bitrotted.
3.38.0:
- [cffLib] Fixed RecursionError when unpickling or deepcopying TTFont with
CFF table.
- [subset] Fixed AttributeError when using --desubroutinize option.
Also, fixed desubroutinizing bug when subrs contain hints.
- [CPAL] Make Color a subclass of namedtuple.
- [feaLib] Allow hyphen in glyph class names.
- [feaLib] Added 'tables' option to __main__.py.
- [feaLib] Add support for special-case contextual positioning formatting.
- [svgLib] Support converting SVG basic shapes (rect, circle, etc.) into
equivalent SVG paths.
- [Snippets] Added name-viewer.ipynb Jupyter notebook.
3.37.3:
- The previous release accidentally changed several files from Unix to DOS
line-endings. Fix that.
3.37.2:
- [varLib] Temporarily revert the fix to load_masters(), which caused a
crash in interpolate_layout() when deepcopy-ing OTFs.
3.37.1:
- [varLib] load_masters() now actually assigns the fonts it loads to the
source.font attributes.
- [varLib] Fixed an MVAR table generation crash when sparse masters were
involved.
- [voltLib] parse_coverage_() returns a tuple instead of an ast.Enum.
- [feaLib] A MarkClassDefinition inside a block is no longer doubly indented
compared to the rest of the block.
3.37.0:
- [svgLib] Added support for converting elliptical arcs to cubic bezier curves
- [py23] Added backport for math.isfinite.
- [varLib] Apply HIDDEN flag to fvar axis if designspace axis has attribute
hidden=1.
- Fixed "DeprecationWarning: invalid escape sequence" in Python 3.7.
- [voltLib] Fixed parsing glyph groups. Distinguish different PROCESS_MARKS.
Accept COMPONENT glyph type.
- [feaLib] Distinguish missing value and explicit <NULL> for PairPos2
format A. Round-trip useExtension keyword. Implemented
ValueRecord.asFea method.
- [subset] Insert empty widths into hdmx when retaining gids
3.36.0:
- [ttx] Added --no-recalc-timestamp option to keep the original font's
head.modified timestamp.
- [ttx/psCharStrings] Fixed issues while dumping and round-tripping CFF2 table
with ttx.
- [voltLib] Fixed check for duplicate anchors. Don't try to read past
the END operator in .vtp file.
- [varLib] Use sentinel value -0x8000 (-32768) to ignore post.underlineThickness
and post.underlinePosition when generating MVAR deltas.
- [subset] Added --retain-gids option to subset font without modifying the
current glyph indices.
- [ufoLib] Replace deprecated calls to getbytes and setbytes with new
equivalent readbytes and writebytes calls. fs >= 2.2 no required.
- [varLib] Allow loading masters from TTX files as well
3.35.2:
- [hmtx/vmtx]: Allow to compile/decompile hmtx and vmtx tables even
without the corresponding (required) metrics header tables, hhea and
vhea
- [varLib] Added support for localized axes' labelname and named instances'
stylename.
3.35.1:
- [_m_a_x_p] Include maxComponentElements in maxp table's recalculation.
3.35.0:
- [psCharStrings] In encodeFloat function, use float's "general format" with
8 digits of precision (i.e. %8g) instead of str(). This works around
a macOS rendering issue when real numbers in CFF table are too long, and
also makes sure that floats are encoded with the same precision in python 2.7
and 3.x.
- [_n_a_m_e/fontBuilder] Make _n_a_m_e_table.addMultilingualName also add
Macintosh (platformID=1) names by default. Added options to FontBuilder
setupNameTable method to optionally disable Macintosh or Windows names.
- [varLib] Make build optionally accept a DesignSpaceDocument object,
instead of a designspace file path. The caller can now set the font
attribute of designspace's sources to a TTFont object, thus allowing to
skip filenames manipulation altogether.
- [sfnt] Allow SFNTReader objects to be deep-copied.
- Require typing>=3.6.4 on py27 to fix issue with singledispatch.
- [designspaceLib/t1Lib/macRes] Fixed some cases where pathlib.Path objects were
not accepted.
- [varLib] Fixed merging of multiple PairPosFormat2 subtables.
- [varLib] The default STAT table version is now set to 1.1, to improve
compatibility with legacy applications
3.34.2
- [merge] Fixed AssertionError when none of the script tables in GPOS/GSUB have
a DefaultLangSys record
3.34.1
- [varLib] Work around macOS rendering issue for composites without gvar entry
3.34.0:
- [varLib] Support generation of CFF2 variable fonts. model.reorderMasters()
now supports arbitrary mapping. Fix handling of overlapping ranges for feature
variations.
- [cffLib, subset] Code clean-up and fixing related to CFF2 support.
- [ttLib.tables.ttProgram] Use raw strings for regex patterns.
- [fontbuilder] Initial support for building CFF2 fonts. Set CFF's
FontMatrix automatically from unitsPerEm.
- [plistLib] Accept the more general collections.Mapping instead of the
specific dict class to support custom data classes that should serialize
to dictionaries.
3.33.0:
- [subset] subsetter bug fix with variable fonts.
- [varLib.featureVar] Improve FeatureVariations generation with many rules.
- [varLib] Enable sparse masters when buildirg variable fonts.
- [varLib.mutator] Add IDEF for GETVARIATION opcode, for handling hints in an
instance.
- [ttLib] Ignore the length of kern table subtable format 0
3.32.0:
- [ufoLib] Make UFOWriter a subclass of UFOReader, and use mixins
for shared methods
- [featureVars] Fixed normalization error when a condition's minimum/maximum
attributes are missing in designspace <rule>
- [setup.py] Added [plot] to extras, to optionally install matplotlib,
needed to use the fonTools.varLib.plot module.
- [varLib] Take total bounding box into account when resolving model.
If multiple axes have the same range ratio, cut across both.
- [subset] Don't error if STAT has no AxisValue tables.
- [fontBuilder] Added a new submodule which contains a FontBuilder wrapper
class around TTFont that makes it easier to create a working TTF or OTF
font from scratch with code. NOTE: the API is still experimental and may
change in future versions.
3.31.0:
- [ufoLib] Merged the ufoLib <https://github.com/unified-font-objects/ufoLib>__
master branch into a new fontTools.ufoLib package
Moved ufoLib.pointPen module to fontTools.pens.pointPen.
Moved ufoLib.etree module to fontTools.misc.etree.
Moved ufoLib.plistlib module to fontTools.misc.plistlib.
To use the new fontTools.ufoLib module you need to install fonttools
with the [ufo] extra, or you can manually install the required additional
dependencies (cf. README.rst).
- [morx] Support AAT action type to insert glyphs and clean up compilation
of AAT action tables.
- [subset] The --no-hinting on a CFF font now also drops the optional
hinting keys in Private dict: ForceBold, LanguageGroup, and
ExpansionFactor
- [subset] Include nameIDs referenced by STAT table
- [loggingTools] Added msg=None argument to
CapturingLogHandler.assertRegex.
- [varLib.mutator] Implemented FeatureVariations instantiation
- [g_l_y_f] Added PointPen support to _TTGlyph objects
3.30.0:
- Skip building noop class PairPos subtables when Coverage is NULL
- Expose the previously reserved bit flag OVERLAP_SIMPLE of
glyf table's contour points in the TTX dump. This is used in some
implementations to specify a non-zero fill with overlapping contours.
- Added support for decompiling/compiling TS1C tables containing
VTT sources for cvar variation table.
- Use fontTools.designspaceLib to read DesignSpaceDocument. The
fontTools.varLib.designspace module is now deprecated and will be removed
in future versions. The presence of an explicit axes element is now
required in order to build a variable font.
- Implemented building GSUB FeatureVariations table from the rules
element of DesignSpace document
- Added --no-layout-closure option to not expand the subset with
the glyphs produced by OpenType layout features. Instead, OpenType features
will be subset to only rules that are relevant to the otherwise-specified
glyph setpy-fonttools: updated to 3.30.0
3.29.0:
- [feaLib] In the OTL table builder, when the name table is excluded
from the list of tables to be build, skip compiling featureNames blocks,
as the records referenced in FeatureParams table don't exist.
- [otBase] Try ExtensionLookup if other offset-overflow methods fail.
- [feaLib] Added support for explicit subtable; break statements in
PairPos lookups; previously these were ignored.
- [cffLib.specializer] Make sure the stack depth does not exceed maxstack - 1,
so that a subroutinizer can insert subroutine calls.
- [otTables] Added support for fixing offset overflow errors occurring inside
MarkBasePos subtables.
- [subset] Write the default output file extension based on --flavor option,
or the value of TTFont.sfntVersion.
- [unicodedata] Updated Blocks, Scripts and ScriptExtensions for Unicode 11.
- [xmlWriter] Added context manager to XMLWriter class to autoclose file
descriptor on exit.
- [psCharStrings] Optimize the charstring's bytecode by encoding as integers
all float values that have no decimal portion.
- [ttFont] Fixed missing import of TTLibError exception.
- [feaLib] Allow any languages other than dflt under DFLT script.
3.28.0:
- [featureVars] Added experimental module to build FeatureVariations
tables. Still needs to be hooked up to varLib.build
- [fixedTools] Added 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
- [subset] Improved GSUB closure memoize algorithm.
- [varLib.models] Fixed regression in model resolution
- [feaLib.ast] Fixed error when converting SubtableStatement to string
- [varLib.mutator] Set OS/2.usWeightClass and usWidthClass, and
post.italicAngle based on the 'wght', 'wdth' and 'slnt' axis values
- [py23/loggingTools] Don't automatically set logging.lastResort handler
on py27. Moved LastResortLogger to the loggingTools module
3.26.0:
- [designspace] Added a new optional layer attribute to the source element,
and a corresponding layerName attribute to the SourceDescriptor
object.
Added conditionset element to the rule element to the spec, but not
implemented in designspace reader/writer yet.
- [varLib.models] Refine modeling one last time.
- [otBase] Fixed sharing of tables referred to by different offset sizes
- [subset] Don't drop a GDEF that only has VarStore. Set to None
empty Coverage tables in MarkGlyphSets.
- [varLib]: Added --master-finder command-line option.
- [varLib.mutator] Prune fvar nameIDs from instance's name table.
- [otTables] Allow decompiling bad ClassDef tables with invalid format, with
warning.
- [varLib] Make STAT v1.2 and reuse nameIDs from fvar table.
- [varLib.plot] Show master locations. Set axis limits to -1, +1.
- [subset] Handle HVAR direct mapping. Passthrough 'cvar'.
Added --font-number command-line option for collections.
- [t1Lib] Allow a text encoding to be specified when parsing a Type 1 font
Added kind argument to T1Font constructor.
- [ttLib] Added context manager API to TTFont class, so it can be used in
with statements to auto-close the file when exiting the context
3.25.0:
[varLib] Improved support-resolution algorithm. Previously, the on-axis masters would always cut the space. They don’t anymore. That’s more consistent, and fixes the main issue Erik showed at TYPO Labs 2017. Any varfont built that had an unusual master configuration will change when rebuilt
[varLib.models] Added a main() entry point, that takes positions and prints model results.
[varLib.plot] Added new module to plot a designspace’s VariationModel. Requires matplotlib.
[varLib.mutator] Added -o option to specify output file path
[otTables] Fixed IndexError while pruning of HVAR pre-write
[varLib.models] Convert delta array to floats if values overflows signed short integer
3.24.1:
[varLib] Don't remap the same DeviceTable twice in VarStore optimizer.
[varLib] Add --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.
[ttCollection] Fixed issue while decompiling ttc with python3
3.24.0:
[ttGlyphPen] Decompose composite glyphs if any components' transform is too large to fit a F2Dot14 value, or clamp transform values that are (almost) equal to +2.0 to make them fit and avoid decomposing.
[ttx] Added new -g option to dump glyphs from the glyf table splitted as individual ttx files.
Copied ufoLib.filenames module to fontTools.misc.filenames, used for the ttx split-glyphs option .
[feaLib] Added support for cvParameters blocks in Character Variant feautures cv01-cv99.
[Snippets] Added checksum.py script to generate/check SHA1 hash of ttx files.
[varLib.mutator] Fixed issue while instantiating some variable fonts whereby the horizontal advance width computed from gvar phantom points could turn up to be negative.
[varLib/subset] Fixed issue with subsetting GPOS variation data not picking up ValueRecord Device objects (54fd71f).
[feaLib/voltLib] In all AST elements, the 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
3.23.0:
[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 property list dictionary, similar to the UFO’s lib. Added an optional font attribute to the SourceDescriptor, to allow operating on in-memory font objects.
[cffLib] Fixed issue with lazy-loading of attributes when attempting to set the CFF TopDict.Encoding.
[ttx] Fixed regression introduced in 3.22.0 that affected the split tables -s option.
[feaLib] Added IncludedFeaNotFound custom exception subclass, raised when an included feature file cannot be found.
[otTables] Changed 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.
[varLib] Implemented VarStore optimizer.
[subset] Implemented pruning of GDEF VarStore, HVAR and MVAR.
[sfnt] Restore backward compatiblity with numFonts attribute of SFNTReader object.
[merge] Initial support for merging LangSysRecords.
[ttCollection] don’t seek(0) when writing to possibly unseekable strems.
[subset] Keep all --name-IDs from 0 to 6 by default.
[cffLib] Added width module to calculate optimal CFF default and nominal glyph widths.
[varLib] Don’t fail if STAT already in the master fonts
3.22.0:
- [subset] Support subsetting endchar acting as seac-like components
in CFF.
- [feaLib] Allow to build from pre-parsed ast.FeatureFile object.
Added tables argument to only build some tables instead of all.
- [textTools] Replaced safeEval with ast.literal_eval.
- [feaLib] Added option to the parser to not resolve include statements.
- [ttLib] Added new ttCollection module to read/write TrueType and
OpenType Collections. Exports a 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.
- [unicodeadata] Added ot_tag_to_script function that converts from
OpenType script tag to Unicode script code.
- Added new designspaceLib subpackage, originally from Erik Van Blokland's
designSpaceDocument: https://github.com/LettError/designSpaceDocument
NOTE: this is not yet used internally by varLib, and the API may be subject
to changes.
- Added new FontTools icon images.
- [unicodedata] Added script_horizontal_direction function that returns
either "LTR" or "RTL" given a unicode script code.
- [otConverters] Don't write descriptive name string as XML comment if the
NameID value is 0 (== NULL).
- [unicodedata] Add ot_tags_from_script function to get the list of
OpenType script tags associated with unicode script code.
- [feaLib] Don't error when "enumerated" kern pairs conflict with preceding
single pairs; emit warning and chose the first value.
- [loggingTools] In CapturingLogHandler.assertRegex method, match the
fully formatted log message.
- [sbix] Fixed TypeError when concatenating str and bytes.
- [bezierTools] Implemented cusp support and removed approximate_fallback
arg in calcQuadraticArcLength. Added calcCubicArcLength
3.21.0:
[cmap] when compiling format6 subtable, don't assume gid0 is always called '.notdef'.
[ot] Allow decompiling fonts with bad Coverage format number.
Change FontTools licence to MIT.
[post] Prune extra names already in standard Mac set.
[subset] Delete empty SubrsIndex after subsetting.
[varLib] Don't share points in cvar by default, as it currently fails on some browsers.
[afmLib] Make poor old afmLib work on python3.
3.20.1:
[unicodedata] Fixed issue with 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.
3.20.0:
[unicodedata] Addded new module 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.
[feaLib] Added __str__ method to all ast elements.
[feaLib] Parser constructor now accepts a glyphNames iterable instead of glyphMap dict. The latter still works but with a pending deprecation warning.
[bezierTools] Added arc length calculation functions originally from pens.perimeterPen module.
[varLib] Started generating STAT table (8af4309). Right now it just reflects the axes, and even that with certain limitations: * AxisOrdering is set to the order axes are defined, * Name-table entries are not shared with fvar.
[py23] Added backports for redirect_stdout and redirect_stderr context managers.
[Graphite] Fixed some round-trip bugs