[instancer.solver] Start fleshing out L4

This commit is contained in:
Behdad Esfahbod 2022-08-06 20:33:16 -06:00
parent eef320e974
commit e94f564149
2 changed files with 28 additions and 5 deletions

View File

@ -1041,11 +1041,6 @@ def normalizeAxisLimits(varfont, axisLimits, usingAvar=True):
minV, defaultV, maxV = _expand(value)
if defaultV is None:
defaultV = default
if (minV != maxV or minV != defaultV) and defaultV != default:
raise NotImplementedError(
f"Unsupported range {axis_tag}={minV:g}:{defaultV:g}:{maxV:g}; "
f"can't change default position ({axis_tag}={default:g})"
)
value = (minV, defaultV, maxV)

View File

@ -3,6 +3,9 @@ from fontTools.varLib.models import supportScalar
def _negate(*values):
yield from (-1 * v for v in values)
def _revnegate(v):
return (-v[2], -v[1], -v[0])
def _solvePinned(tent, axisLimit):
axisMin, axisDef, axisMax = axisLimit
@ -101,7 +104,32 @@ def _solveDefaultUnmoved(tent, axisLimit):
return [(scalar1, loc), (scalar2, newloc)]
def _solveGeneral(tent, axisLimit):
axisMin, axisDef, axisMax = axisLimit
lower, peak, upper = tent
if axisDef > peak:
return [(scalar, _revnegate(t))
for scalar,t
in _solveGeneral(_revnegate(tent),
_revnegate(axisLimit))]
# axisDef <= peak
if axisMax <= lower and axisMax < peak:
return [] # No overlap
if axisMax < peak:
mult = supportScalar({'tag': peak}, {'tag': axisLimit})
tent = (lower, axisMax, axisMax)
return [(scalar*mult, t) for scalar,t in _solveGeneral(tent, axisLimit)]
# axisDef <= peak <= axisMax
raise NotImplementedError