2021-05-04 16:12:24 +02:00
|
|
|
import pytest
|
|
|
|
from fontTools.varLib.models import VariationModel
|
|
|
|
from fontTools.varLib.varStore import OnlineVarStoreBuilder, VarStoreInstancer
|
2021-05-04 17:08:27 +02:00
|
|
|
from fontTools.ttLib import TTFont, newTable
|
2021-05-04 16:12:24 +02:00
|
|
|
from fontTools.ttLib.tables._f_v_a_r import Axis
|
2021-05-04 17:08:27 +02:00
|
|
|
from fontTools.ttLib.tables.otBase import OTTableReader, OTTableWriter
|
|
|
|
from fontTools.ttLib.tables.otTables import VarStore
|
2021-05-04 16:12:24 +02:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"locations, masterValues",
|
|
|
|
[
|
|
|
|
(
|
|
|
|
[{}, {"a": 1}],
|
|
|
|
[
|
|
|
|
[10, 20],
|
|
|
|
[100, 2000],
|
|
|
|
[100, 22000],
|
|
|
|
],
|
|
|
|
),
|
|
|
|
(
|
|
|
|
[{}, {"a": 1}, {"b": 1}, {"a": 1, "b": 1}],
|
|
|
|
[
|
|
|
|
[10, 20, 40, 60],
|
|
|
|
[100, 2000, 400, 6000],
|
2021-05-04 17:08:27 +02:00
|
|
|
[7100, 22000, 4000, 30000],
|
2021-05-04 16:12:24 +02:00
|
|
|
],
|
|
|
|
),
|
2021-05-04 17:08:27 +02:00
|
|
|
# (
|
|
|
|
# [{}, {"a": 1}],
|
|
|
|
# [
|
|
|
|
# [10, 20],
|
|
|
|
# [42000, 100],
|
|
|
|
# [100, 52000],
|
|
|
|
# ],
|
|
|
|
# ),
|
|
|
|
# (
|
|
|
|
# [{}, {"a": 1}, {"b": 1}, {"a": 1, "b": 1}],
|
|
|
|
# [
|
|
|
|
# [10, 20, 40, 60],
|
|
|
|
# [40000, 42000, 400, 6000],
|
|
|
|
# [100, 22000, 4000, 173000],
|
|
|
|
# ],
|
|
|
|
# ),
|
2021-05-04 16:12:24 +02:00
|
|
|
],
|
|
|
|
)
|
|
|
|
def test_onlineVarStoreBuilder(locations, masterValues):
|
|
|
|
axisTags = sorted({k for loc in locations for k in loc})
|
|
|
|
model = VariationModel(locations)
|
|
|
|
builder = OnlineVarStoreBuilder(axisTags)
|
|
|
|
builder.setModel(model)
|
2021-05-04 16:39:20 +02:00
|
|
|
varIdxs = []
|
2021-05-04 16:12:24 +02:00
|
|
|
for masters in masterValues:
|
2021-05-04 16:39:20 +02:00
|
|
|
_, varIdx = builder.storeMasters(masters)
|
|
|
|
varIdxs.append(varIdx)
|
2021-05-04 16:12:24 +02:00
|
|
|
|
|
|
|
varStore = builder.finish()
|
2021-05-04 16:19:48 +02:00
|
|
|
mapping = varStore.optimize()
|
2021-05-04 16:39:20 +02:00
|
|
|
varIdxs = [mapping[varIdx] for varIdx in varIdxs]
|
2021-05-04 16:12:24 +02:00
|
|
|
|
2021-05-04 17:08:27 +02:00
|
|
|
font = TTFont()
|
2021-05-04 16:12:24 +02:00
|
|
|
fvarAxes = [buildAxis(axisTag) for axisTag in axisTags]
|
2021-05-04 17:08:27 +02:00
|
|
|
font["fvar"] = newTable("fvar")
|
|
|
|
font["fvar"].axes = fvarAxes
|
|
|
|
|
|
|
|
writer = OTTableWriter()
|
|
|
|
varStore.compile(writer, font)
|
|
|
|
data = writer.getAllData()
|
|
|
|
reader = OTTableReader(data)
|
|
|
|
varStore = VarStore()
|
|
|
|
varStore.decompile(reader, font)
|
|
|
|
|
2021-05-04 16:12:24 +02:00
|
|
|
instancer = VarStoreInstancer(varStore, fvarAxes)
|
2021-05-04 16:39:20 +02:00
|
|
|
for masters, varIdx in zip(masterValues, varIdxs):
|
2021-05-04 16:12:24 +02:00
|
|
|
base, *rest = masters
|
|
|
|
for expectedValue, loc in zip(masters, locations):
|
|
|
|
instancer.setLocation(loc)
|
|
|
|
value = base + instancer[varIdx]
|
|
|
|
assert expectedValue == value
|
|
|
|
|
|
|
|
|
|
|
|
def buildAxis(axisTag):
|
|
|
|
axis = Axis()
|
|
|
|
axis.axisTag = axisTag
|
|
|
|
return axis
|