xref: /aosp_15_r20/external/fonttools/Tests/varLib/instancer/solver_test.py (revision e1fe3e4ad2793916b15cccdc4a7da52a7e1dd0e9)
1*e1fe3e4aSElliott Hughesfrom fontTools.varLib.instancer import solver
2*e1fe3e4aSElliott Hughesfrom fontTools.varLib.instancer import NormalizedAxisTripleAndDistances
3*e1fe3e4aSElliott Hughesimport pytest
4*e1fe3e4aSElliott Hughes
5*e1fe3e4aSElliott Hughes
6*e1fe3e4aSElliott Hughesclass RebaseTentTest(object):
7*e1fe3e4aSElliott Hughes    @pytest.mark.parametrize(
8*e1fe3e4aSElliott Hughes        "tent, axisRange, expected",
9*e1fe3e4aSElliott Hughes        [
10*e1fe3e4aSElliott Hughes            # Case 1: # Pin at default
11*e1fe3e4aSElliott Hughes            pytest.param((0, 1, 1), (0.0, 0.0, 0.0), []),
12*e1fe3e4aSElliott Hughes            # Case 1:
13*e1fe3e4aSElliott Hughes            pytest.param((0.3, 0.5, 0.8), (0.1, 0.2, 0.3), []),
14*e1fe3e4aSElliott Hughes            # Pin axis
15*e1fe3e4aSElliott Hughes            pytest.param(
16*e1fe3e4aSElliott Hughes                (0, 1, 1),
17*e1fe3e4aSElliott Hughes                (0.5, 0.5, 0.5),
18*e1fe3e4aSElliott Hughes                [
19*e1fe3e4aSElliott Hughes                    (0.5, None),
20*e1fe3e4aSElliott Hughes                ],
21*e1fe3e4aSElliott Hughes            ),
22*e1fe3e4aSElliott Hughes            # Case 2:
23*e1fe3e4aSElliott Hughes            pytest.param(
24*e1fe3e4aSElliott Hughes                (0, 1, 1),
25*e1fe3e4aSElliott Hughes                (-1, 0, 0.5),
26*e1fe3e4aSElliott Hughes                [
27*e1fe3e4aSElliott Hughes                    (0.5, (0, 1, 1)),
28*e1fe3e4aSElliott Hughes                ],
29*e1fe3e4aSElliott Hughes            ),
30*e1fe3e4aSElliott Hughes            # Case 2:
31*e1fe3e4aSElliott Hughes            pytest.param(
32*e1fe3e4aSElliott Hughes                (0, 1, 1),
33*e1fe3e4aSElliott Hughes                (-1, 0, 0.75),
34*e1fe3e4aSElliott Hughes                [
35*e1fe3e4aSElliott Hughes                    (0.75, (0, 1, 1)),
36*e1fe3e4aSElliott Hughes                ],
37*e1fe3e4aSElliott Hughes            ),
38*e1fe3e4aSElliott Hughes            #
39*e1fe3e4aSElliott Hughes            # Without gain:
40*e1fe3e4aSElliott Hughes            #
41*e1fe3e4aSElliott Hughes            # Case 3
42*e1fe3e4aSElliott Hughes            pytest.param(
43*e1fe3e4aSElliott Hughes                (0, 0.2, 1),
44*e1fe3e4aSElliott Hughes                (-1, 0, 0.8),
45*e1fe3e4aSElliott Hughes                [
46*e1fe3e4aSElliott Hughes                    (1, (0, 0.25, 1)),
47*e1fe3e4aSElliott Hughes                    (0.25, (0.25, 1, 1)),
48*e1fe3e4aSElliott Hughes                ],
49*e1fe3e4aSElliott Hughes            ),
50*e1fe3e4aSElliott Hughes            # Case 3 boundary
51*e1fe3e4aSElliott Hughes            pytest.param(
52*e1fe3e4aSElliott Hughes                (0, 0.4, 1),
53*e1fe3e4aSElliott Hughes                (-1, 0, 0.5),
54*e1fe3e4aSElliott Hughes                [
55*e1fe3e4aSElliott Hughes                    (1, (0, 0.8, 1)),
56*e1fe3e4aSElliott Hughes                    (2.5 / 3, (0.8, 1, 1)),
57*e1fe3e4aSElliott Hughes                ],
58*e1fe3e4aSElliott Hughes            ),
59*e1fe3e4aSElliott Hughes            # Case 4
60*e1fe3e4aSElliott Hughes            pytest.param(
61*e1fe3e4aSElliott Hughes                (0, 0.25, 1),
62*e1fe3e4aSElliott Hughes                (-1, 0, 0.4),
63*e1fe3e4aSElliott Hughes                [
64*e1fe3e4aSElliott Hughes                    (1, (0, 0.625, 1)),
65*e1fe3e4aSElliott Hughes                    (0.8, (0.625, 1, 1)),
66*e1fe3e4aSElliott Hughes                ],
67*e1fe3e4aSElliott Hughes            ),
68*e1fe3e4aSElliott Hughes            pytest.param(
69*e1fe3e4aSElliott Hughes                (0.25, 0.3, 1.05),
70*e1fe3e4aSElliott Hughes                (0, 0.2, 0.4),
71*e1fe3e4aSElliott Hughes                [
72*e1fe3e4aSElliott Hughes                    (1, (0.25, 0.5, 1)),
73*e1fe3e4aSElliott Hughes                    (2.6 / 3, (0.5, 1, 1)),
74*e1fe3e4aSElliott Hughes                ],
75*e1fe3e4aSElliott Hughes            ),
76*e1fe3e4aSElliott Hughes            # Case 4 boundary
77*e1fe3e4aSElliott Hughes            pytest.param(
78*e1fe3e4aSElliott Hughes                (0.25, 0.5, 1),
79*e1fe3e4aSElliott Hughes                (0, 0.25, 0.5),
80*e1fe3e4aSElliott Hughes                [
81*e1fe3e4aSElliott Hughes                    (1, (0, 1, 1)),
82*e1fe3e4aSElliott Hughes                ],
83*e1fe3e4aSElliott Hughes            ),
84*e1fe3e4aSElliott Hughes            #
85*e1fe3e4aSElliott Hughes            # With gain:
86*e1fe3e4aSElliott Hughes            #
87*e1fe3e4aSElliott Hughes            # Case 3a/1neg
88*e1fe3e4aSElliott Hughes            pytest.param(
89*e1fe3e4aSElliott Hughes                (0.0, 0.5, 1),
90*e1fe3e4aSElliott Hughes                (0, 0.5, 1),
91*e1fe3e4aSElliott Hughes                [
92*e1fe3e4aSElliott Hughes                    (1, None),
93*e1fe3e4aSElliott Hughes                    (-1, (0, 1, 1)),
94*e1fe3e4aSElliott Hughes                    (-1, (-1, -1, 0)),
95*e1fe3e4aSElliott Hughes                ],
96*e1fe3e4aSElliott Hughes            ),
97*e1fe3e4aSElliott Hughes            pytest.param(
98*e1fe3e4aSElliott Hughes                (0.0, 0.5, 1),
99*e1fe3e4aSElliott Hughes                (0, 0.5, 0.75),
100*e1fe3e4aSElliott Hughes                [
101*e1fe3e4aSElliott Hughes                    (1, None),
102*e1fe3e4aSElliott Hughes                    (-0.5, (0, 1, 1)),
103*e1fe3e4aSElliott Hughes                    (-1, (-1, -1, 0)),
104*e1fe3e4aSElliott Hughes                ],
105*e1fe3e4aSElliott Hughes            ),
106*e1fe3e4aSElliott Hughes            pytest.param(
107*e1fe3e4aSElliott Hughes                (0.0, 0.5, 1),
108*e1fe3e4aSElliott Hughes                (0, 0.25, 0.8),
109*e1fe3e4aSElliott Hughes                [
110*e1fe3e4aSElliott Hughes                    (0.5, None),
111*e1fe3e4aSElliott Hughes                    (0.5, (0, 0.45454545, 0.9090909090)),
112*e1fe3e4aSElliott Hughes                    (-0.1, (0.9090909090, 1.0, 1.0)),
113*e1fe3e4aSElliott Hughes                    (-0.5, (-1, -1, 0)),
114*e1fe3e4aSElliott Hughes                ],
115*e1fe3e4aSElliott Hughes            ),
116*e1fe3e4aSElliott Hughes            # Case 3a/1neg
117*e1fe3e4aSElliott Hughes            pytest.param(
118*e1fe3e4aSElliott Hughes                (0.0, 0.5, 2),
119*e1fe3e4aSElliott Hughes                (0.2, 0.5, 0.8),
120*e1fe3e4aSElliott Hughes                [
121*e1fe3e4aSElliott Hughes                    (1, None),
122*e1fe3e4aSElliott Hughes                    (-0.2, (0, 1, 1)),
123*e1fe3e4aSElliott Hughes                    (-0.6, (-1, -1, 0)),
124*e1fe3e4aSElliott Hughes                ],
125*e1fe3e4aSElliott Hughes            ),
126*e1fe3e4aSElliott Hughes            # Case 3a/1neg
127*e1fe3e4aSElliott Hughes            pytest.param(
128*e1fe3e4aSElliott Hughes                (0.0, 0.5, 2),
129*e1fe3e4aSElliott Hughes                (0.2, 0.5, 1),
130*e1fe3e4aSElliott Hughes                [
131*e1fe3e4aSElliott Hughes                    (1, None),
132*e1fe3e4aSElliott Hughes                    (-1 / 3, (0, 1, 1)),
133*e1fe3e4aSElliott Hughes                    (-0.6, (-1, -1, 0)),
134*e1fe3e4aSElliott Hughes                ],
135*e1fe3e4aSElliott Hughes            ),
136*e1fe3e4aSElliott Hughes            # Case 3
137*e1fe3e4aSElliott Hughes            pytest.param(
138*e1fe3e4aSElliott Hughes                (0, 0.5, 1),
139*e1fe3e4aSElliott Hughes                (0.25, 0.25, 0.75),
140*e1fe3e4aSElliott Hughes                [
141*e1fe3e4aSElliott Hughes                    (0.5, None),
142*e1fe3e4aSElliott Hughes                    (0.5, (0, 0.5, 1.0)),
143*e1fe3e4aSElliott Hughes                ],
144*e1fe3e4aSElliott Hughes            ),
145*e1fe3e4aSElliott Hughes            # Case 1neg
146*e1fe3e4aSElliott Hughes            pytest.param(
147*e1fe3e4aSElliott Hughes                (0.0, 0.5, 1),
148*e1fe3e4aSElliott Hughes                (0, 0.25, 0.5),
149*e1fe3e4aSElliott Hughes                [
150*e1fe3e4aSElliott Hughes                    (0.5, None),
151*e1fe3e4aSElliott Hughes                    (0.5, (0, 1, 1)),
152*e1fe3e4aSElliott Hughes                    (-0.5, (-1, -1, 0)),
153*e1fe3e4aSElliott Hughes                ],
154*e1fe3e4aSElliott Hughes            ),
155*e1fe3e4aSElliott Hughes            # Case 2neg
156*e1fe3e4aSElliott Hughes            pytest.param(
157*e1fe3e4aSElliott Hughes                (0.05, 0.55, 1),
158*e1fe3e4aSElliott Hughes                (0, 0.25, 0.5),
159*e1fe3e4aSElliott Hughes                [
160*e1fe3e4aSElliott Hughes                    (0.4, None),
161*e1fe3e4aSElliott Hughes                    (0.5, (0, 1, 1)),
162*e1fe3e4aSElliott Hughes                    (-0.4, (-1, -0.8, 0)),
163*e1fe3e4aSElliott Hughes                    (-0.4, (-1, -1, -0.8)),
164*e1fe3e4aSElliott Hughes                ],
165*e1fe3e4aSElliott Hughes            ),
166*e1fe3e4aSElliott Hughes            # Case 2neg, other side
167*e1fe3e4aSElliott Hughes            pytest.param(
168*e1fe3e4aSElliott Hughes                (-1, -0.55, -0.05),
169*e1fe3e4aSElliott Hughes                (-0.5, -0.25, 0),
170*e1fe3e4aSElliott Hughes                [
171*e1fe3e4aSElliott Hughes                    (0.4, None),
172*e1fe3e4aSElliott Hughes                    (0.5, (-1, -1, 0)),
173*e1fe3e4aSElliott Hughes                    (-0.4, (0, 0.8, 1)),
174*e1fe3e4aSElliott Hughes                    (-0.4, (0.8, 1, 1)),
175*e1fe3e4aSElliott Hughes                ],
176*e1fe3e4aSElliott Hughes            ),
177*e1fe3e4aSElliott Hughes            #
178*e1fe3e4aSElliott Hughes            # Misc corner cases
179*e1fe3e4aSElliott Hughes            #
180*e1fe3e4aSElliott Hughes            pytest.param(
181*e1fe3e4aSElliott Hughes                (0.5, 0.5, 0.5),
182*e1fe3e4aSElliott Hughes                (0.5, 0.5, 0.5),
183*e1fe3e4aSElliott Hughes                [
184*e1fe3e4aSElliott Hughes                    (1, None),
185*e1fe3e4aSElliott Hughes                ],
186*e1fe3e4aSElliott Hughes            ),
187*e1fe3e4aSElliott Hughes            pytest.param(
188*e1fe3e4aSElliott Hughes                (0.3, 0.5, 0.7),
189*e1fe3e4aSElliott Hughes                (0.1, 0.5, 0.9),
190*e1fe3e4aSElliott Hughes                [
191*e1fe3e4aSElliott Hughes                    (1, None),
192*e1fe3e4aSElliott Hughes                    (-1, (0, 0.5, 1)),
193*e1fe3e4aSElliott Hughes                    (-1, (0.5, 1, 1)),
194*e1fe3e4aSElliott Hughes                    (-1, (-1, -0.5, 0)),
195*e1fe3e4aSElliott Hughes                    (-1, (-1, -1, -0.5)),
196*e1fe3e4aSElliott Hughes                ],
197*e1fe3e4aSElliott Hughes            ),
198*e1fe3e4aSElliott Hughes            pytest.param(
199*e1fe3e4aSElliott Hughes                (0.5, 0.5, 0.5),
200*e1fe3e4aSElliott Hughes                (0.25, 0.25, 0.5),
201*e1fe3e4aSElliott Hughes                [
202*e1fe3e4aSElliott Hughes                    (1, (1, 1, 1)),
203*e1fe3e4aSElliott Hughes                ],
204*e1fe3e4aSElliott Hughes            ),
205*e1fe3e4aSElliott Hughes            pytest.param(
206*e1fe3e4aSElliott Hughes                (0.5, 0.5, 0.5),
207*e1fe3e4aSElliott Hughes                (0.25, 0.35, 0.5),
208*e1fe3e4aSElliott Hughes                [
209*e1fe3e4aSElliott Hughes                    (1, (1, 1, 1)),
210*e1fe3e4aSElliott Hughes                ],
211*e1fe3e4aSElliott Hughes            ),
212*e1fe3e4aSElliott Hughes            pytest.param(
213*e1fe3e4aSElliott Hughes                (0.5, 0.5, 0.55),
214*e1fe3e4aSElliott Hughes                (0.25, 0.35, 0.5),
215*e1fe3e4aSElliott Hughes                [
216*e1fe3e4aSElliott Hughes                    (1, (1, 1, 1)),
217*e1fe3e4aSElliott Hughes                ],
218*e1fe3e4aSElliott Hughes            ),
219*e1fe3e4aSElliott Hughes            pytest.param(
220*e1fe3e4aSElliott Hughes                (0.5, 0.5, 1),
221*e1fe3e4aSElliott Hughes                (0.5, 0.5, 1),
222*e1fe3e4aSElliott Hughes                [
223*e1fe3e4aSElliott Hughes                    (1, None),
224*e1fe3e4aSElliott Hughes                    (-1, (0, 1, 1)),
225*e1fe3e4aSElliott Hughes                ],
226*e1fe3e4aSElliott Hughes            ),
227*e1fe3e4aSElliott Hughes            pytest.param(
228*e1fe3e4aSElliott Hughes                (0.25, 0.5, 1),
229*e1fe3e4aSElliott Hughes                (0.5, 0.5, 1),
230*e1fe3e4aSElliott Hughes                [
231*e1fe3e4aSElliott Hughes                    (1, None),
232*e1fe3e4aSElliott Hughes                    (-1, (0, 1, 1)),
233*e1fe3e4aSElliott Hughes                ],
234*e1fe3e4aSElliott Hughes            ),
235*e1fe3e4aSElliott Hughes            pytest.param(
236*e1fe3e4aSElliott Hughes                (0, 0.2, 1),
237*e1fe3e4aSElliott Hughes                (0, 0, 0.5),
238*e1fe3e4aSElliott Hughes                [
239*e1fe3e4aSElliott Hughes                    (1, (0, 0.4, 1)),
240*e1fe3e4aSElliott Hughes                    (0.625, (0.4, 1, 1)),
241*e1fe3e4aSElliott Hughes                ],
242*e1fe3e4aSElliott Hughes            ),
243*e1fe3e4aSElliott Hughes            # https://github.com/fonttools/fonttools/issues/3139
244*e1fe3e4aSElliott Hughes            pytest.param(
245*e1fe3e4aSElliott Hughes                (0, 0.5, 1),
246*e1fe3e4aSElliott Hughes                (-1, 0.25, 1),
247*e1fe3e4aSElliott Hughes                [
248*e1fe3e4aSElliott Hughes                    (0.5, None),
249*e1fe3e4aSElliott Hughes                    (0.5, (0.0, 1 / 3, 2 / 3)),
250*e1fe3e4aSElliott Hughes                    (-0.5, (2 / 3, 1, 1)),
251*e1fe3e4aSElliott Hughes                    (-0.5, (-1, -0.2, 0)),
252*e1fe3e4aSElliott Hughes                    (-0.5, (-1, -1, -0.2)),
253*e1fe3e4aSElliott Hughes                ],
254*e1fe3e4aSElliott Hughes            ),
255*e1fe3e4aSElliott Hughes            # Dirac delta at new default. Fancy!
256*e1fe3e4aSElliott Hughes            pytest.param(
257*e1fe3e4aSElliott Hughes                (0.5, 0.5, 0.5),
258*e1fe3e4aSElliott Hughes                (0, 0.5, 1),
259*e1fe3e4aSElliott Hughes                [
260*e1fe3e4aSElliott Hughes                    (1, None),
261*e1fe3e4aSElliott Hughes                    (-1, (0, 0.0001220703, 1)),
262*e1fe3e4aSElliott Hughes                    (-1, (0.0001220703, 1, 1)),
263*e1fe3e4aSElliott Hughes                    (-1, (-1, -0.0001220703, 0)),
264*e1fe3e4aSElliott Hughes                    (-1, (-1, -1, -0.0001220703)),
265*e1fe3e4aSElliott Hughes                ],
266*e1fe3e4aSElliott Hughes            ),
267*e1fe3e4aSElliott Hughes            # https://github.com/fonttools/fonttools/issues/3177
268*e1fe3e4aSElliott Hughes            pytest.param(
269*e1fe3e4aSElliott Hughes                (0, 1, 1),
270*e1fe3e4aSElliott Hughes                (-1, -0.5, +1, 1, 1),
271*e1fe3e4aSElliott Hughes                [
272*e1fe3e4aSElliott Hughes                    (1.0, (1 / 3, 1.0, 1.0)),
273*e1fe3e4aSElliott Hughes                ],
274*e1fe3e4aSElliott Hughes            ),
275*e1fe3e4aSElliott Hughes            pytest.param(
276*e1fe3e4aSElliott Hughes                (0, 1, 1),
277*e1fe3e4aSElliott Hughes                (-1, -0.5, +1, 2, 1),
278*e1fe3e4aSElliott Hughes                [
279*e1fe3e4aSElliott Hughes                    (1.0, (0.5, 1.0, 1.0)),
280*e1fe3e4aSElliott Hughes                ],
281*e1fe3e4aSElliott Hughes            ),
282*e1fe3e4aSElliott Hughes            # https://github.com/fonttools/fonttools/issues/3291
283*e1fe3e4aSElliott Hughes            pytest.param(
284*e1fe3e4aSElliott Hughes                (0.6, 0.7, 0.8),
285*e1fe3e4aSElliott Hughes                (-1, 0.2, +1, 1, 1),
286*e1fe3e4aSElliott Hughes                [
287*e1fe3e4aSElliott Hughes                    (1.0, (0.5, 0.625, 0.75)),
288*e1fe3e4aSElliott Hughes                ],
289*e1fe3e4aSElliott Hughes            ),
290*e1fe3e4aSElliott Hughes        ],
291*e1fe3e4aSElliott Hughes    )
292*e1fe3e4aSElliott Hughes    def test_rebaseTent(self, tent, axisRange, expected):
293*e1fe3e4aSElliott Hughes        axisRange = NormalizedAxisTripleAndDistances(*axisRange)
294*e1fe3e4aSElliott Hughes
295*e1fe3e4aSElliott Hughes        sol = solver.rebaseTent(tent, axisRange)
296*e1fe3e4aSElliott Hughes
297*e1fe3e4aSElliott Hughes        a = pytest.approx
298*e1fe3e4aSElliott Hughes        expected = [
299*e1fe3e4aSElliott Hughes            (a(scalar), (a(v[0]), a(v[1]), a(v[2])) if v is not None else None)
300*e1fe3e4aSElliott Hughes            for scalar, v in expected
301*e1fe3e4aSElliott Hughes        ]
302*e1fe3e4aSElliott Hughes
303*e1fe3e4aSElliott Hughes        assert sol == expected, (tent, axisRange)
304