363 lines
13 KiB
ReStructuredText
363 lines
13 KiB
ReStructuredText
|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
|
||
Mac-specific formats. The project has a `BSD-style open-source
|
||
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
|
||
-------------------
|
||
|
||
The following tables are currently supported:
|
||
|
||
.. begin table list
|
||
.. code::
|
||
|
||
BASE, CBDT, CBLC, CFF, CFF2, COLR, CPAL, DSIG, EBDT, EBLC, FFTM,
|
||
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
|
||
.. end table list
|
||
|
||
Other tables are dumped as hexadecimal data.
|
||
|
||
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.
|
||
|
||
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.
|
||
|
||
- ``Lib/fontTools/t1Lib.py``
|
||
|
||
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.
|
||
|
||
- ``Lib/fontTools/inspect.py``
|
||
|
||
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).
|
||
|
||
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,
|
||
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``.
|
||
|
||
You can specify an alternative environment list via the ``-e`` option,
|
||
or the ``TOXENV`` environment variable:
|
||
|
||
.. code:: sh
|
||
|
||
tox -e py27-nocov
|
||
TOXENV="py36-cov,htmlcov" tox
|
||
|
||
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
|