[instancer] udpdate OS/2 class and post.italicAngle when default moved (L4)

Previously we were only updating these when pinning wght/wdth/slnt axes.
Now we do whenever any of these axes defaults are changed, whether or not the axes are pinned or kept

Fixes https://github.com/fonttools/fonttools/issues/2885
This commit is contained in:
Cosimo Lupo 2022-11-09 16:33:16 +00:00
parent 12bf60aee0
commit dbc3b48879
No known key found for this signature in database
GPG Key ID: DF65A8A5A119C9A8
3 changed files with 20 additions and 2 deletions

View File

@ -257,6 +257,10 @@ class _BaseAxisLimits(Mapping[str, AxisTriple]):
def __str__(self) -> str:
return str(self._data)
def defaultLocation(self) -> Dict[str, float]:
"""Return a dict of default axis values."""
return {k: v.default for k, v in self.items()}
def pinnedLocation(self) -> Dict[str, float]:
"""Return a location dict with only the pinned axes."""
return {k: v.default for k, v in self.items() if v.minimum == v.maximum}
@ -1167,7 +1171,9 @@ def instantiateVariableFont(
ignoreErrors=(overlap == OverlapMode.REMOVE_AND_IGNORE_ERRORS),
)
varLib.set_default_weight_width_slant(varfont, location=axisLimits.pinnedLocation())
varLib.set_default_weight_width_slant(
varfont, location=axisLimits.defaultLocation()
)
if updateFontNames:
# Set Regular/Italic/Bold/Bold Italic bits as appropriate, after the

View File

@ -115,7 +115,7 @@ def updateNameTable(varfont, axisLimits):
# If we're instantiating a partial font, we will populate the unpinned
# axes with their default axis values from fvar.
axisLimits = AxisLimits(axisLimits).populateDefaults(varfont)
partialDefaults = {k: v.default for k, v in axisLimits.items()}
partialDefaults = axisLimits.defaultLocation()
fvarDefaults = {a.axisTag: a.defaultValue for a in fvar.axes}
defaultAxisCoords = AxisLimits({**fvarDefaults, **partialDefaults})
assert all(v.minimum == v.maximum for v in defaultAxisCoords.values())

View File

@ -1502,6 +1502,18 @@ class InstantiateVariableFontTest(object):
assert _dump_ttx(instance) == expected
def test_move_weight_width_axis_default(self, varfont2):
# https://github.com/fonttools/fonttools/issues/2885
assert varfont2["OS/2"].usWeightClass == 400
assert varfont2["OS/2"].usWidthClass == 5
varfont = instancer.instantiateVariableFont(
varfont2, {"wght": (100, 500, 900), "wdth": 87.5}
)
assert varfont["OS/2"].usWeightClass == 500
assert varfont["OS/2"].usWidthClass == 4
@pytest.mark.parametrize(
"overlap, wght",
[