diff options
author | Rasmus Andersson <rasmus@notion.se> | 2023-05-29 20:05:47 +0300 |
---|---|---|
committer | Rasmus Andersson <rasmus@notion.se> | 2023-05-29 20:05:51 +0300 |
commit | e12027c4c107731fd33823578fd7ca5107d38b8f (patch) | |
tree | d434280c67931a18bd613644ff2ab3c9441c6533 /misc/tools/gen-var-designspace.py | |
parent | a2d84eb0eaacc1330ab1353d89e79c88c9716ecc (diff) | |
download | inter-e12027c4c107731fd33823578fd7ca5107d38b8f.tar.xz |
Remove "Display" named-instances from variable font
A lot of software gets confused when there are named instances that differ
only by opsz. This change removes all "Display" instances from the fvar table
and makes opsz=32 the default, so that software without automatic opsz-to-size
mapping displays the "Display" styles instead of the text styles by default.
This is the same approach taken by Apple San Francisco Pro.
Closes #519
Diffstat (limited to 'misc/tools/gen-var-designspace.py')
-rw-r--r-- | misc/tools/gen-var-designspace.py | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/misc/tools/gen-var-designspace.py b/misc/tools/gen-var-designspace.py new file mode 100644 index 000000000..7b3e4b757 --- /dev/null +++ b/misc/tools/gen-var-designspace.py @@ -0,0 +1,68 @@ +import sys, argparse, re +from fontTools.designspaceLib import DesignSpaceDocument + + +WHITESPACE_RE = re.compile(r'\s+') + + +def remove_whitespace(s): + return WHITESPACE_RE.sub("", s) + + +def fixup_instances_text(designspace): + # makes the "text" (non-display) instances the default ones + i = len(designspace.instances) + while i > 0: + i -= 1 + instance = designspace.instances[i] + if instance.name.find('Inter Display') != -1: + del designspace.instances[i] + + +def fixup_instances_display(designspace): + # makes the display instances the default ones + i = len(designspace.instances) + while i > 0: + i -= 1 + instance = designspace.instances[i] + if instance.name.find('Inter Display') != -1: + if instance.styleName == 'Display': + instance.styleName = 'Regular' + else: + instance.styleName = instance.styleName.replace('Display ', '') + else: + del designspace.instances[i] + # change default opsz value + for a in designspace.axes: + if a.tag == "opsz": + a.default = a.maximum + break + + +def fixup_postscript_instance_names(designspace): + # make sure there are PostScript names assigned (fontmake does not create these) + psFamilyName = remove_whitespace(designspace.instances[0].familyName) + for instance in designspace.instances: + instance.postScriptFontName = psFamilyName + remove_whitespace(instance.styleName) + + +def main(argv): + ap = argparse.ArgumentParser(description= + 'Generate designspace file for variable font from generic designspace file') + ap.add_argument("input_designspace", help="Path to generic designspace file") + ap.add_argument("output_designspace", help="Path for output designspace file") + + args = ap.parse_args() + + designspace = DesignSpaceDocument.fromfile(args.input_designspace) + + # fixup_instances_text(designspace) + fixup_instances_display(designspace) + + fixup_postscript_instance_names(designspace) + + designspace.write(args.output_designspace) + + +if __name__ == '__main__': + main(sys.argv) |