instancer: remap STAT AxisValue.AxisIndex
if STAT table contains no DesignAxisRecord, then keep it empty and skip.
This commit is contained in:
parent
aa6c9a1110
commit
3bfff09c8c
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user