instancer: catch early if input range doesn't include current default

This commit is contained in:
Cosimo Lupo 2019-11-15 19:02:12 +00:00
parent 6142825d7b
commit 12e1a6de37
No known key found for this signature in database
GPG Key ID: 20D4A261E4A0E642
2 changed files with 20 additions and 4 deletions

View File

@ -1124,13 +1124,24 @@ def normalizeAxisLimits(varfont, axisLimits, usingAvar=True):
avarSegments = {} avarSegments = {}
if usingAvar and "avar" in varfont: if usingAvar and "avar" in varfont:
avarSegments = varfont["avar"].segments 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 = {} normalizedLimits = {}
for axis_tag, triple in axes.items(): for axis_tag, triple in axes.items():
avarMapping = avarSegments.get(axis_tag, None) avarMapping = avarSegments.get(axis_tag, None)
value = axisLimits[axis_tag] value = axisLimits[axis_tag]
if isinstance(value, tuple): if isinstance(value, tuple):
normalizedLimits[axis_tag] = NormalizedAxisRange( normalizedLimits[axis_tag] = NormalizedAxisRange(
*(normalize(v, triple, avarMapping) for v in axisLimits[axis_tag]) *(normalize(v, triple, avarMapping) for v in value)
) )
else: else:
normalizedLimits[axis_tag] = normalize(value, triple, avarMapping) normalizedLimits[axis_tag] = normalize(value, triple, avarMapping)
@ -1192,15 +1203,15 @@ def instantiateVariableFont(
""" """
sanityCheckVariableTables(varfont) sanityCheckVariableTables(varfont)
if not inplace:
varfont = deepcopy(varfont)
axisLimits = populateAxisDefaults(varfont, axisLimits) axisLimits = populateAxisDefaults(varfont, axisLimits)
normalizedLimits = normalizeAxisLimits(varfont, axisLimits) normalizedLimits = normalizeAxisLimits(varfont, axisLimits)
log.info("Normalized limits: %s", normalizedLimits) log.info("Normalized limits: %s", normalizedLimits)
if not inplace:
varfont = deepcopy(varfont)
if "gvar" in varfont: if "gvar" in varfont:
instantiateGvar(varfont, normalizedLimits, optimize=optimize) instantiateGvar(varfont, normalizedLimits, optimize=optimize)

View File

@ -1852,6 +1852,11 @@ def test_normalizeAxisLimits_tuple(varfont):
assert normalized == {"wght": (-1.0, 0)} 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): def test_normalizeAxisLimits_no_avar(varfont):
del varfont["avar"] del varfont["avar"]