summaryrefslogtreecommitdiff
path: root/misc/tools/gen-var-designspace.py
diff options
context:
space:
mode:
authorRasmus Andersson <rasmus@notion.se>2023-05-29 20:05:47 +0300
committerRasmus Andersson <rasmus@notion.se>2023-05-29 20:05:51 +0300
commite12027c4c107731fd33823578fd7ca5107d38b8f (patch)
treed434280c67931a18bd613644ff2ab3c9441c6533 /misc/tools/gen-var-designspace.py
parenta2d84eb0eaacc1330ab1353d89e79c88c9716ecc (diff)
downloadinter-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.py68
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)