instancer: remap STAT AxisValue.AxisIndex

if STAT table contains no DesignAxisRecord, then keep it empty and skip.
This commit is contained in:
Cosimo Lupo 2019-05-03 13:29:43 +01:00
parent aa6c9a1110
commit 3bfff09c8c
No known key found for this signature in database
GPG Key ID: 20D4A261E4A0E642

View File

@ -490,25 +490,38 @@ def instantiateSTAT(varfont, location):
pinnedAxes = set(location.keys()) pinnedAxes = set(location.keys())
stat = varfont["STAT"].table stat = varfont["STAT"].table
designAxes = stat.DesignAxisRecord.Axis if stat.DesignAxisRecord else () if not stat.DesignAxisRecord:
return # skip empty STAT table
designAxes = stat.DesignAxisRecord.Axis
pinnedAxisIndices = { pinnedAxisIndices = {
i for i, axis in enumerate(designAxes) if axis.AxisTag in pinnedAxes i for i, axis in enumerate(designAxes) if axis.AxisTag in pinnedAxes
} }
if len(pinnedAxisIndices) == stat.DesignAxisCount: if len(pinnedAxisIndices) == len(designAxes):
log.info("Dropping STAT table") log.info("Dropping STAT table")
del varfont["STAT"] del varfont["STAT"]
return return
log.info("Instantiating STAT table") log.info("Instantiating STAT table")
# only keep DesignAxis that were not instanced, a build a mapping from old
# to new axis indices
newDesignAxes = []
axisIndexMap = {}
for i, axis in enumerate(designAxes):
if i not in pinnedAxisIndices:
axisIndexMap[i] = len(newDesignAxes)
newDesignAxes.append(axis)
if stat.AxisValueArray and stat.AxisValueArray.AxisValue: if stat.AxisValueArray and stat.AxisValueArray.AxisValue:
# drop all AxisValue tables that reference any of the pinned axes
newAxisValueTables = [] newAxisValueTables = []
for axisValueTable in stat.AxisValueArray.AxisValue: for axisValueTable in stat.AxisValueArray.AxisValue:
if axisValueTable.Format in (1, 2, 3): if axisValueTable.Format in (1, 2, 3):
if axisValueTable.AxisIndex in pinnedAxisIndices: if axisValueTable.AxisIndex in pinnedAxisIndices:
continue continue
axisValueTable.AxisIndex = axisIndexMap[axisValueTable.AxisIndex]
newAxisValueTables.append(axisValueTable) newAxisValueTables.append(axisValueTable)
elif axisValueTable.Format == 4: elif axisValueTable.Format == 4:
if any( if any(
@ -516,15 +529,15 @@ def instantiateSTAT(varfont, location):
for rec in axisValueTable.AxisValueRecord for rec in axisValueTable.AxisValueRecord
): ):
continue continue
for rec in axisValueTable.AxisValueRecord:
rec.AxisIndex = axisIndexMap[rec.AxisIndex]
newAxisValueTables.append(axisValueTable) newAxisValueTables.append(axisValueTable)
else: else:
raise NotImplementedError(axisValueTable.Format) raise NotImplementedError(axisValueTable.Format)
stat.AxisValueArray.AxisValue = newAxisValueTables stat.AxisValueArray.AxisValue = newAxisValueTables
stat.AxisValueCount = len(stat.AxisValueArray.AxisValue) stat.AxisValueCount = len(stat.AxisValueArray.AxisValue)
stat.DesignAxisRecord.Axis[:] = [ stat.DesignAxisRecord.Axis[:] = newDesignAxes
axis for axis in designAxes if axis.AxisTag not in pinnedAxes
]
stat.DesignAxisCount = len(stat.DesignAxisRecord.Axis) stat.DesignAxisCount = len(stat.DesignAxisRecord.Axis)