instancer: drop STAT DesignAxes and AxisValues for pinned axes

This commit is contained in:
Cosimo Lupo 2019-05-01 19:25:32 +01:00
parent b8a33d0c75
commit aa6c9a1110
No known key found for this signature in database
GPG Key ID: 20D4A261E4A0E642

View File

@ -486,6 +486,48 @@ def instantiateFvar(varfont, location):
fvar.instances = instances fvar.instances = instances
def instantiateSTAT(varfont, location):
pinnedAxes = set(location.keys())
stat = varfont["STAT"].table
designAxes = stat.DesignAxisRecord.Axis if stat.DesignAxisRecord else ()
pinnedAxisIndices = {
i for i, axis in enumerate(designAxes) if axis.AxisTag in pinnedAxes
}
if len(pinnedAxisIndices) == stat.DesignAxisCount:
log.info("Dropping STAT table")
del varfont["STAT"]
return
log.info("Instantiating STAT table")
if stat.AxisValueArray and stat.AxisValueArray.AxisValue:
newAxisValueTables = []
for axisValueTable in stat.AxisValueArray.AxisValue:
if axisValueTable.Format in (1, 2, 3):
if axisValueTable.AxisIndex in pinnedAxisIndices:
continue
newAxisValueTables.append(axisValueTable)
elif axisValueTable.Format == 4:
if any(
rec.AxisIndex in pinnedAxisIndices
for rec in axisValueTable.AxisValueRecord
):
continue
newAxisValueTables.append(axisValueTable)
else:
raise NotImplementedError(axisValueTable.Format)
stat.AxisValueArray.AxisValue = newAxisValueTables
stat.AxisValueCount = len(stat.AxisValueArray.AxisValue)
stat.DesignAxisRecord.Axis[:] = [
axis for axis in designAxes if axis.AxisTag not in pinnedAxes
]
stat.DesignAxisCount = len(stat.DesignAxisRecord.Axis)
def normalize(value, triple, avar_mapping): def normalize(value, triple, avar_mapping):
value = normalizeValue(value, triple) value = normalizeValue(value, triple)
if avar_mapping: if avar_mapping:
@ -568,16 +610,10 @@ def instantiateVariableFont(varfont, axis_limits, inplace=False, optimize=True):
if "avar" in varfont: if "avar" in varfont:
instantiateAvar(varfont, normalized_limits) instantiateAvar(varfont, normalized_limits)
instantiateFvar(varfont, axis_limits) if "STAT" in varfont:
instantiateSTAT(varfont, axis_limits)
if "fvar" not in varfont and "STAT" in varfont: instantiateFvar(varfont, axis_limits)
# Drop the entire STAT table when the varfont is fully instanced (or keep it
# as is if only partially instanced).
# TODO(anthrotype) Only drop DesignAxis and corresponding AxisValue records
# for the pinned axes that were removed from fvar. STAT design axes may be a
# superset of fvar axes (e.g. can include axes for an entire family).
log.info("Dropping STAT table")
del varfont["STAT"]
return varfont return varfont