From 3e89206f6a87fa83e5ca3eff00848a56c28e533c Mon Sep 17 00:00:00 2001 From: Rasmus Andersson Date: Wed, 19 Aug 2020 18:01:47 -0700 Subject: tooling: improve STAT table patching. See issue #308 --- misc/fontbuildlib/stat.py | 78 +++++++++++++++++++++++++++++++---------------- 1 file changed, 52 insertions(+), 26 deletions(-) (limited to 'misc/fontbuildlib/stat.py') diff --git a/misc/fontbuildlib/stat.py b/misc/fontbuildlib/stat.py index 7fafb8a09..97638649d 100644 --- a/misc/fontbuildlib/stat.py +++ b/misc/fontbuildlib/stat.py @@ -7,42 +7,70 @@ from fontTools.otlLib.builder import buildStatTable OT_ELIDABLE_AXIS_VALUE_NAME = 0x0002 def rebuildStatTable(font, designspace): + # + # Changing this code? See discussion at https://github.com/rsms/inter/issues/308 + # if not 'fvar' in font: raise Exception('missing fvar table in font') axes = [dict(tag=a.axisTag, name=a.axisNameID) for a in font['fvar'].axes] - locations = None + + # isMultiAxis is true when compiling the multi-axis VF, + # false when compiling e.g. Inter-roman.var.ttf + isMultiAxis = False if len(axes) > 1: - # TODO: Compute locations automatically. - # Currently specific to Inter w/ hard-coded values. - locations = [ - { 'name': 'Regular', 'location': { 'wght': 400, 'slnt': 0 }, - 'flags': OT_ELIDABLE_AXIS_VALUE_NAME }, - { 'name': 'Italic', 'location': { 'wght': 400, 'slnt': -10.0 } }, - ] + isMultiAxis = True + axisTagToName = dict() for axis in designspace.axes: axisTagToName[axis.tag] = axis.name + weightAxisName = axisTagToName['wght'] slantAxisName = axisTagToName.get('slnt', 'Slant') - weightAxis = None - for a in axes: - if a['tag'] == 'wght': - weightAxis = a - break + regularWeightValueEntry = None + weightValues = [] + slantValues = [] + extremeSlantValue = 0 for instance in designspace.instances: - for axisName, value in instance.location.items(): - if axisName == slantAxisName: - # skip italic/oblique/slant - continue - weightValue = { - 'name': instance.styleName, - 'value': instance.location[weightAxisName], + weightValue = instance.location[weightAxisName] + slantValue = instance.location.get(slantAxisName, 0) + if slantValue != 0: + # slanted (we only make one entry: "Italic") + if isMultiAxis and weightValue == 400: + extremeSlantValue = slantValue + slantValues.append({ + 'name': instance.styleName, + 'value': slantValue, + }) + else: + # upright + v = { + 'name': instance.styleName, + 'value': weightValue, } - if weightValue['value'] == 400: - weightValue['flags'] = OT_ELIDABLE_AXIS_VALUE_NAME - weightValues.append(weightValue) - weightAxis['values'] = weightValues + if weightValue == 400: + v['flags'] = OT_ELIDABLE_AXIS_VALUE_NAME + v['linkedValue'] = 700 # style link to "Bold" + regularWeightValueEntry = v + weightValues.append(v) + + # "Regular" entry for the slant axis, linked with the "Italic" entry + if isMultiAxis: + slantValues.append({ + 'name': regularWeightValueEntry['name'], + 'value': 0, + 'flags': OT_ELIDABLE_AXIS_VALUE_NAME, + 'linkedValue': extremeSlantValue, + }) + + for a in axes: + tag = a['tag'] + if tag == 'wght': + a['values'] = weightValues + elif tag == 'slnt' and len(slantValues) > 0: + a['values'] = slantValues + + buildStatTable(font, axes) # axisNameToTag = dict() # for axis in designspace.axes: @@ -57,5 +85,3 @@ def rebuildStatTable(font, designspace): # if instance.styleName == "Regular": # loc['flags'] = OT_ELIDABLE_AXIS_VALUE_NAME # locations.append(loc) - - buildStatTable(font, axes, locations) -- cgit v1.2.3