diff --git a/Lib/fontTools/varLib/instancer.py b/Lib/fontTools/varLib/instancer.py index 624ec23e5..016073f5c 100644 --- a/Lib/fontTools/varLib/instancer.py +++ b/Lib/fontTools/varLib/instancer.py @@ -1124,13 +1124,24 @@ def normalizeAxisLimits(varfont, axisLimits, usingAvar=True): avarSegments = {} if usingAvar and "avar" in varfont: avarSegments = varfont["avar"].segments + + for axis_tag, (_, default, _) in axes.items(): + value = axisLimits[axis_tag] + if isinstance(value, tuple): + minV, maxV = value + if minV > default or maxV < default: + raise NotImplementedError( + f"Unsupported range {axis_tag}={minV:g}:{maxV:g}; " + f"can't change default position ({axis_tag}={default:g})" + ) + normalizedLimits = {} for axis_tag, triple in axes.items(): avarMapping = avarSegments.get(axis_tag, None) value = axisLimits[axis_tag] if isinstance(value, tuple): normalizedLimits[axis_tag] = NormalizedAxisRange( - *(normalize(v, triple, avarMapping) for v in axisLimits[axis_tag]) + *(normalize(v, triple, avarMapping) for v in value) ) else: normalizedLimits[axis_tag] = normalize(value, triple, avarMapping) @@ -1192,15 +1203,15 @@ def instantiateVariableFont( """ sanityCheckVariableTables(varfont) - if not inplace: - varfont = deepcopy(varfont) - axisLimits = populateAxisDefaults(varfont, axisLimits) normalizedLimits = normalizeAxisLimits(varfont, axisLimits) log.info("Normalized limits: %s", normalizedLimits) + if not inplace: + varfont = deepcopy(varfont) + if "gvar" in varfont: instantiateGvar(varfont, normalizedLimits, optimize=optimize) diff --git a/Tests/varLib/instancer_test.py b/Tests/varLib/instancer_test.py index d15742297..3421b1165 100644 --- a/Tests/varLib/instancer_test.py +++ b/Tests/varLib/instancer_test.py @@ -1852,6 +1852,11 @@ def test_normalizeAxisLimits_tuple(varfont): assert normalized == {"wght": (-1.0, 0)} +def test_normalizeAxisLimits_unsupported_range(varfont): + with pytest.raises(NotImplementedError, match="Unsupported range"): + instancer.normalizeAxisLimits(varfont, {"wght": (401, 700)}) + + def test_normalizeAxisLimits_no_avar(varfont): del varfont["avar"]