""" Interpolate OpenType Layout tables (GDEF / GPOS / GSUB). """ from __future__ import print_function, division, absolute_import from fontTools.misc.py23 import * from fontTools.ttLib import TTFont from fontTools.varLib import models, VarLibError, load_designspace from fontTools.varLib.merger import InstancerMerger import os.path import logging from pprint import pformat log = logging.getLogger("fontTools.varLib.interpolate_layout") def interpolate_layout(designspace_filename, loc, master_finder=lambda s:s): """ Interpolate GPOS from a designspace file and location. If master_finder is set, it should be a callable that takes master filename as found in designspace file and map it to master font binary as to be opened (eg. .ttf or .otf). """ axes, internal_axis_supports, base_idx, normalized_master_locs, masters, instances = load_designspace(designspace_filename) log.info("Building interpolated font") log.info("Loading master fonts") basedir = os.path.dirname(designspace_filename) master_ttfs = [master_finder(os.path.join(basedir, m['filename'])) for m in masters] master_fonts = [TTFont(ttf_path) for ttf_path in master_ttfs] #font = master_fonts[base_idx] font = TTFont(master_ttfs[base_idx]) log.info("Location: %s", pformat(loc)) loc = {name:axes[name].map_forward(v) for name,v in loc.items()} log.info("Internal location: %s", pformat(loc)) loc = models.normalizeLocation(loc, internal_axis_supports) log.info("Normalized location: %s", pformat(loc)) # Assume single-model for now. model = models.VariationModel(normalized_master_locs) assert 0 == model.mapping[base_idx] merger = InstancerMerger(font, model, loc) log.info("Building interpolated tables") merger.mergeTables(font, master_fonts, ['GPOS']) return font def main(args=None): from fontTools import configLogger import sys if args is None: args = sys.argv[1:] designspace_filename = args[0] locargs = args[1:] outfile = os.path.splitext(designspace_filename)[0] + '-instance.ttf' # TODO: allow user to configure logging via command-line options configLogger(level="INFO") finder = lambda s: s.replace('master_ufo', 'master_ttf_interpolatable').replace('.ufo', '.ttf') loc = {} for arg in locargs: tag,val = arg.split('=') loc[tag] = float(val) font = interpolate_layout(designspace_filename, loc, finder) log.info("Saving font %s", outfile) font.save(outfile) if __name__ == "__main__": import sys if len(sys.argv) > 1: sys.exit(main()) import doctest sys.exit(doctest.testmod().failed)