From 6533feeeac10db0c06bae336d757a9b63f2332f0 Mon Sep 17 00:00:00 2001 From: Marc Foley Date: Mon, 28 Feb 2022 11:52:20 +0000 Subject: [PATCH] ufo-fix-instances: added --- bin/gftools-ufo-fix-instances.py | 55 ++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100755 bin/gftools-ufo-fix-instances.py diff --git a/bin/gftools-ufo-fix-instances.py b/bin/gftools-ufo-fix-instances.py new file mode 100755 index 000000000..d3cb4c427 --- /dev/null +++ b/bin/gftools-ufo-fix-instances.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +""" +Fix designspace instances so they are gf spec complaint: +https://github.com/googlefonts/gf-docs/tree/main/Spec#fvar-instances + +Usage: + +gftools ufo-fix-instances family.designspace +""" +from fontTools.designspaceLib import DesignSpaceDocument, InstanceDescriptor +from copy import deepcopy +from gftools.fix import WEIGHT_VALUES +import sys + + +def build_instances(ds): + """Generate Designspace instances which are gf spec complaint""" + instances = [] + axes = ds.axes + wght_axis = next((a for a in axes if a.tag == "wght"), None) + wght_vals = list(range(int(wght_axis.minimum), int(wght_axis.maximum + 100), 100)) + italic_axis = next((a for a in axes if a.tag in ["slnt", "ital"]), None) + for wght in wght_vals: + inst = InstanceDescriptor() + coords = {a.tag: a.default for a in axes} + coords["wght"] = float(wght) + inst.location = coords + inst.styleName = WEIGHT_VALUES[wght] + instances.append(inst) + + if italic_axis: + italics = deepcopy(instances) + for inst in italics: + inst.styleName = f"{inst.styleName} Italic".replace( + "Regular Italic", "Italic" + ) + inst.location[italic_axis.tag] = italic_axis.minimum + instances += italics + return instances + + +def main(): + if len(sys.argv) != 2: + print(__doc__) + return + ds_path = sys.argv[1] + ds = DesignSpaceDocument() + ds.read(ds_path) + instances = build_instances(ds) + ds.instances = instances + ds.write(ds_path) + + +if __name__ == "__main__": + main()