summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRasmus Andersson <rasmus@notion.se>2020-08-20 04:01:47 +0300
committerRasmus Andersson <rasmus@notion.se>2020-08-20 04:01:47 +0300
commit3e89206f6a87fa83e5ca3eff00848a56c28e533c (patch)
treea806d8a0b86205c77c59c6310f212bc1f55bd4db
parent668c2fec5420842b50fcc8eaf6b13904cf705784 (diff)
downloadinter-3e89206f6a87fa83e5ca3eff00848a56c28e533c.tar.xz
tooling: improve STAT table patching. See issue #308
-rw-r--r--misc/fontbuildlib/stat.py78
1 files changed, 52 insertions, 26 deletions
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)