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