Refactor axisValuesFromAxisLimits

This commit is contained in:
Marc Foley 2020-10-09 13:00:23 +01:00
parent 78f6c2ae75
commit 2fd934051b

View File

@ -1298,64 +1298,59 @@ def instantiateVariableFont(
return varfont return varfont
def axisValueIsSelected(axisValue, seeker):
if axisValue.Format == 4:
res = []
for rec in axisValue.AxisValueRecord:
axisIndex = rec.AxisIndex
if axisIndex not in seeker:
return False
if rec.Value == seeker[axisIndex]:
res.append(True)
else:
res.append(False)
return True if all(res) else False
axisIndex = axisValue.AxisIndex
if axisIndex not in seeker:
return False
if axisValue.Format in (1, 3):
# Add axisValue if it's used to link to another variable font
if axisIndex not in seeker and axisValue.Value == 1.0:
return True
elif axisValue.Value == seeker[axisIndex]:
return True
if axisValue.Format == 2:
return True if all([
seeker[axisIndex] >= axisValue.RangeMinValue,
seeker[axisIndex] <= axisValue.RangeMaxValue
]) else False
return False
def axisValuesFromAxisLimits(stat, axisLimits): def axisValuesFromAxisLimits(stat, axisLimits):
axisRecords = stat.table.DesignAxisRecord.Axis
axisValues = stat.table.AxisValueArray.AxisValue axisValues = stat.table.AxisValueArray.AxisValue
axisRecords = stat.table.DesignAxisRecord.Axis
axisOrder = {a.AxisTag: a.AxisOrdering for a in axisRecords}
# Only check pinnedAxes for matching AxisValues
AxisValuesToFind = {
axisOrder[k]: v for k, v in axisLimits.items() \
if isinstance(v, (float, int))
}
format4 = [a for a in axisValues if a.Format == 4] axisValues = [a for a in axisValues if axisValueIsSelected(a, AxisValuesToFind)]
nonformat4 = [a for a in axisValues if a not in format4] axisValuesMissing = set(AxisValuesToFind) - set(a.AxisIndex for a in axisValues)
axisValues = format4 + nonformat4 if axisValuesMissing:
# TODO better error msg
axisOrder = {a.AxisOrdering: a.AxisTag for a in axisRecords} missing = [i for i in axisValuesMissing]
pinnedAxes = set(k for k, v in axisLimits.items() if isinstance(v, (float, int))) raise ValueError(f"Cannot find AxisValues for {missing}")
# filter out Elidable axisValues
results, seen_axes = [], set() axisValues = [a for a in axisValues if a.Flags != 2]
for axisValue in axisValues: # TODO sort and remove duplicates so format 4 axisValues are dominant
return axisValues
# Ignore axisValue if it has ELIDABLE_AXIS_VALUE_NAME flag enabled.
# Enabling this flag will hide the axisValue in application font menus.
# TODO this is too greedy! we need to retain wght axisValues
if axisValue.Flags == 2:
continue
if axisValue.Format == 4:
axisIndexes = set(r.AxisIndex for r in axisValue.AxisValueRecord)
if seen_axes - axisIndexes != seen_axes:
continue
# TODO fix dup appends
for rec in axisValue.AxisValueRecord:
axisTag = axisOrder[rec.AxisIndex]
if axisTag not in pinnedAxes:
continue
if rec.Value == axisLimits[axisTag]:
seen_axes.add(rec.AxisIndex)
results.append((rec.AxisIndex, axisValue))
elif axisValue.Format in (1, 3):
axisTag = axisOrder[axisValue.AxisIndex]
# Add axisValue if it's used to link to another variable font
if axisTag not in axisLimits and axisValue.Value == 1.0:
seen_axes.add(axisValue.AxisIndex)
results.append((axisValue.AxisIndex, axisValue))
if axisTag not in pinnedAxes:
continue
# Add axisValue if its value is in the axisLimits and the user has
# pinned the axis
elif axisValue.Value == axisLimits[axisTag]:
seen_axes.add(axisValue.AxisIndex)
results.append((axisValue.AxisIndex,axisValue))
elif axisValue.Format == 2:
axisTag = axisOrder[axisValue.AxisIndex]
if axisTag not in pinnedAxes:
continue
if axisLimits[axisTag] >= axisValue.RangeMinValue \
and axisLimits[axisTag] <= axisValue.RangeMaxValue:
seen_axes.add(axisValue.AxisIndex)
results.append((axisValue.AxisIndex, axisValue))
return [v for k, v in sorted(results)]
def updateNameTable(varfont, axisLimits): def updateNameTable(varfont, axisLimits):