From 952fe9b059aefdb86b7990736a7a51793fdb97a3 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Fri, 14 Jun 2019 14:34:47 +0100 Subject: [PATCH] instancer: refactor _instantiateFeatureVariations to avoid too deep nesting https://github.com/fonttools/fonttools/pull/1628#discussion_r292600019 --- Lib/fontTools/varLib/instancer.py | 73 ++++++++++++++++++------------- 1 file changed, 43 insertions(+), 30 deletions(-) diff --git a/Lib/fontTools/varLib/instancer.py b/Lib/fontTools/varLib/instancer.py index 1c7e32050..27606fa89 100644 --- a/Lib/fontTools/varLib/instancer.py +++ b/Lib/fontTools/varLib/instancer.py @@ -529,6 +529,45 @@ def _featureVariationRecordIsUnique(rec, seen): 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): pinnedAxes = set(location.keys()) axisOrder = [axis.axisTag for axis in fvarAxes if axis.axisTag not in pinnedAxes] @@ -539,36 +578,10 @@ def _instantiateFeatureVariations(table, fvarAxes, location): newRecords = [] for i, record in enumerate(table.FeatureVariations.FeatureVariationRecord): - retainRecord = True - applies = True - newConditions = [] - for j, condition in enumerate(record.ConditionSet.ConditionTable): - 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 + applies, shouldKeep = _instantiateFeatureVariationRecord( + record, i, location, fvarAxes, axisIndexMap + ) + if shouldKeep: if _featureVariationRecordIsUnique(record, uniqueRecords): newRecords.append(record)