instancer: refactor _instantiateFeatureVariations to avoid too deep nesting

https://github.com/fonttools/fonttools/pull/1628#discussion_r292600019
This commit is contained in:
Cosimo Lupo 2019-06-14 14:34:47 +01:00
parent 29daa994f0
commit 952fe9b059
No known key found for this signature in database
GPG Key ID: 20D4A261E4A0E642

View File

@ -529,6 +529,45 @@ def _featureVariationRecordIsUnique(rec, seen):
return True return True
def _instantiateFeatureVariationRecord(
record, recIdx, location, fvarAxes, axisIndexMap
):
shouldKeep = False
applies = True
newConditions = []
for i, condition in enumerate(record.ConditionSet.ConditionTable):
if condition.Format == 1:
axisIdx = condition.AxisIndex
axisTag = fvarAxes[axisIdx].axisTag
if axisTag in location:
minValue = condition.FilterRangeMinValue
maxValue = condition.FilterRangeMaxValue
v = location[axisTag]
if not (minValue <= v <= maxValue):
# condition not met so remove entire record
applies = False
newConditions = None
break
else:
# axis not pinned, keep condition with remapped axis index
applies = False
condition.AxisIndex = axisIndexMap[axisTag]
newConditions.append(condition)
else:
log.warning(
"Condition table {0} of FeatureVariationRecord {1} has "
"unsupported format ({2}); ignored".format(i, recIdx, condition.Format)
)
applies = False
newConditions.append(condition)
if newConditions:
record.ConditionSet.ConditionTable = newConditions
shouldKeep = True
return applies, shouldKeep
def _instantiateFeatureVariations(table, fvarAxes, location): def _instantiateFeatureVariations(table, fvarAxes, location):
pinnedAxes = set(location.keys()) pinnedAxes = set(location.keys())
axisOrder = [axis.axisTag for axis in fvarAxes if axis.axisTag not in pinnedAxes] axisOrder = [axis.axisTag for axis in fvarAxes if axis.axisTag not in pinnedAxes]
@ -539,36 +578,10 @@ def _instantiateFeatureVariations(table, fvarAxes, location):
newRecords = [] newRecords = []
for i, record in enumerate(table.FeatureVariations.FeatureVariationRecord): for i, record in enumerate(table.FeatureVariations.FeatureVariationRecord):
retainRecord = True applies, shouldKeep = _instantiateFeatureVariationRecord(
applies = True record, i, location, fvarAxes, axisIndexMap
newConditions = [] )
for j, condition in enumerate(record.ConditionSet.ConditionTable): if shouldKeep:
if condition.Format == 1:
axisIdx = condition.AxisIndex
axisTag = fvarAxes[axisIdx].axisTag
if axisTag in pinnedAxes:
minValue = condition.FilterRangeMinValue
maxValue = condition.FilterRangeMaxValue
v = location[axisTag]
if not (minValue <= v <= maxValue):
# condition not met so remove entire record
retainRecord = applies = False
break
else:
# axis not pinned, keep condition with remapped axis index
applies = False
condition.AxisIndex = axisIndexMap[axisTag]
newConditions.append(condition)
else:
log.warning(
"Condition table {0} of FeatureVariationRecord {1} has "
"unsupported format ({2}); ignored".format(j, i, condition.Format)
)
applies = False
newConditions.append(condition)
if retainRecord and newConditions:
record.ConditionSet.ConditionTable = newConditions
if _featureVariationRecordIsUnique(record, uniqueRecords): if _featureVariationRecordIsUnique(record, uniqueRecords):
newRecords.append(record) newRecords.append(record)