blob: 82da45d218d8f0125dfcf669e02889ec8b5206c3 [file] [log] [blame]
"""
Instantiate a variation font. Run, eg:
$ python mutator.py ./NotoSansArabic-GX.ttf wght=140 wdth=85
"""
from __future__ import print_function, division, absolute_import
from fontTools.misc.py23 import *
from fontTools.ttLib import TTFont
from fontTools.ttLib.tables._g_l_y_f import GlyphCoordinates
from fontTools.varLib import _GetCoordinates, _SetCoordinates
from fontTools.varLib.models import VariationModel, supportScalar, normalizeLocation
import os.path
def main(args=None):
if args is None:
import sys
args = sys.argv[1:]
varfilename = args[0]
locargs = args[1:]
outfile = os.path.splitext(varfilename)[0] + '-instance.ttf'
loc = {}
for arg in locargs:
tag,val = arg.split('=')
assert len(tag) <= 4
loc[tag.ljust(4)] = float(val)
print("Location:", loc)
print("Loading GX font")
varfont = TTFont(varfilename)
fvar = varfont['fvar']
axes = {a.axisTag:(a.minValue,a.defaultValue,a.maxValue) for a in fvar.axes}
# TODO Round to F2Dot14?
loc = normalizeLocation(loc, axes)
# Location is normalized now
print("Normalized location:", loc)
gvar = varfont['gvar']
for glyphname,variations in gvar.variations.items():
coordinates,_ = _GetCoordinates(varfont, glyphname)
for var in variations:
scalar = supportScalar(loc, var.axes)
if not scalar: continue
# TODO Do IUP / handle None items
coordinates += GlyphCoordinates(var.coordinates) * scalar
_SetCoordinates(varfont, glyphname, coordinates)
print("Removing GX tables")
for tag in ('fvar','avar','gvar'):
if tag in varfont:
del varfont[tag]
print("Saving instance font", outfile)
varfont.save(outfile)
if __name__ == "__main__":
import sys
if len(sys.argv) > 1:
sys.exit(main())
import doctest
sys.exit(doctest.testmod().failed)