• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1import pytest
2from fontTools.varLib.models import VariationModel
3from fontTools.varLib.varStore import OnlineVarStoreBuilder, VarStoreInstancer
4from fontTools.ttLib import TTFont, newTable
5from fontTools.ttLib.tables._f_v_a_r import Axis
6from fontTools.ttLib.tables.otBase import OTTableReader, OTTableWriter
7from fontTools.ttLib.tables.otTables import VarStore
8
9
10@pytest.mark.parametrize(
11    "locations, masterValues",
12    [
13        (
14            [{}, {"a": 1}],
15            [
16                [10, 20],
17                [100, 2000],
18                [100, 22000],
19            ],
20        ),
21        (
22            [{}, {"a": 1}, {"b": 1}, {"a": 1, "b": 1}],
23            [
24                [10, 20, 40, 60],
25                [100, 2000, 400, 6000],
26                [7100, 22000, 4000, 30000],
27            ],
28        ),
29        (
30            [{}, {"a": 1}],
31            [
32                [10, 20],
33                [42000, 100],
34                [100, 52000],
35            ],
36        ),
37        (
38            [{}, {"a": 1}, {"b": 1}, {"a": 1, "b": 1}],
39            [
40                [10, 20, 40, 60],
41                [40000, 42000, 400, 6000],
42                [100, 22000, 4000, 173000],
43            ],
44        ),
45    ],
46)
47def test_onlineVarStoreBuilder(locations, masterValues):
48    axisTags = sorted({k for loc in locations for k in loc})
49    model = VariationModel(locations)
50    builder = OnlineVarStoreBuilder(axisTags)
51    builder.setModel(model)
52    varIdxs = []
53    for masters in masterValues:
54        _, varIdx = builder.storeMasters(masters)
55        varIdxs.append(varIdx)
56
57    varStore = builder.finish()
58    mapping = varStore.optimize()
59    varIdxs = [mapping[varIdx] for varIdx in varIdxs]
60
61    dummyFont = TTFont()
62    writer = OTTableWriter()
63    varStore.compile(writer, dummyFont)
64    data = writer.getAllData()
65    reader = OTTableReader(data)
66    varStore = VarStore()
67    varStore.decompile(reader, dummyFont)
68
69    fvarAxes = [buildAxis(axisTag) for axisTag in axisTags]
70    instancer = VarStoreInstancer(varStore, fvarAxes)
71    for masters, varIdx in zip(masterValues, varIdxs):
72        base, *rest = masters
73        for expectedValue, loc in zip(masters, locations):
74            instancer.setLocation(loc)
75            value = base + instancer[varIdx]
76            assert expectedValue == value
77
78
79def buildAxis(axisTag):
80    axis = Axis()
81    axis.axisTag = axisTag
82    return axis
83