2017-01-18 15:59:51 +00:00
|
|
|
|
|Travis Build Status| |Appveyor Build status| |Health| |Coverage Status|
|
|
|
|
|
|PyPI|
|
|
|
|
|
|
|
|
|
|
What is this?
|
|
|
|
|
~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
| fontTools is a library for manipulating fonts, written in Python. The
|
|
|
|
|
project includes the TTX tool, that can convert TrueType and OpenType
|
|
|
|
|
fonts to and from an XML text format, which is also called TTX. It
|
|
|
|
|
supports TrueType, OpenType, AFM and to an extent Type 1 and some
|
2017-12-13 17:42:34 +00:00
|
|
|
|
Mac-specific formats. The project has a `MIT open-source
|
2017-01-18 15:59:51 +00:00
|
|
|
|
licence <LICENSE>`__.
|
|
|
|
|
| Among other things this means you can use it free of charge.
|
|
|
|
|
|
|
|
|
|
Installation
|
|
|
|
|
~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
FontTools requires `Python <http://www.python.org/download/>`__ 2.7, 3.4
|
|
|
|
|
or later.
|
|
|
|
|
|
|
|
|
|
The package is listed in the Python Package Index (PyPI), so you can
|
|
|
|
|
install it with `pip <https://pip.pypa.io>`__:
|
|
|
|
|
|
|
|
|
|
.. code:: sh
|
|
|
|
|
|
|
|
|
|
pip install fonttools
|
|
|
|
|
|
|
|
|
|
If you would like to contribute to its development, you can clone the
|
|
|
|
|
repository from Github, install the package in 'editable' mode and
|
|
|
|
|
modify the source code in place. We recommend creating a virtual
|
|
|
|
|
environment, using `virtualenv <https://virtualenv.pypa.io>`__ or
|
|
|
|
|
Python 3 `venv <https://docs.python.org/3/library/venv.html>`__ module.
|
|
|
|
|
|
|
|
|
|
.. code:: sh
|
|
|
|
|
|
|
|
|
|
# download the source code to 'fonttools' folder
|
|
|
|
|
git clone https://github.com/fonttools/fonttools.git
|
|
|
|
|
cd fonttools
|
|
|
|
|
|
|
|
|
|
# create new virtual environment called e.g. 'fonttools-venv', or anything you like
|
|
|
|
|
python -m virtualenv fonttools-venv
|
|
|
|
|
|
|
|
|
|
# source the `activate` shell script to enter the environment (Un\*x); to exit, just type `deactivate`
|
|
|
|
|
. fonttools-venv/bin/activate
|
|
|
|
|
|
|
|
|
|
# to activate the virtual environment in Windows `cmd.exe`, do
|
|
|
|
|
fonttools-venv\Scripts\activate.bat
|
|
|
|
|
|
|
|
|
|
# install in 'editable' mode
|
|
|
|
|
pip install -e .
|
|
|
|
|
|
|
|
|
|
TTX – From OpenType and TrueType to XML and Back
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
Once installed you can use the ``ttx`` command to convert binary font
|
|
|
|
|
files (``.otf``, ``.ttf``, etc) to the TTX xml format, edit them, and
|
|
|
|
|
convert them back to binary format. TTX files have a .ttx file
|
|
|
|
|
extension.
|
|
|
|
|
|
|
|
|
|
.. code:: sh
|
|
|
|
|
|
|
|
|
|
ttx /path/to/font.otf
|
|
|
|
|
ttx /path/to/font.ttx
|
|
|
|
|
|
|
|
|
|
The TTX application works can be used in two ways, depending on what
|
|
|
|
|
platform you run it on:
|
|
|
|
|
|
|
|
|
|
- As a command line tool (Windows/DOS, Unix, MacOSX)
|
|
|
|
|
- By dropping files onto the application (Windows, MacOS)
|
|
|
|
|
|
|
|
|
|
TTX detects what kind of files it is fed: it will output a ``.ttx`` file
|
|
|
|
|
when it sees a ``.ttf`` or ``.otf``, and it will compile a ``.ttf`` or
|
|
|
|
|
``.otf`` when the input file is a ``.ttx`` file. By default, the output
|
|
|
|
|
file is created in the same folder as the input file, and will have the
|
|
|
|
|
same name as the input file but with a different extension. TTX will
|
|
|
|
|
*never* overwrite existing files, but if necessary will append a unique
|
|
|
|
|
number to the output filename (before the extension) such as
|
|
|
|
|
``Arial#1.ttf``
|
|
|
|
|
|
|
|
|
|
When using TTX from the command line there are a bunch of extra options,
|
|
|
|
|
these are explained in the help text, as displayed when typing
|
|
|
|
|
``ttx -h`` at the command prompt. These additional options include:
|
|
|
|
|
|
|
|
|
|
- specifying the folder where the output files are created
|
|
|
|
|
- specifying which tables to dump or which tables to exclude
|
|
|
|
|
- merging partial ``.ttx`` files with existing ``.ttf`` or ``.otf``
|
|
|
|
|
files
|
|
|
|
|
- listing brief table info instead of dumping to ``.ttx``
|
|
|
|
|
- splitting tables to separate ``.ttx`` files
|
|
|
|
|
- disabling TrueType instruction disassembly
|
|
|
|
|
|
|
|
|
|
The TTX file format
|
2017-01-27 14:46:39 +00:00
|
|
|
|
-------------------
|
2017-01-18 15:59:51 +00:00
|
|
|
|
|
2017-01-18 16:15:11 +00:00
|
|
|
|
The following tables are currently supported:
|
|
|
|
|
|
|
|
|
|
.. begin table list
|
|
|
|
|
.. code::
|
|
|
|
|
|
2017-01-19 09:43:02 +00:00
|
|
|
|
BASE, CBDT, CBLC, CFF, CFF2, COLR, CPAL, DSIG, EBDT, EBLC, FFTM,
|
2017-09-15 11:21:10 +07:00
|
|
|
|
Feat, GDEF, GMAP, GPKG, GPOS, GSUB, Glat, Gloc, HVAR, JSTF, LTSH,
|
|
|
|
|
MATH, META, MVAR, OS/2, SING, STAT, SVG, Silf, Sill, TSI0, TSI1,
|
|
|
|
|
TSI2, TSI3, TSI5, TSIB, TSID, TSIJ, TSIP, TSIS, TSIV, TTFA, VDMX,
|
|
|
|
|
VORG, VVAR, ankr, avar, bsln, cidg, cmap, cvar, cvt, feat, fpgm,
|
|
|
|
|
fvar, gasp, gcid, glyf, gvar, hdmx, head, hhea, hmtx, kern, lcar,
|
|
|
|
|
loca, ltag, maxp, meta, mort, morx, name, opbd, post, prep, prop,
|
|
|
|
|
sbix, trak, vhea and vmtx
|
2017-01-18 16:15:11 +00:00
|
|
|
|
.. end table list
|
|
|
|
|
|
|
|
|
|
Other tables are dumped as hexadecimal data.
|
2017-01-18 15:59:51 +00:00
|
|
|
|
|
|
|
|
|
TrueType fonts use glyph indices (GlyphIDs) to refer to glyphs in most
|
|
|
|
|
places. While this is fine in binary form, it is really hard to work
|
|
|
|
|
with for humans. Therefore we use names instead.
|
|
|
|
|
|
|
|
|
|
The glyph names are either extracted from the ``CFF`` table or the
|
|
|
|
|
``post`` table, or are derived from a Unicode ``cmap`` table. In the
|
|
|
|
|
latter case the Adobe Glyph List is used to calculate names based on
|
|
|
|
|
Unicode values. If all of these methods fail, names are invented based
|
|
|
|
|
on GlyphID (eg ``glyph00142``)
|
|
|
|
|
|
|
|
|
|
It is possible that different glyphs use the same name. If this happens,
|
|
|
|
|
we force the names to be unique by appending ``#n`` to the name (``n``
|
|
|
|
|
being an integer number.) The original names are being kept, so this has
|
|
|
|
|
no influence on a "round tripped" font.
|
|
|
|
|
|
|
|
|
|
Because the order in which glyphs are stored inside the binary font is
|
|
|
|
|
important, we maintain an ordered list of glyph names in the font.
|
|
|
|
|
|
|
|
|
|
Other Tools
|
|
|
|
|
~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
Commands for inspecting, merging and subsetting fonts are also
|
|
|
|
|
available:
|
|
|
|
|
|
|
|
|
|
.. code:: sh
|
|
|
|
|
|
|
|
|
|
pyftinspect
|
|
|
|
|
pyftmerge
|
|
|
|
|
pyftsubset
|
|
|
|
|
|
|
|
|
|
fontTools Python Module
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
The fontTools python module provides a convenient way to
|
|
|
|
|
programmatically edit font files.
|
|
|
|
|
|
|
|
|
|
.. code:: py
|
|
|
|
|
|
|
|
|
|
>>> from fontTools.ttLib import TTFont
|
|
|
|
|
>>> font = TTFont('/path/to/font.ttf')
|
|
|
|
|
>>> font
|
|
|
|
|
<fontTools.ttLib.TTFont object at 0x10c34ed50>
|
|
|
|
|
>>>
|
|
|
|
|
|
|
|
|
|
A selection of sample python programs is in the
|
|
|
|
|
`Snippets <https://github.com/fonttools/fonttools/blob/master/Snippets/>`__
|
|
|
|
|
directory.
|
|
|
|
|
|
2017-03-05 21:15:04 +00:00
|
|
|
|
Optional Requirements
|
|
|
|
|
---------------------
|
|
|
|
|
|
|
|
|
|
The ``fontTools`` package currently has no (required) external dependencies
|
|
|
|
|
besides the modules included in the Python Standard Library.
|
|
|
|
|
However, a few extra dependencies are required by some of its modules, which
|
|
|
|
|
are needed to unlock optional features.
|
|
|
|
|
|
|
|
|
|
- ``Lib/fontTools/ttLib/woff2.py``
|
|
|
|
|
|
|
|
|
|
Module to compress/decompress WOFF 2.0 web fonts; it requires:
|
|
|
|
|
|
|
|
|
|
- `brotli <https://pypi.python.org/pypi/Brotli>`__: Python bindings of
|
|
|
|
|
the Brotli compression library.
|
|
|
|
|
|
|
|
|
|
- ``Lib/fontTools/ttLib/sfnt.py``
|
|
|
|
|
|
|
|
|
|
To better compress WOFF 1.0 web fonts, the following module can be used
|
|
|
|
|
instead of the built-in ``zlib`` library:
|
|
|
|
|
|
|
|
|
|
- `zopfli <https://pypi.python.org/pypi/zopfli>`__: Python bindings of
|
|
|
|
|
the Zopfli compression library.
|
|
|
|
|
|
|
|
|
|
- ``Lib/fontTools/unicode.py``
|
|
|
|
|
|
|
|
|
|
To display the Unicode character names when dumping the ``cmap`` table
|
|
|
|
|
with ``ttx`` we use the ``unicodedata`` module in the Standard Library.
|
|
|
|
|
The version included in there varies between different Python versions.
|
|
|
|
|
To use the latest available data, you can install:
|
|
|
|
|
|
|
|
|
|
- `unicodedata2 <https://pypi.python.org/pypi/unicodedata2>`__:
|
|
|
|
|
``unicodedata`` backport for Python 2.7 and 3.5 updated to the latest
|
|
|
|
|
Unicode version 9.0. Note this is not necessary if you use Python 3.6
|
|
|
|
|
as the latter already comes with an up-to-date ``unicodedata``.
|
|
|
|
|
|
|
|
|
|
- ``Lib/fontTools/varLib/interpolatable.py``
|
|
|
|
|
|
|
|
|
|
Module for finding wrong contour/component order between different masters.
|
|
|
|
|
It requires one of the following packages in order to solve the so-called
|
|
|
|
|
"minimum weight perfect matching problem in bipartite graphs", or
|
|
|
|
|
the Assignment problem:
|
|
|
|
|
|
|
|
|
|
* `scipy <https://pypi.python.org/pypi/scipy>`__: the Scientific Library
|
|
|
|
|
for Python, which internally uses `NumPy <https://pypi.python.org/pypi/numpy>`__
|
|
|
|
|
arrays and hence is very fast;
|
|
|
|
|
* `munkres <https://pypi.python.org/pypi/munkres>`__: a pure-Python
|
|
|
|
|
module that implements the Hungarian or Kuhn-Munkres algorithm.
|
|
|
|
|
|
|
|
|
|
- ``Lib/fontTools/misc/symfont.py``
|
|
|
|
|
|
|
|
|
|
Advanced module for symbolic font statistics analysis; it requires:
|
|
|
|
|
|
|
|
|
|
* `sympy <https://pypi.python.org/pypi/sympy>`__: the Python library for
|
|
|
|
|
symbolic mathematics.
|
|
|
|
|
|
2017-03-05 22:26:11 +00:00
|
|
|
|
- ``Lib/fontTools/t1Lib.py``
|
2017-03-05 21:15:04 +00:00
|
|
|
|
|
|
|
|
|
To get the file creator and type of Macintosh PostScript Type 1 fonts
|
|
|
|
|
on Python 3 you need to install the following module, as the old ``MacOS``
|
|
|
|
|
module is no longer included in Mac Python:
|
|
|
|
|
|
|
|
|
|
* `xattr <https://pypi.python.org/pypi/xattr>`__: Python wrapper for
|
|
|
|
|
extended filesystem attributes (macOS platform only).
|
|
|
|
|
|
|
|
|
|
- ``Lib/fontTools/pens/cocoaPen.py``
|
|
|
|
|
|
|
|
|
|
Pen for drawing glyphs with Cocoa ``NSBezierPath``, requires:
|
|
|
|
|
|
|
|
|
|
* `PyObjC <https://pypi.python.org/pypi/pyobjc>`__: the bridge between
|
|
|
|
|
Python and the Objective-C runtime (macOS platform only).
|
|
|
|
|
|
|
|
|
|
- ``Lib/fontTools/pens/qtPen.py``
|
|
|
|
|
|
|
|
|
|
Pen for drawing glyphs with Qt's ``QPainterPath``, requires:
|
|
|
|
|
|
|
|
|
|
* `PyQt5 <https://pypi.python.org/pypi/PyQt5>`__: Python bindings for
|
|
|
|
|
the Qt cross platform UI and application toolkit.
|
|
|
|
|
|
|
|
|
|
- ``Lib/fontTools/pens/reportLabPen.py``
|
|
|
|
|
|
|
|
|
|
Pen to drawing glyphs as PNG images, requires:
|
|
|
|
|
|
|
|
|
|
* `reportlab <https://pypi.python.org/pypi/reportlab>`__: Python toolkit
|
|
|
|
|
for generating PDFs and graphics.
|
|
|
|
|
|
2017-03-05 22:26:11 +00:00
|
|
|
|
- ``Lib/fontTools/inspect.py``
|
2017-03-05 21:15:04 +00:00
|
|
|
|
|
|
|
|
|
A GUI font inspector, requires one of the following packages:
|
|
|
|
|
|
|
|
|
|
* `PyGTK <https://pypi.python.org/pypi/PyGTK>`__: Python bindings for
|
|
|
|
|
GTK 2.x (only works with Python 2).
|
|
|
|
|
* `PyGObject <https://wiki.gnome.org/action/show/Projects/PyGObject>`__ :
|
|
|
|
|
Python bindings for GTK 3.x and gobject-introspection libraries (also
|
|
|
|
|
compatible with Python 3).
|
|
|
|
|
|
2017-01-18 15:59:51 +00:00
|
|
|
|
Testing
|
|
|
|
|
~~~~~~~
|
|
|
|
|
|
|
|
|
|
To run the test suite, you can do:
|
|
|
|
|
|
|
|
|
|
.. code:: sh
|
|
|
|
|
|
|
|
|
|
python setup.py test
|
|
|
|
|
|
|
|
|
|
If you have `pytest <http://docs.pytest.org/en/latest/>`__, you can run
|
|
|
|
|
the ``pytest`` command directly. The tests will run against the
|
|
|
|
|
installed ``fontTools`` package, or the first one found in the
|
|
|
|
|
``PYTHONPATH``.
|
|
|
|
|
|
|
|
|
|
You can also use `tox <https://testrun.org/tox/latest/>`__ to
|
|
|
|
|
automatically run tests on different Python versions in isolated virtual
|
|
|
|
|
environments.
|
|
|
|
|
|
|
|
|
|
.. code:: sh
|
|
|
|
|
|
|
|
|
|
pip install tox
|
|
|
|
|
tox
|
|
|
|
|
|
|
|
|
|
Note that when you run ``tox`` without arguments, the tests are executed
|
|
|
|
|
for all the environments listed in tox.ini's ``envlist``. In our case,
|
2017-04-10 11:42:09 +01:00
|
|
|
|
this includes Python 2.7 and 3.6, so for this to work the ``python2.7``
|
|
|
|
|
and ``python3.6`` executables must be available in your ``PATH``.
|
2017-01-18 15:59:51 +00:00
|
|
|
|
|
|
|
|
|
You can specify an alternative environment list via the ``-e`` option,
|
|
|
|
|
or the ``TOXENV`` environment variable:
|
|
|
|
|
|
|
|
|
|
.. code:: sh
|
|
|
|
|
|
|
|
|
|
tox -e py27-nocov
|
2017-04-10 11:42:09 +01:00
|
|
|
|
TOXENV="py36-cov,htmlcov" tox
|
2017-01-18 15:59:51 +00:00
|
|
|
|
|
|
|
|
|
Development Community
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
TTX/FontTools development is ongoing in an active community of
|
|
|
|
|
developers, that includes professional developers employed at major
|
|
|
|
|
software corporations and type foundries as well as hobbyists.
|
|
|
|
|
|
|
|
|
|
Feature requests and bug reports are always welcome at
|
|
|
|
|
https://github.com/fonttools/fonttools/issues/
|
|
|
|
|
|
|
|
|
|
The best place for discussions about TTX from an end-user perspective as
|
|
|
|
|
well as TTX/FontTools development is the
|
|
|
|
|
https://groups.google.com/d/forum/fonttools mailing list. There is also
|
|
|
|
|
a development https://groups.google.com/d/forum/fonttools-dev mailing
|
|
|
|
|
list for continuous integration notifications. You can also email Behdad
|
|
|
|
|
privately at behdad@behdad.org
|
|
|
|
|
|
|
|
|
|
History
|
|
|
|
|
~~~~~~~
|
|
|
|
|
|
|
|
|
|
The fontTools project was started by Just van Rossum in 1999, and was
|
|
|
|
|
maintained as an open source project at
|
|
|
|
|
http://sourceforge.net/projects/fonttools/. In 2008, Paul Wise (pabs3)
|
|
|
|
|
began helping Just with stability maintenance. In 2013 Behdad Esfahbod
|
|
|
|
|
began a friendly fork, thoroughly reviewing the codebase and making
|
|
|
|
|
changes at https://github.com/behdad/fonttools to add new features and
|
|
|
|
|
support for new font formats.
|
|
|
|
|
|
|
|
|
|
Acknowledgements
|
|
|
|
|
~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
In alphabetical order:
|
|
|
|
|
|
|
|
|
|
Olivier Berten, Samyak Bhuta, Erik van Blokland, Petr van Blokland,
|
|
|
|
|
Jelle Bosma, Sascha Brawer, Tom Byrer, Frédéric Coiffier, Vincent
|
|
|
|
|
Connare, Dave Crossland, Simon Daniels, Behdad Esfahbod, Behnam
|
|
|
|
|
Esfahbod, Hannes Famira, Sam Fishman, Matt Fontaine, Yannis Haralambous,
|
|
|
|
|
Greg Hitchcock, Jeremie Hornus, Khaled Hosny, John Hudson, Denis Moyogo
|
|
|
|
|
Jacquerye, Jack Jansen, Tom Kacvinsky, Jens Kutilek, Antoine Leca,
|
|
|
|
|
Werner Lemberg, Tal Leming, Peter Lofting, Cosimo Lupo, Masaya Nakamura,
|
|
|
|
|
Dave Opstad, Laurence Penney, Roozbeh Pournader, Garret Rieger, Read
|
|
|
|
|
Roberts, Guido van Rossum, Just van Rossum, Andreas Seidel, Georg
|
|
|
|
|
Seifert, Miguel Sousa, Adam Twardoch, Adrien Tétar, Vitaly Volkov, Paul
|
|
|
|
|
Wise.
|
|
|
|
|
|
|
|
|
|
Copyrights
|
|
|
|
|
~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
| Copyright (c) 1999-2004 Just van Rossum, LettError
|
|
|
|
|
(just@letterror.com)
|
|
|
|
|
| See `LICENSE <LICENSE>`__ for the full license.
|
|
|
|
|
|
|
|
|
|
Copyright (c) 2000 BeOpen.com. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
Copyright (c) 1995-2001 Corporation for National Research Initiatives.
|
|
|
|
|
All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam. All
|
|
|
|
|
Rights Reserved.
|
|
|
|
|
|
|
|
|
|
Have fun!
|
|
|
|
|
|
|
|
|
|
.. |Travis Build Status| image:: https://travis-ci.org/fonttools/fonttools.svg
|
|
|
|
|
:target: https://travis-ci.org/fonttools/fonttools
|
|
|
|
|
.. |Appveyor Build status| image:: https://ci.appveyor.com/api/projects/status/0f7fmee9as744sl7/branch/master?svg=true
|
|
|
|
|
:target: https://ci.appveyor.com/project/fonttools/fonttools/branch/master
|
|
|
|
|
.. |Health| image:: https://landscape.io/github/behdad/fonttools/master/landscape.svg?style=flat
|
|
|
|
|
:target: https://landscape.io/github/behdad/fonttools/master
|
|
|
|
|
.. |Coverage Status| image:: https://codecov.io/gh/fonttools/fonttools/branch/master/graph/badge.svg
|
|
|
|
|
:target: https://codecov.io/gh/fonttools/fonttools
|
|
|
|
|
.. |PyPI| image:: https://img.shields.io/pypi/v/fonttools.svg
|
|
|
|
|
:target: https://pypi.org/project/FontTools
|
2018-05-03 13:19:14 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.. image:: https://badges.gitter.im/fonttools-dev/Lobby.svg
|
|
|
|
|
:alt: Join the chat at https://gitter.im/fonttools-dev/Lobby
|
|
|
|
|
:target: https://gitter.im/fonttools-dev/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
|