Skip to content
Cubic-to-quadratic bezier curve conversion
Branch: master
Clone or download
Type Name Latest commit message Commit time
Failed to load latest commit information.
Lib/cu2qu change imports from ufoLib to fontTools.ufoLib Nov 1, 2018
tests change imports from ufoLib to fontTools.ufoLib Nov 1, 2018
tools add script to download updated Cython/ module Sep 26, 2018
.codecov.yml Add .codecov.yml to mute notifications Oct 31, 2017
.coveragerc .coveragerc: exclude vendored Sep 26, 2018
.gitignore update .gitignore Sep 26, 2018
.pyup.yml add .pyup.yml for bot; updates are now scheduled weekly Feb 6, 2017
.travis.yml travis: update pypi password, use twine (via tox) to upload to PyPI Sep 26, 2018 Add contributing and readme files Oct 6, 2015
LICENSE Add license. Oct 6, 2015 add test-requirements.txt to sdist Oct 31, 2017
README.rst mention cu2qu script in README Apr 12, 2019
pyproject.toml pyproject.toml: always install cython as PEP518 build dependency Apr 12, 2019
requirements.txt require fonttools[ufo]; drop ufoLib Nov 1, 2018
setup.cfg setup.cfg: 'wheel' entry in setup.cfg is deprecated; should use 'bdis… Oct 18, 2018 require fonttools[ufo]; drop ufoLib Nov 1, 2018
tox.ini tox: use --no-build-isolation as we install requirements.txt ourselves Apr 12, 2019


Build Status PyPI Version Coverage


This library provides functions which take in UFO objects (Defcon Fonts or Robofab RFonts) and converts any cubic curves to quadratic. The most useful function is probably fonts_to_quadratic:

from defcon import Font
from cu2qu.ufo import fonts_to_quadratic
thin_font = Font('MyFont-Thin.ufo')
bold_font = Font('MyFont-Bold.ufo')
fonts_to_quadratic([thin_font, bold_font])

Interpolation compatibility is guaranteed during conversion. If it's not needed, converting one font at a time may yield more optimized results:

for font in [thin_font, bold_font]:

Some fonts may need a different error threshold than the default (0.001 em). This can also be provided by the caller:

fonts_to_quadratic([thin_font, bold_font], max_err_em=0.005)
for font in [thin_font, bold_font]:
    fonts_to_quadratic([font], max_err_em=0.001)

fonts_to_quadratic can print a string reporting the number of curves of each length. For example fonts_to_quadratic([font], dump_stats=True) may print something like:

3: 1000
4: 2000
5: 100

meaning that the font now contains 1000 curves with three points, 2000 with four points, and 100 with five. Given multiple fonts, the function will report the total counts across all fonts. You can also accumulate statistics between calls by providing your own report dictionary:

stats = {}
for font in [thin_font, bold_font]:
    fonts_to_quadratic([font], stats=stats)
# "stats" will report combined statistics for both fonts

The library also provides a command-line script also named cu2qu. Check its --help to see all the options.


You can install/upgrade cu2qu using pip, like any other Python package.

$ pip install --upgrade cu2qu

This will download the latest stable version available from the Python Package Index (PyPI).

If you wish to modify the sources in-place, you can clone the git repository from Github and install in --editable (or -e) mode:

$ git clone
$ cd cu2qu
$ pip install --editable .

Optionally, you can build an optimized version of cu2qu which uses Cython to compile Python to C. The extension module thus created is more than twice as fast than its pure-Python equivalent.

When installing cu2qu from PyPI using pip, as long as you have a C compiler available, the cu2qu setup script will automatically attempt to build a C/Python extension module. If the compilation fails for any reasons, an error is printed and cu2qu will be installed as pure-Python, without the optimized extension.

If you have cloned the git repository, the C source files are not present and need to be regenerated. To do that, you need to install the latest Cython (as usual, pip install -U cython), and then use the global option --with-cython when invoking the script. You can also export a CU2QU_WITH_CYTHON=1 environment variable if you prefer.

For example, to build the cu2qu extension module in-place (i.e. in the same source directory):

$ python --with-cython build_ext --inplace

You can also pass --global-option when installing with pip from a local source checkout, like so:

$ pip install --global-option="--with-cython" -e .
You can’t perform that action at this time.