From e94f564149082133db4df5ca3cb0215cecc42b1f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 6 Aug 2022 20:33:16 -0600 Subject: [PATCH] [instancer.solver] Start fleshing out L4 --- Lib/fontTools/varLib/instancer/__init__.py | 5 ---- Lib/fontTools/varLib/instancer/solver.py | 28 ++++++++++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/Lib/fontTools/varLib/instancer/__init__.py b/Lib/fontTools/varLib/instancer/__init__.py index bee195367..530fba68c 100644 --- a/Lib/fontTools/varLib/instancer/__init__.py +++ b/Lib/fontTools/varLib/instancer/__init__.py @@ -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) diff --git a/Lib/fontTools/varLib/instancer/solver.py b/Lib/fontTools/varLib/instancer/solver.py index b4236ac9b..4c88f21aa 100644 --- a/Lib/fontTools/varLib/instancer/solver.py +++ b/Lib/fontTools/varLib/instancer/solver.py @@ -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