instancer: sort axisValues so format 4 are dominant for constructing names

This commit is contained in:
Marc Foley 2020-10-12 12:37:11 +01:00
parent 0b639c2979
commit 69c8667982
2 changed files with 50 additions and 2 deletions

View File

@ -1366,8 +1366,29 @@ def axisValuesFromAxisLimits(stat, axisLimits):
raise ValueError(f"Cannot find AxisValue for {', '.join(missing)}")
# filter out Elidable axisValues
axisValues = [a for a in axisValues if a.Flags & ELIDABLE_AXIS_VALUE_NAME != 2]
# TODO sort and remove duplicates so format 4 axisValues are dominant
return axisValues
return sortedAxisValues(axisValues)
def sortedAxisValues(axisValues):
# Sort and remove duplicates so format 4 axisValues are dominant
results, seenAxes = [], set()
format4 = sorted(
[a for a in axisValues if a.Format == 4],
key=lambda k: len(k.AxisValueRecord), reverse=True
)
nonFormat4 = [a for a in axisValues if a not in format4]
for axisValue in format4:
axes = set([r.AxisIndex for r in axisValue.AxisValueRecord])
if seenAxes - axes == seenAxes:
seenAxes |= axes
results.append((tuple(axes), axisValue))
for axisValue in nonFormat4:
axisIndex = axisValue.AxisIndex
if axisIndex not in seenAxes:
results.append(((axisIndex,), axisValue))
return [v for k, v in sorted(results)]
def updateNameTable(varfont, axisLimits):

View File

@ -2032,6 +2032,33 @@ def test_updateNameTable_vf_with_italic_attribute(varfont):
assert names[(17, 3, 1, 0x409)] == "Black Condensed Italic"
def test_updateNameTable_format4_axisValues(varfont):
# format 4 axisValues should dominate the other axisValues
stat = varfont["STAT"].table
axisValue = otTables.AxisValue()
axisValue.Format = 4
axisValue.Flags = 0
varfont["name"].setName("Dominant Value", 297, 3, 1, 0x409)
axisValue.ValueNameID = 297
axisValue.AxisValueRecord = []
for tag, value in (("wght", 900), ("wdth", 79)):
rec = otTables.AxisValueRecord()
rec.AxisIndex = next(
i for i, a in enumerate(stat.DesignAxisRecord.Axis) if a.AxisTag == tag
)
rec.Value = value
axisValue.AxisValueRecord.append(rec)
stat.AxisValueArray.AxisValue.append(axisValue)
instancer.updateNameTable(varfont, {"wdth": 79, "wght": 900})
names = _get_name_records(varfont)
assert names[(1, 3, 1, 0x409)] == "Test Variable Font Dominant Value"
assert names[(2, 3, 1, 0x409)] == "Regular"
assert names[(16, 3, 1, 0x409)] == "Test Variable Font"
assert names[(17, 3, 1, 0x409)] == "Dominant Value"
def test_sanityCheckVariableTables(varfont):
font = ttLib.TTFont()
with pytest.raises(ValueError, match="Missing required table fvar"):