diff options
author | shumkovnd <shumkovnd@yandex-team.com> | 2023-11-10 14:39:34 +0300 |
---|---|---|
committer | shumkovnd <shumkovnd@yandex-team.com> | 2023-11-10 16:42:24 +0300 |
commit | 77eb2d3fdcec5c978c64e025ced2764c57c00285 (patch) | |
tree | c51edb0748ca8d4a08d7c7323312c27ba1a8b79a /contrib/python/fonttools/fontTools/varLib/interpolate_layout.py | |
parent | dd6d20cadb65582270ac23f4b3b14ae189704b9d (diff) | |
download | ydb-77eb2d3fdcec5c978c64e025ced2764c57c00285.tar.gz |
KIKIMR-19287: add task_stats_drawing script
Diffstat (limited to 'contrib/python/fonttools/fontTools/varLib/interpolate_layout.py')
-rw-r--r-- | contrib/python/fonttools/fontTools/varLib/interpolate_layout.py | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/contrib/python/fonttools/fontTools/varLib/interpolate_layout.py b/contrib/python/fonttools/fontTools/varLib/interpolate_layout.py new file mode 100644 index 0000000000..aa3f49c6ed --- /dev/null +++ b/contrib/python/fonttools/fontTools/varLib/interpolate_layout.py @@ -0,0 +1,123 @@ +""" +Interpolate OpenType Layout tables (GDEF / GPOS / GSUB). +""" +from fontTools.ttLib import TTFont +from fontTools.varLib import models, VarLibError, load_designspace, load_masters +from fontTools.varLib.merger import InstancerMerger +import os.path +import logging +from copy import deepcopy +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 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) |