[instancer] Check if an axis has values before requiring it to be found (#3319)

* Check if an axis has values before requiring it to be found

* Add test
This commit is contained in:
Simon Cozens 2023-10-31 08:21:34 +00:00 committed by GitHub
parent 52414cc5f1
commit 49570c3599
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 1 deletions

View File

@ -134,6 +134,14 @@ def updateNameTable(varfont, axisLimits):
def checkAxisValuesExist(stat, axisValues, axisCoords): def checkAxisValuesExist(stat, axisValues, axisCoords):
seen = set() seen = set()
designAxes = stat.DesignAxisRecord.Axis designAxes = stat.DesignAxisRecord.Axis
hasValues = set()
for value in stat.AxisValueArray.AxisValue:
if value.Format in (1, 2, 3):
hasValues.add(designAxes[value.AxisIndex].AxisTag)
elif value.Format == 4:
for rec in value.AxisValueRecord:
hasValues.add(designAxes[rec.AxisIndex].AxisTag)
for axisValueTable in axisValues: for axisValueTable in axisValues:
axisValueFormat = axisValueTable.Format axisValueFormat = axisValueTable.Format
if axisValueTable.Format in (1, 2, 3): if axisValueTable.Format in (1, 2, 3):
@ -150,7 +158,7 @@ def checkAxisValuesExist(stat, axisValues, axisCoords):
if axisTag in axisCoords and rec.Value == axisCoords[axisTag]: if axisTag in axisCoords and rec.Value == axisCoords[axisTag]:
seen.add(axisTag) seen.add(axisTag)
missingAxes = set(axisCoords) - seen missingAxes = (set(axisCoords) - seen) & hasValues
if missingAxes: if missingAxes:
missing = ", ".join(f"'{i}': {axisCoords[i]}" for i in missingAxes) missing = ", ".join(f"'{i}': {axisCoords[i]}" for i in missingAxes)
raise ValueError(f"Cannot find Axis Values {{{missing}}}") raise ValueError(f"Cannot find Axis Values {{{missing}}}")

View File

@ -333,3 +333,21 @@ def test_updateNameTable_existing_subfamily_name_is_not_regular(varfont):
instancer.names.updateNameTable(varfont, {"wght": 100}) instancer.names.updateNameTable(varfont, {"wght": 100})
expected = {(2, 3, 1, 0x409): "Regular", (17, 3, 1, 0x409): "Thin"} expected = {(2, 3, 1, 0x409): "Regular", (17, 3, 1, 0x409): "Thin"}
_test_name_records(varfont, expected, isNonRIBBI=True) _test_name_records(varfont, expected, isNonRIBBI=True)
def test_name_irrelevant_axes(varfont):
# Cannot update name table if not on a named axis value location
with pytest.raises(ValueError) as excinfo:
location = {"wght": 400, "wdth": 90}
instance = instancer.instantiateVariableFont(
varfont, location, updateFontNames=True
)
assert "Cannot find Axis Values" in str(excinfo.value)
# Now let's make the wdth axis "irrelevant" to naming (no axis values)
varfont["STAT"].table.AxisValueArray.AxisValue.pop(6)
varfont["STAT"].table.AxisValueArray.AxisValue.pop(4)
location = {"wght": 400, "wdth": 90}
instance = instancer.instantiateVariableFont(
varfont, location, updateFontNames=True
)