2017-01-10 17:55:30 +01:00
|
|
|
from fontTools.misc.testTools import getXML, parseXML
|
|
|
|
from fontTools.misc.textTools import deHexStr, hexStr
|
|
|
|
from fontTools.ttLib import TTLibError, getTableModule, newTable
|
|
|
|
from fontTools.ttLib.tables.TupleVariation import TupleVariation
|
|
|
|
|
|
|
|
import unittest
|
|
|
|
|
|
|
|
|
|
|
|
CVAR_DATA = deHexStr(
|
|
|
|
"0001 0000 " # 0: majorVersion=1 minorVersion=0
|
2017-07-20 16:53:45 +02:00
|
|
|
"8002 0018 " # 4: tupleVariationCount=2|TUPLES_SHARE_POINT_NUMBERS offsetToData=24
|
2017-07-20 18:34:49 +02:00
|
|
|
"0004 " # 8: tvHeader[0].variationDataSize=4
|
|
|
|
"8000 " # 10: tvHeader[0].tupleIndex=EMBEDDED_PEAK
|
2017-01-10 17:55:30 +01:00
|
|
|
"4000 0000 " # 12: tvHeader[0].peakTuple=[1.0, 0.0]
|
2017-07-20 18:34:49 +02:00
|
|
|
"0004 " # 16: tvHeader[1].variationDataSize=4
|
|
|
|
"8000 " # 18: tvHeader[1].tupleIndex=EMBEDDED_PEAK
|
2017-01-10 17:55:30 +01:00
|
|
|
"C000 3333 " # 20: tvHeader[1].peakTuple=[-1.0, 0.8]
|
2017-11-24 19:06:36 +01:00
|
|
|
"03 02 02 01 01" # 24: shared_pointCount=03, run_count=2 cvt=[2, 3, 4]
|
2017-07-20 16:53:45 +02:00
|
|
|
"02 03 01 04 " # 25: deltas=[3, 1, 4]
|
|
|
|
"02 09 07 08"
|
|
|
|
) # 29: deltas=[9, 7, 8]
|
2017-01-10 17:55:30 +01:00
|
|
|
|
2017-11-24 19:06:36 +01:00
|
|
|
CVAR_PRIVATE_POINT_DATA = deHexStr(
|
|
|
|
"0001 0000 " # 0: majorVersion=1 minorVersion=0
|
|
|
|
"0002 0018 " # 4: tupleVariationCount=2 offsetToData=24
|
|
|
|
"0009 " # 8: tvHeader[0].variationDataSize=9
|
|
|
|
"A000 " # 10: tvHeader[0].tupleIndex=EMBEDDED_PEAK|PRIVATE_POINT_NUMBERS
|
|
|
|
"4000 0000 " # 12: tvHeader[0].peakTuple=[1.0, 0.0]
|
|
|
|
"0009 " # 16: tvHeader[1].variationDataSize=9
|
|
|
|
"A000 " # 18: tvHeader[1].tupleIndex=EMBEDDED_PEAK|PRIVATE_POINT_NUMBERS
|
|
|
|
"C000 3333 " # 20: tvHeader[1].peakTuple=[-1.0, 0.8]
|
|
|
|
"03 02 02 01 01 02 03 01 04 " # 24: pointCount=3 run_count=2 cvt=2 1 1 run_count=2 deltas=[3, 1, 4]
|
|
|
|
"03 02 02 01 01 02 09 07 08 "
|
|
|
|
) # 33: pointCount=3 run_count=2 cvt=2 1 1 run_count=2 deltas=[9, 7, 8]
|
|
|
|
|
2017-01-10 17:55:30 +01:00
|
|
|
CVAR_XML = [
|
|
|
|
'<version major="1" minor="0"/>',
|
|
|
|
"<tuple>",
|
|
|
|
' <coord axis="wght" value="1.0"/>',
|
2017-11-24 19:06:36 +01:00
|
|
|
' <delta cvt="2" value="3"/>',
|
|
|
|
' <delta cvt="3" value="1"/>',
|
|
|
|
' <delta cvt="4" value="4"/>',
|
2017-01-10 17:55:30 +01:00
|
|
|
"</tuple>",
|
|
|
|
"<tuple>",
|
|
|
|
' <coord axis="wght" value="-1.0"/>',
|
|
|
|
' <coord axis="wdth" value="0.8"/>',
|
2017-11-24 19:06:36 +01:00
|
|
|
' <delta cvt="2" value="9"/>',
|
|
|
|
' <delta cvt="3" value="7"/>',
|
|
|
|
' <delta cvt="4" value="8"/>',
|
2017-01-10 17:55:30 +01:00
|
|
|
"</tuple>",
|
|
|
|
]
|
|
|
|
|
|
|
|
CVAR_VARIATIONS = [
|
2017-11-24 19:06:36 +01:00
|
|
|
TupleVariation({"wght": (0.0, 1.0, 1.0)}, [None, None, 3, 1, 4]),
|
2019-10-07 18:29:33 +01:00
|
|
|
TupleVariation(
|
|
|
|
{"wght": (-1, -1.0, 0.0), "wdth": (0.0, 0.7999878, 0.7999878)},
|
2017-11-24 19:06:36 +01:00
|
|
|
[None, None, 9, 7, 8],
|
|
|
|
),
|
2017-01-10 17:55:30 +01:00
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
class CVARTableTest(unittest.TestCase):
|
2019-10-07 18:29:33 +01:00
|
|
|
def assertVariationsAlmostEqual(self, variations1, variations2):
|
|
|
|
self.assertEqual(len(variations1), len(variations2))
|
2023-11-03 10:25:15 +00:00
|
|
|
for v1, v2 in zip(variations1, variations2):
|
2019-10-07 18:29:33 +01:00
|
|
|
self.assertSetEqual(set(v1.axes), set(v2.axes))
|
|
|
|
for axisTag, support1 in v1.axes.items():
|
|
|
|
support2 = v2.axes[axisTag]
|
|
|
|
self.assertEqual(len(support1), len(support2))
|
|
|
|
for s1, s2 in zip(support1, support2):
|
|
|
|
self.assertAlmostEqual(s1, s2)
|
|
|
|
self.assertEqual(v1.coordinates, v2.coordinates)
|
|
|
|
|
2017-01-10 17:55:30 +01:00
|
|
|
def makeFont(self):
|
|
|
|
cvt, cvar, fvar = newTable("cvt "), newTable("cvar"), newTable("fvar")
|
|
|
|
font = {"cvt ": cvt, "cvar": cvar, "fvar": fvar}
|
2017-11-24 19:06:36 +01:00
|
|
|
cvt.values = [0, 0, 0, 1000, -2000]
|
2017-01-10 17:55:30 +01:00
|
|
|
Axis = getTableModule("fvar").Axis
|
|
|
|
fvar.axes = [Axis(), Axis()]
|
|
|
|
fvar.axes[0].axisTag, fvar.axes[1].axisTag = "wght", "wdth"
|
|
|
|
return font, cvar
|
|
|
|
|
|
|
|
def test_compile(self):
|
|
|
|
font, cvar = self.makeFont()
|
|
|
|
cvar.variations = CVAR_VARIATIONS
|
2017-11-24 19:06:36 +01:00
|
|
|
self.assertEqual(hexStr(cvar.compile(font)), hexStr(CVAR_PRIVATE_POINT_DATA))
|
|
|
|
|
|
|
|
def test_compile_shared_points(self):
|
|
|
|
font, cvar = self.makeFont()
|
|
|
|
cvar.variations = CVAR_VARIATIONS
|
|
|
|
self.assertEqual(
|
|
|
|
hexStr(cvar.compile(font, useSharedPoints=True)), hexStr(CVAR_DATA)
|
2022-12-13 11:26:36 +00:00
|
|
|
)
|
2017-01-10 17:55:30 +01:00
|
|
|
|
|
|
|
def test_decompile(self):
|
2017-11-24 19:06:36 +01:00
|
|
|
font, cvar = self.makeFont()
|
|
|
|
cvar.decompile(CVAR_PRIVATE_POINT_DATA, font)
|
|
|
|
self.assertEqual(cvar.majorVersion, 1)
|
|
|
|
self.assertEqual(cvar.minorVersion, 0)
|
2019-10-07 18:29:33 +01:00
|
|
|
self.assertVariationsAlmostEqual(cvar.variations, CVAR_VARIATIONS)
|
2017-11-24 19:06:36 +01:00
|
|
|
|
|
|
|
def test_decompile_shared_points(self):
|
2017-01-10 17:55:30 +01:00
|
|
|
font, cvar = self.makeFont()
|
|
|
|
cvar.decompile(CVAR_DATA, font)
|
|
|
|
self.assertEqual(cvar.majorVersion, 1)
|
|
|
|
self.assertEqual(cvar.minorVersion, 0)
|
2019-10-07 18:29:33 +01:00
|
|
|
self.assertVariationsAlmostEqual(cvar.variations, CVAR_VARIATIONS)
|
2017-01-10 17:55:30 +01:00
|
|
|
|
|
|
|
def test_fromXML(self):
|
|
|
|
font, cvar = self.makeFont()
|
|
|
|
for name, attrs, content in parseXML(CVAR_XML):
|
|
|
|
cvar.fromXML(name, attrs, content, ttFont=font)
|
|
|
|
self.assertEqual(cvar.majorVersion, 1)
|
|
|
|
self.assertEqual(cvar.minorVersion, 0)
|
2019-10-07 18:29:33 +01:00
|
|
|
self.assertVariationsAlmostEqual(cvar.variations, CVAR_VARIATIONS)
|
2017-01-10 17:55:30 +01:00
|
|
|
|
|
|
|
def test_toXML(self):
|
|
|
|
font, cvar = self.makeFont()
|
|
|
|
cvar.variations = CVAR_VARIATIONS
|
|
|
|
self.assertEqual(getXML(cvar.toXML, font), CVAR_XML)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2017-01-11 13:05:35 +00:00
|
|
|
import sys
|
2022-12-13 11:26:36 +00:00
|
|
|
|
2017-01-11 13:05:35 +00:00
|
|
|
sys.exit(unittest.main())
|