aboutsummaryrefslogtreecommitdiff
path: root/Lib/fontTools/varLib/interpolate_layout.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/fontTools/varLib/interpolate_layout.py')
-rw-r--r--Lib/fontTools/varLib/interpolate_layout.py173
1 files changed, 96 insertions, 77 deletions
diff --git a/Lib/fontTools/varLib/interpolate_layout.py b/Lib/fontTools/varLib/interpolate_layout.py
index 6d0385dd..aa3f49c6 100644
--- a/Lib/fontTools/varLib/interpolate_layout.py
+++ b/Lib/fontTools/varLib/interpolate_layout.py
@@ -12,93 +12,112 @@ from pprint import pformat
log = logging.getLogger("fontTools.varLib.interpolate_layout")
-def interpolate_layout(designspace, loc, master_finder=lambda s:s, mapped=False):
- """
- 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).
-
- If mapped is False (default), then location is mapped using the
- map element of the axes in designspace file. If mapped is True,
- it is assumed that location is in designspace's internal space and
- no mapping is performed.
- """
- if hasattr(designspace, "sources"): # Assume a DesignspaceDocument
- pass
- else: # Assume a file path
- from fontTools.designspaceLib import DesignSpaceDocument
- designspace = DesignSpaceDocument.fromfile(designspace)
-
- ds = load_designspace(designspace)
- log.info("Building interpolated font")
-
- log.info("Loading master fonts")
- master_fonts = load_masters(designspace, master_finder)
- font = deepcopy(master_fonts[ds.base_idx])
-
- log.info("Location: %s", pformat(loc))
- if not mapped:
- loc = {name: ds.axes[name].map_forward(v) for name,v in loc.items()}
- log.info("Internal location: %s", pformat(loc))
- loc = models.normalizeLocation(loc, ds.internal_axis_supports)
- log.info("Normalized location: %s", pformat(loc))
-
- # Assume single-model for now.
- model = models.VariationModel(ds.normalized_master_locs)
- assert 0 == model.mapping[ds.base_idx]
-
- merger = InstancerMerger(font, model, loc)
-
- log.info("Building interpolated tables")
- # TODO GSUB/GDEF
- merger.mergeTables(font, master_fonts, ['GPOS'])
- return font
+def interpolate_layout(designspace, loc, master_finder=lambda s: s, mapped=False):
+ """
+ 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).
-def main(args=None):
- """Interpolate GDEF/GPOS/GSUB tables for a point on a designspace"""
- from fontTools import configLogger
- import argparse
- import sys
+ If mapped is False (default), then location is mapped using the
+ map element of the axes in designspace file. If mapped is True,
+ it is assumed that location is in designspace's internal space and
+ no mapping is performed.
+ """
+ if hasattr(designspace, "sources"): # Assume a DesignspaceDocument
+ pass
+ else: # Assume a file path
+ from fontTools.designspaceLib import DesignSpaceDocument
+
+ designspace = DesignSpaceDocument.fromfile(designspace)
- parser = argparse.ArgumentParser(
- "fonttools varLib.interpolate_layout",
- description=main.__doc__,
- )
- parser.add_argument('designspace_filename', metavar='DESIGNSPACE',
- help="Input TTF files")
- parser.add_argument('locations', metavar='LOCATION', type=str, nargs='+',
- help="Axis locations (e.g. wdth=120")
- parser.add_argument('-o', '--output', metavar='OUTPUT',
- help="Output font file (defaults to <designspacename>-instance.ttf)")
- parser.add_argument('-l', '--loglevel', metavar='LEVEL', default="INFO",
- help="Logging level (defaults to INFO)")
+ ds = load_designspace(designspace)
+ log.info("Building interpolated font")
+ log.info("Loading master fonts")
+ master_fonts = load_masters(designspace, master_finder)
+ font = deepcopy(master_fonts[ds.base_idx])
- args = parser.parse_args(args)
+ log.info("Location: %s", pformat(loc))
+ if not mapped:
+ loc = {name: ds.axes[name].map_forward(v) for name, v in loc.items()}
+ log.info("Internal location: %s", pformat(loc))
+ loc = models.normalizeLocation(loc, ds.internal_axis_supports)
+ log.info("Normalized location: %s", pformat(loc))
- if not args.output:
- args.output = os.path.splitext(args.designspace_filename)[0] + '-instance.ttf'
+ # Assume single-model for now.
+ model = models.VariationModel(ds.normalized_master_locs)
+ assert 0 == model.mapping[ds.base_idx]
- configLogger(level=args.loglevel)
+ merger = InstancerMerger(font, model, loc)
- finder = lambda s: s.replace('master_ufo', 'master_ttf_interpolatable').replace('.ufo', '.ttf')
+ log.info("Building interpolated tables")
+ # TODO GSUB/GDEF
+ merger.mergeTables(font, master_fonts, ["GPOS"])
+ return font
- loc = {}
- for arg in args.locations:
- tag,val = arg.split('=')
- loc[tag] = float(val)
- font = interpolate_layout(args.designspace_filename, loc, finder)
- log.info("Saving font %s", args.output)
- font.save(args.output)
+def main(args=None):
+ """Interpolate GDEF/GPOS/GSUB tables for a point on a designspace"""
+ from fontTools import configLogger
+ import argparse
+ import sys
+
+ parser = argparse.ArgumentParser(
+ "fonttools varLib.interpolate_layout",
+ description=main.__doc__,
+ )
+ parser.add_argument(
+ "designspace_filename", metavar="DESIGNSPACE", help="Input TTF files"
+ )
+ parser.add_argument(
+ "locations",
+ metavar="LOCATION",
+ type=str,
+ nargs="+",
+ help="Axis locations (e.g. wdth=120",
+ )
+ parser.add_argument(
+ "-o",
+ "--output",
+ metavar="OUTPUT",
+ help="Output font file (defaults to <designspacename>-instance.ttf)",
+ )
+ parser.add_argument(
+ "-l",
+ "--loglevel",
+ metavar="LEVEL",
+ default="INFO",
+ help="Logging level (defaults to INFO)",
+ )
+
+ args = parser.parse_args(args)
+
+ if not args.output:
+ args.output = os.path.splitext(args.designspace_filename)[0] + "-instance.ttf"
+
+ configLogger(level=args.loglevel)
+
+ finder = lambda s: s.replace("master_ufo", "master_ttf_interpolatable").replace(
+ ".ufo", ".ttf"
+ )
+
+ loc = {}
+ for arg in args.locations:
+ tag, val = arg.split("=")
+ loc[tag] = float(val)
+
+ font = interpolate_layout(args.designspace_filename, loc, finder)
+ log.info("Saving font %s", args.output)
+ font.save(args.output)
if __name__ == "__main__":
- import sys
- if len(sys.argv) > 1:
- sys.exit(main())
- import doctest
- sys.exit(doctest.testmod().failed)
+ import sys
+
+ if len(sys.argv) > 1:
+ sys.exit(main())
+ import doctest
+
+ sys.exit(doctest.testmod().failed)