From dd5452527eb556b4d1eee394177e67b97099a9cd Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 8 Aug 2022 09:35:10 -0600 Subject: [PATCH] [instancer.solver] More fixes --- Lib/fontTools/varLib/instancer/solver.py | 22 ++++++++++++++++------ Tests/varLib/instancer/solver_test.py | 22 ++++++++++++++++++++++ 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/Lib/fontTools/varLib/instancer/solver.py b/Lib/fontTools/varLib/instancer/solver.py index 8bd8c1008..5a956341a 100644 --- a/Lib/fontTools/varLib/instancer/solver.py +++ b/Lib/fontTools/varLib/instancer/solver.py @@ -58,14 +58,24 @@ def _solveWithGain(tent, axisLimit): crossing = peak + ((1 - gain) * (upper - peak) / (1 - outGain)) - loc1 = (peak, peak, crossing) - scalar1 = 1 + loc = (peak, peak, crossing) + scalar = 1 - loc2 = (crossing, axisMax, axisMax) - scalar2 = supportScalar({'tag': axisMax}, {'tag': tent}) + out.append((scalar - gain, loc)) - out.append((scalar1 - gain, loc1)) - if (peak < upper): + if upper >= axisMax: + loc = (crossing, axisMax, axisMax) + scalar = supportScalar({'tag': axisMax}, {'tag': tent}) + + out.append((scalar - gain, loc)) + else: + loc1 = (crossing, upper, axisMax) + scalar1 = 0 + + loc2 = (upper, axisMax, axisMax) + scalar2 = supportScalar({'tag': axisMax}, {'tag': tent}) + + out.append((scalar1 - gain, loc1)) out.append((scalar2 - gain, loc2)) # case 3: outermost limit still fits within F2Dot14 bounds; diff --git a/Tests/varLib/instancer/solver_test.py b/Tests/varLib/instancer/solver_test.py index b3bb90eb2..6936b7231 100644 --- a/Tests/varLib/instancer/solver_test.py +++ b/Tests/varLib/instancer/solver_test.py @@ -135,6 +135,28 @@ class RebaseTentTest(object): (-.4, (.8, 1, 1)), ] ), + + # + # Misc corner cases + # + + pytest.param( + (.5, .5, .5), (.5, .5, .5), + [ + (1, (0, 0, 0)), + ] + ), + + pytest.param( + (.3, .5, .7), (.1, .5, .9), + [ + (1, (-1, 0, 1)), + (-1, (0, 0.4999999999999999, 1)), + (-1, (0.4999999999999999, 1, 1)), + (-1, (-1, -.5, 0)), + (-1, (-1, -1, -.5)), + ] + ), ], ) def test_rebaseTent(self, tent, axisRange, expected):