aboutsummaryrefslogtreecommitdiff
path: root/Tests/ttLib/tables/_t_r_a_k_test.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tests/ttLib/tables/_t_r_a_k_test.py')
-rw-r--r--Tests/ttLib/tables/_t_r_a_k_test.py602
1 files changed, 303 insertions, 299 deletions
diff --git a/Tests/ttLib/tables/_t_r_a_k_test.py b/Tests/ttLib/tables/_t_r_a_k_test.py
index 2ea6cf59..ec178377 100644
--- a/Tests/ttLib/tables/_t_r_a_k_test.py
+++ b/Tests/ttLib/tables/_t_r_a_k_test.py
@@ -8,332 +8,336 @@ import unittest
# /Library/Fonts/Osaka.ttf from OSX has trak table with both horiz and vertData
OSAKA_TRAK_TABLE_DATA = deHexStr(
- '00 01 00 00 00 00 00 0c 00 40 00 00 00 03 00 02 00 00 00 2c ff ff '
- '00 00 01 06 00 34 00 00 00 00 01 07 00 38 00 01 00 00 01 08 00 3c '
- '00 0c 00 00 00 18 00 00 ff f4 ff f4 00 00 00 00 00 0c 00 0c 00 03 '
- '00 02 00 00 00 60 ff ff 00 00 01 09 00 68 00 00 00 00 01 0a 00 6c '
- '00 01 00 00 01 0b 00 70 00 0c 00 00 00 18 00 00 ff f4 ff f4 00 00 '
- '00 00 00 0c 00 0c')
-
-# decompiled horizData and vertData entries from Osaka.ttf
+ "00 01 00 00 00 00 00 0c 00 40 00 00 00 03 00 02 00 00 00 2c ff ff "
+ "00 00 01 06 00 34 00 00 00 00 01 07 00 38 00 01 00 00 01 08 00 3c "
+ "00 0c 00 00 00 18 00 00 ff f4 ff f4 00 00 00 00 00 0c 00 0c 00 03 "
+ "00 02 00 00 00 60 ff ff 00 00 01 09 00 68 00 00 00 00 01 0a 00 6c "
+ "00 01 00 00 01 0b 00 70 00 0c 00 00 00 18 00 00 ff f4 ff f4 00 00 "
+ "00 00 00 0c 00 0c"
+)
+
+# decompiled horizData and vertData entries from Osaka.ttf
OSAKA_HORIZ_TRACK_ENTRIES = {
- -1.0: TrackTableEntry({24.0: -12, 12.0: -12}, nameIndex=262),
- 0.0: TrackTableEntry({24.0: 0, 12.0: 0}, nameIndex=263),
- 1.0: TrackTableEntry({24.0: 12, 12.0: 12}, nameIndex=264)
- }
+ -1.0: TrackTableEntry({24.0: -12, 12.0: -12}, nameIndex=262),
+ 0.0: TrackTableEntry({24.0: 0, 12.0: 0}, nameIndex=263),
+ 1.0: TrackTableEntry({24.0: 12, 12.0: 12}, nameIndex=264),
+}
OSAKA_VERT_TRACK_ENTRIES = {
- -1.0: TrackTableEntry({24.0: -12, 12.0: -12}, nameIndex=265),
- 0.0: TrackTableEntry({24.0: 0, 12.0: 0}, nameIndex=266),
- 1.0: TrackTableEntry({24.0: 12, 12.0: 12}, nameIndex=267)
- }
+ -1.0: TrackTableEntry({24.0: -12, 12.0: -12}, nameIndex=265),
+ 0.0: TrackTableEntry({24.0: 0, 12.0: 0}, nameIndex=266),
+ 1.0: TrackTableEntry({24.0: 12, 12.0: 12}, nameIndex=267),
+}
OSAKA_TRAK_TABLE_XML = [
- '<version value="1.0"/>',
- '<format value="0"/>',
- '<horizData>',
- ' <!-- nTracks=3, nSizes=2 -->',
- ' <trackEntry value="-1.0" nameIndex="262">',
- ' <!-- Tight -->',
- ' <track size="12.0" value="-12"/>',
- ' <track size="24.0" value="-12"/>',
- ' </trackEntry>',
- ' <trackEntry value="0.0" nameIndex="263">',
- ' <!-- Normal -->',
- ' <track size="12.0" value="0"/>',
- ' <track size="24.0" value="0"/>',
- ' </trackEntry>',
- ' <trackEntry value="1.0" nameIndex="264">',
- ' <!-- Loose -->',
- ' <track size="12.0" value="12"/>',
- ' <track size="24.0" value="12"/>',
- ' </trackEntry>',
- '</horizData>',
- '<vertData>',
- ' <!-- nTracks=3, nSizes=2 -->',
- ' <trackEntry value="-1.0" nameIndex="265">',
- ' <!-- Tight -->',
- ' <track size="12.0" value="-12"/>',
- ' <track size="24.0" value="-12"/>',
- ' </trackEntry>',
- ' <trackEntry value="0.0" nameIndex="266">',
- ' <!-- Normal -->',
- ' <track size="12.0" value="0"/>',
- ' <track size="24.0" value="0"/>',
- ' </trackEntry>',
- ' <trackEntry value="1.0" nameIndex="267">',
- ' <!-- Loose -->',
- ' <track size="12.0" value="12"/>',
- ' <track size="24.0" value="12"/>',
- ' </trackEntry>',
- '</vertData>',
+ '<version value="1.0"/>',
+ '<format value="0"/>',
+ "<horizData>",
+ " <!-- nTracks=3, nSizes=2 -->",
+ ' <trackEntry value="-1.0" nameIndex="262">',
+ " <!-- Tight -->",
+ ' <track size="12.0" value="-12"/>',
+ ' <track size="24.0" value="-12"/>',
+ " </trackEntry>",
+ ' <trackEntry value="0.0" nameIndex="263">',
+ " <!-- Normal -->",
+ ' <track size="12.0" value="0"/>',
+ ' <track size="24.0" value="0"/>',
+ " </trackEntry>",
+ ' <trackEntry value="1.0" nameIndex="264">',
+ " <!-- Loose -->",
+ ' <track size="12.0" value="12"/>',
+ ' <track size="24.0" value="12"/>',
+ " </trackEntry>",
+ "</horizData>",
+ "<vertData>",
+ " <!-- nTracks=3, nSizes=2 -->",
+ ' <trackEntry value="-1.0" nameIndex="265">',
+ " <!-- Tight -->",
+ ' <track size="12.0" value="-12"/>',
+ ' <track size="24.0" value="-12"/>',
+ " </trackEntry>",
+ ' <trackEntry value="0.0" nameIndex="266">',
+ " <!-- Normal -->",
+ ' <track size="12.0" value="0"/>',
+ ' <track size="24.0" value="0"/>',
+ " </trackEntry>",
+ ' <trackEntry value="1.0" nameIndex="267">',
+ " <!-- Loose -->",
+ ' <track size="12.0" value="12"/>',
+ ' <track size="24.0" value="12"/>',
+ " </trackEntry>",
+ "</vertData>",
]
# made-up table containing only vertData (no horizData)
OSAKA_VERT_ONLY_TRAK_TABLE_DATA = deHexStr(
- '00 01 00 00 00 00 00 00 00 0c 00 00 00 03 00 02 00 00 00 2c ff ff '
- '00 00 01 09 00 34 00 00 00 00 01 0a 00 38 00 01 00 00 01 0b 00 3c '
- '00 0c 00 00 00 18 00 00 ff f4 ff f4 00 00 00 00 00 0c 00 0c')
+ "00 01 00 00 00 00 00 00 00 0c 00 00 00 03 00 02 00 00 00 2c ff ff "
+ "00 00 01 09 00 34 00 00 00 00 01 0a 00 38 00 01 00 00 01 0b 00 3c "
+ "00 0c 00 00 00 18 00 00 ff f4 ff f4 00 00 00 00 00 0c 00 0c"
+)
OSAKA_VERT_ONLY_TRAK_TABLE_XML = [
- '<version value="1.0"/>',
- '<format value="0"/>',
- '<horizData>',
- ' <!-- nTracks=0, nSizes=0 -->',
- '</horizData>',
- '<vertData>',
- ' <!-- nTracks=3, nSizes=2 -->',
- ' <trackEntry value="-1.0" nameIndex="265">',
- ' <!-- Tight -->',
- ' <track size="12.0" value="-12"/>',
- ' <track size="24.0" value="-12"/>',
- ' </trackEntry>',
- ' <trackEntry value="0.0" nameIndex="266">',
- ' <!-- Normal -->',
- ' <track size="12.0" value="0"/>',
- ' <track size="24.0" value="0"/>',
- ' </trackEntry>',
- ' <trackEntry value="1.0" nameIndex="267">',
- ' <!-- Loose -->',
- ' <track size="12.0" value="12"/>',
- ' <track size="24.0" value="12"/>',
- ' </trackEntry>',
- '</vertData>',
+ '<version value="1.0"/>',
+ '<format value="0"/>',
+ "<horizData>",
+ " <!-- nTracks=0, nSizes=0 -->",
+ "</horizData>",
+ "<vertData>",
+ " <!-- nTracks=3, nSizes=2 -->",
+ ' <trackEntry value="-1.0" nameIndex="265">',
+ " <!-- Tight -->",
+ ' <track size="12.0" value="-12"/>',
+ ' <track size="24.0" value="-12"/>',
+ " </trackEntry>",
+ ' <trackEntry value="0.0" nameIndex="266">',
+ " <!-- Normal -->",
+ ' <track size="12.0" value="0"/>',
+ ' <track size="24.0" value="0"/>',
+ " </trackEntry>",
+ ' <trackEntry value="1.0" nameIndex="267">',
+ " <!-- Loose -->",
+ ' <track size="12.0" value="12"/>',
+ ' <track size="24.0" value="12"/>',
+ " </trackEntry>",
+ "</vertData>",
]
# also /Library/Fonts/Skia.ttf contains a trak table with horizData
SKIA_TRAK_TABLE_DATA = deHexStr(
- '00 01 00 00 00 00 00 0c 00 00 00 00 00 03 00 05 00 00 00 2c ff ff '
- '00 00 01 13 00 40 00 00 00 00 01 2f 00 4a 00 01 00 00 01 14 00 54 '
- '00 09 00 00 00 0a 00 00 00 0c 00 00 00 12 00 00 00 13 00 00 ff f6 '
- 'ff e2 ff c4 ff c1 ff c1 00 0f 00 00 ff fb ff e7 ff e7 00 8c 00 82 '
- '00 7d 00 73 00 73')
+ "00 01 00 00 00 00 00 0c 00 00 00 00 00 03 00 05 00 00 00 2c ff ff "
+ "00 00 01 13 00 40 00 00 00 00 01 2f 00 4a 00 01 00 00 01 14 00 54 "
+ "00 09 00 00 00 0a 00 00 00 0c 00 00 00 12 00 00 00 13 00 00 ff f6 "
+ "ff e2 ff c4 ff c1 ff c1 00 0f 00 00 ff fb ff e7 ff e7 00 8c 00 82 "
+ "00 7d 00 73 00 73"
+)
SKIA_TRACK_ENTRIES = {
- -1.0: TrackTableEntry(
- {9.0: -10, 10.0: -30, 19.0: -63, 12.0: -60, 18.0: -63}, nameIndex=275),
- 0.0: TrackTableEntry(
- {9.0: 15, 10.0: 0, 19.0: -25, 12.0: -5, 18.0: -25}, nameIndex=303),
- 1.0: TrackTableEntry(
- {9.0: 140, 10.0: 130, 19.0: 115, 12.0: 125, 18.0: 115}, nameIndex=276)
- }
+ -1.0: TrackTableEntry(
+ {9.0: -10, 10.0: -30, 19.0: -63, 12.0: -60, 18.0: -63}, nameIndex=275
+ ),
+ 0.0: TrackTableEntry(
+ {9.0: 15, 10.0: 0, 19.0: -25, 12.0: -5, 18.0: -25}, nameIndex=303
+ ),
+ 1.0: TrackTableEntry(
+ {9.0: 140, 10.0: 130, 19.0: 115, 12.0: 125, 18.0: 115}, nameIndex=276
+ ),
+}
SKIA_TRAK_TABLE_XML = [
- '<version value="1.0"/>',
- '<format value="0"/>',
- '<horizData>',
- ' <!-- nTracks=3, nSizes=5 -->',
- ' <trackEntry value="-1.0" nameIndex="275">',
- ' <!-- Tight -->',
- ' <track size="9.0" value="-10"/>',
- ' <track size="10.0" value="-30"/>',
- ' <track size="12.0" value="-60"/>',
- ' <track size="18.0" value="-63"/>',
- ' <track size="19.0" value="-63"/>',
- ' </trackEntry>',
- ' <trackEntry value="0.0" nameIndex="303">',
- ' <!-- Normal -->',
- ' <track size="9.0" value="15"/>',
- ' <track size="10.0" value="0"/>',
- ' <track size="12.0" value="-5"/>',
- ' <track size="18.0" value="-25"/>',
- ' <track size="19.0" value="-25"/>',
- ' </trackEntry>',
- ' <trackEntry value="1.0" nameIndex="276">',
- ' <!-- Loose -->',
- ' <track size="9.0" value="140"/>',
- ' <track size="10.0" value="130"/>',
- ' <track size="12.0" value="125"/>',
- ' <track size="18.0" value="115"/>',
- ' <track size="19.0" value="115"/>',
- ' </trackEntry>',
- '</horizData>',
- '<vertData>',
- ' <!-- nTracks=0, nSizes=0 -->',
- '</vertData>',
+ '<version value="1.0"/>',
+ '<format value="0"/>',
+ "<horizData>",
+ " <!-- nTracks=3, nSizes=5 -->",
+ ' <trackEntry value="-1.0" nameIndex="275">',
+ " <!-- Tight -->",
+ ' <track size="9.0" value="-10"/>',
+ ' <track size="10.0" value="-30"/>',
+ ' <track size="12.0" value="-60"/>',
+ ' <track size="18.0" value="-63"/>',
+ ' <track size="19.0" value="-63"/>',
+ " </trackEntry>",
+ ' <trackEntry value="0.0" nameIndex="303">',
+ " <!-- Normal -->",
+ ' <track size="9.0" value="15"/>',
+ ' <track size="10.0" value="0"/>',
+ ' <track size="12.0" value="-5"/>',
+ ' <track size="18.0" value="-25"/>',
+ ' <track size="19.0" value="-25"/>',
+ " </trackEntry>",
+ ' <trackEntry value="1.0" nameIndex="276">',
+ " <!-- Loose -->",
+ ' <track size="9.0" value="140"/>',
+ ' <track size="10.0" value="130"/>',
+ ' <track size="12.0" value="125"/>',
+ ' <track size="18.0" value="115"/>',
+ ' <track size="19.0" value="115"/>',
+ " </trackEntry>",
+ "</horizData>",
+ "<vertData>",
+ " <!-- nTracks=0, nSizes=0 -->",
+ "</vertData>",
]
class TrackingTableTest(unittest.TestCase):
-
- def __init__(self, methodName):
- unittest.TestCase.__init__(self, methodName)
- # Python 3 renamed assertRaisesRegexp to assertRaisesRegex,
- # and fires deprecation warnings if a program uses the old name.
- if not hasattr(self, "assertRaisesRegex"):
- self.assertRaisesRegex = self.assertRaisesRegexp
-
- def setUp(self):
- table = table__t_r_a_k()
- table.version = 1.0
- table.format = 0
- self.font = {'trak': table}
-
- def test_compile_horiz(self):
- table = self.font['trak']
- table.horizData = TrackData(SKIA_TRACK_ENTRIES)
- trakData = table.compile(self.font)
- self.assertEqual(trakData, SKIA_TRAK_TABLE_DATA)
-
- def test_compile_vert(self):
- table = self.font['trak']
- table.vertData = TrackData(OSAKA_VERT_TRACK_ENTRIES)
- trakData = table.compile(self.font)
- self.assertEqual(trakData, OSAKA_VERT_ONLY_TRAK_TABLE_DATA)
-
- def test_compile_horiz_and_vert(self):
- table = self.font['trak']
- table.horizData = TrackData(OSAKA_HORIZ_TRACK_ENTRIES)
- table.vertData = TrackData(OSAKA_VERT_TRACK_ENTRIES)
- trakData = table.compile(self.font)
- self.assertEqual(trakData, OSAKA_TRAK_TABLE_DATA)
-
- def test_compile_longword_aligned(self):
- table = self.font['trak']
- # without padding, this 'horizData' would end up 46 byte long
- table.horizData = TrackData({
- 0.0: TrackTableEntry(nameIndex=256, values={12.0: 0, 24.0: 0, 36.0: 0})
- })
- table.vertData = TrackData({
- 0.0: TrackTableEntry(nameIndex=257, values={12.0: 0, 24.0: 0, 36.0: 0})
- })
- trakData = table.compile(self.font)
- self.assertTrue(table.vertOffset % 4 == 0)
-
- def test_compile_sizes_mismatch(self):
- table = self.font['trak']
- table.horizData = TrackData({
- -1.0: TrackTableEntry(nameIndex=256, values={9.0: -10, 10.0: -30}),
- 0.0: TrackTableEntry(nameIndex=257, values={8.0: 20, 12.0: 0})
- })
- with self.assertRaisesRegex(TTLibError, 'entries must specify the same sizes'):
- table.compile(self.font)
-
- def test_decompile_horiz(self):
- table = self.font['trak']
- table.decompile(SKIA_TRAK_TABLE_DATA, self.font)
- self.assertEqual(table.horizData, SKIA_TRACK_ENTRIES)
- self.assertEqual(table.vertData, TrackData())
-
- def test_decompile_vert(self):
- table = self.font['trak']
- table.decompile(OSAKA_VERT_ONLY_TRAK_TABLE_DATA, self.font)
- self.assertEqual(table.horizData, TrackData())
- self.assertEqual(table.vertData, OSAKA_VERT_TRACK_ENTRIES)
-
- def test_decompile_horiz_and_vert(self):
- table = self.font['trak']
- table.decompile(OSAKA_TRAK_TABLE_DATA, self.font)
- self.assertEqual(table.horizData, OSAKA_HORIZ_TRACK_ENTRIES)
- self.assertEqual(table.vertData, OSAKA_VERT_TRACK_ENTRIES)
-
- def test_roundtrip_decompile_compile(self):
- for trakData in (
- OSAKA_TRAK_TABLE_DATA,
- OSAKA_VERT_ONLY_TRAK_TABLE_DATA,
- SKIA_TRAK_TABLE_DATA):
- table = table__t_r_a_k()
- table.decompile(trakData, ttFont=None)
- newTrakData = table.compile(ttFont=None)
- self.assertEqual(trakData, newTrakData)
-
- def test_fromXML_horiz(self):
- table = self.font['trak']
- for name, attrs, content in parseXML(SKIA_TRAK_TABLE_XML):
- table.fromXML(name, attrs, content, self.font)
- self.assertEqual(table.version, 1.0)
- self.assertEqual(table.format, 0)
- self.assertEqual(table.horizData, SKIA_TRACK_ENTRIES)
- self.assertEqual(table.vertData, TrackData())
-
- def test_fromXML_horiz_and_vert(self):
- table = self.font['trak']
- for name, attrs, content in parseXML(OSAKA_TRAK_TABLE_XML):
- table.fromXML(name, attrs, content, self.font)
- self.assertEqual(table.version, 1.0)
- self.assertEqual(table.format, 0)
- self.assertEqual(table.horizData, OSAKA_HORIZ_TRACK_ENTRIES)
- self.assertEqual(table.vertData, OSAKA_VERT_TRACK_ENTRIES)
-
- def test_fromXML_vert(self):
- table = self.font['trak']
- for name, attrs, content in parseXML(OSAKA_VERT_ONLY_TRAK_TABLE_XML):
- table.fromXML(name, attrs, content, self.font)
- self.assertEqual(table.version, 1.0)
- self.assertEqual(table.format, 0)
- self.assertEqual(table.horizData, TrackData())
- self.assertEqual(table.vertData, OSAKA_VERT_TRACK_ENTRIES)
-
- def test_toXML_horiz(self):
- table = self.font['trak']
- table.horizData = TrackData(SKIA_TRACK_ENTRIES)
- add_name(self.font, 'Tight', nameID=275)
- add_name(self.font, 'Normal', nameID=303)
- add_name(self.font, 'Loose', nameID=276)
- self.assertEqual(
- SKIA_TRAK_TABLE_XML,
- getXML(table.toXML, self.font))
-
- def test_toXML_horiz_and_vert(self):
- table = self.font['trak']
- table.horizData = TrackData(OSAKA_HORIZ_TRACK_ENTRIES)
- table.vertData = TrackData(OSAKA_VERT_TRACK_ENTRIES)
- add_name(self.font, 'Tight', nameID=262)
- add_name(self.font, 'Normal', nameID=263)
- add_name(self.font, 'Loose', nameID=264)
- add_name(self.font, 'Tight', nameID=265)
- add_name(self.font, 'Normal', nameID=266)
- add_name(self.font, 'Loose', nameID=267)
- self.assertEqual(
- OSAKA_TRAK_TABLE_XML,
- getXML(table.toXML, self.font))
-
- def test_toXML_vert(self):
- table = self.font['trak']
- table.vertData = TrackData(OSAKA_VERT_TRACK_ENTRIES)
- add_name(self.font, 'Tight', nameID=265)
- add_name(self.font, 'Normal', nameID=266)
- add_name(self.font, 'Loose', nameID=267)
- self.assertEqual(
- OSAKA_VERT_ONLY_TRAK_TABLE_XML,
- getXML(table.toXML, self.font))
-
- def test_roundtrip_fromXML_toXML(self):
- font = {}
- add_name(font, 'Tight', nameID=275)
- add_name(font, 'Normal', nameID=303)
- add_name(font, 'Loose', nameID=276)
- add_name(font, 'Tight', nameID=262)
- add_name(font, 'Normal', nameID=263)
- add_name(font, 'Loose', nameID=264)
- add_name(font, 'Tight', nameID=265)
- add_name(font, 'Normal', nameID=266)
- add_name(font, 'Loose', nameID=267)
- for input_xml in (
- SKIA_TRAK_TABLE_XML,
- OSAKA_TRAK_TABLE_XML,
- OSAKA_VERT_ONLY_TRAK_TABLE_XML):
- table = table__t_r_a_k()
- font['trak'] = table
- for name, attrs, content in parseXML(input_xml):
- table.fromXML(name, attrs, content, font)
- output_xml = getXML(table.toXML, font)
- self.assertEqual(input_xml, output_xml)
+ def __init__(self, methodName):
+ unittest.TestCase.__init__(self, methodName)
+ # Python 3 renamed assertRaisesRegexp to assertRaisesRegex,
+ # and fires deprecation warnings if a program uses the old name.
+ if not hasattr(self, "assertRaisesRegex"):
+ self.assertRaisesRegex = self.assertRaisesRegexp
+
+ def setUp(self):
+ table = table__t_r_a_k()
+ table.version = 1.0
+ table.format = 0
+ self.font = {"trak": table}
+
+ def test_compile_horiz(self):
+ table = self.font["trak"]
+ table.horizData = TrackData(SKIA_TRACK_ENTRIES)
+ trakData = table.compile(self.font)
+ self.assertEqual(trakData, SKIA_TRAK_TABLE_DATA)
+
+ def test_compile_vert(self):
+ table = self.font["trak"]
+ table.vertData = TrackData(OSAKA_VERT_TRACK_ENTRIES)
+ trakData = table.compile(self.font)
+ self.assertEqual(trakData, OSAKA_VERT_ONLY_TRAK_TABLE_DATA)
+
+ def test_compile_horiz_and_vert(self):
+ table = self.font["trak"]
+ table.horizData = TrackData(OSAKA_HORIZ_TRACK_ENTRIES)
+ table.vertData = TrackData(OSAKA_VERT_TRACK_ENTRIES)
+ trakData = table.compile(self.font)
+ self.assertEqual(trakData, OSAKA_TRAK_TABLE_DATA)
+
+ def test_compile_longword_aligned(self):
+ table = self.font["trak"]
+ # without padding, this 'horizData' would end up 46 byte long
+ table.horizData = TrackData(
+ {0.0: TrackTableEntry(nameIndex=256, values={12.0: 0, 24.0: 0, 36.0: 0})}
+ )
+ table.vertData = TrackData(
+ {0.0: TrackTableEntry(nameIndex=257, values={12.0: 0, 24.0: 0, 36.0: 0})}
+ )
+ trakData = table.compile(self.font)
+ self.assertTrue(table.vertOffset % 4 == 0)
+
+ def test_compile_sizes_mismatch(self):
+ table = self.font["trak"]
+ table.horizData = TrackData(
+ {
+ -1.0: TrackTableEntry(nameIndex=256, values={9.0: -10, 10.0: -30}),
+ 0.0: TrackTableEntry(nameIndex=257, values={8.0: 20, 12.0: 0}),
+ }
+ )
+ with self.assertRaisesRegex(TTLibError, "entries must specify the same sizes"):
+ table.compile(self.font)
+
+ def test_decompile_horiz(self):
+ table = self.font["trak"]
+ table.decompile(SKIA_TRAK_TABLE_DATA, self.font)
+ self.assertEqual(table.horizData, SKIA_TRACK_ENTRIES)
+ self.assertEqual(table.vertData, TrackData())
+
+ def test_decompile_vert(self):
+ table = self.font["trak"]
+ table.decompile(OSAKA_VERT_ONLY_TRAK_TABLE_DATA, self.font)
+ self.assertEqual(table.horizData, TrackData())
+ self.assertEqual(table.vertData, OSAKA_VERT_TRACK_ENTRIES)
+
+ def test_decompile_horiz_and_vert(self):
+ table = self.font["trak"]
+ table.decompile(OSAKA_TRAK_TABLE_DATA, self.font)
+ self.assertEqual(table.horizData, OSAKA_HORIZ_TRACK_ENTRIES)
+ self.assertEqual(table.vertData, OSAKA_VERT_TRACK_ENTRIES)
+
+ def test_roundtrip_decompile_compile(self):
+ for trakData in (
+ OSAKA_TRAK_TABLE_DATA,
+ OSAKA_VERT_ONLY_TRAK_TABLE_DATA,
+ SKIA_TRAK_TABLE_DATA,
+ ):
+ table = table__t_r_a_k()
+ table.decompile(trakData, ttFont=None)
+ newTrakData = table.compile(ttFont=None)
+ self.assertEqual(trakData, newTrakData)
+
+ def test_fromXML_horiz(self):
+ table = self.font["trak"]
+ for name, attrs, content in parseXML(SKIA_TRAK_TABLE_XML):
+ table.fromXML(name, attrs, content, self.font)
+ self.assertEqual(table.version, 1.0)
+ self.assertEqual(table.format, 0)
+ self.assertEqual(table.horizData, SKIA_TRACK_ENTRIES)
+ self.assertEqual(table.vertData, TrackData())
+
+ def test_fromXML_horiz_and_vert(self):
+ table = self.font["trak"]
+ for name, attrs, content in parseXML(OSAKA_TRAK_TABLE_XML):
+ table.fromXML(name, attrs, content, self.font)
+ self.assertEqual(table.version, 1.0)
+ self.assertEqual(table.format, 0)
+ self.assertEqual(table.horizData, OSAKA_HORIZ_TRACK_ENTRIES)
+ self.assertEqual(table.vertData, OSAKA_VERT_TRACK_ENTRIES)
+
+ def test_fromXML_vert(self):
+ table = self.font["trak"]
+ for name, attrs, content in parseXML(OSAKA_VERT_ONLY_TRAK_TABLE_XML):
+ table.fromXML(name, attrs, content, self.font)
+ self.assertEqual(table.version, 1.0)
+ self.assertEqual(table.format, 0)
+ self.assertEqual(table.horizData, TrackData())
+ self.assertEqual(table.vertData, OSAKA_VERT_TRACK_ENTRIES)
+
+ def test_toXML_horiz(self):
+ table = self.font["trak"]
+ table.horizData = TrackData(SKIA_TRACK_ENTRIES)
+ add_name(self.font, "Tight", nameID=275)
+ add_name(self.font, "Normal", nameID=303)
+ add_name(self.font, "Loose", nameID=276)
+ self.assertEqual(SKIA_TRAK_TABLE_XML, getXML(table.toXML, self.font))
+
+ def test_toXML_horiz_and_vert(self):
+ table = self.font["trak"]
+ table.horizData = TrackData(OSAKA_HORIZ_TRACK_ENTRIES)
+ table.vertData = TrackData(OSAKA_VERT_TRACK_ENTRIES)
+ add_name(self.font, "Tight", nameID=262)
+ add_name(self.font, "Normal", nameID=263)
+ add_name(self.font, "Loose", nameID=264)
+ add_name(self.font, "Tight", nameID=265)
+ add_name(self.font, "Normal", nameID=266)
+ add_name(self.font, "Loose", nameID=267)
+ self.assertEqual(OSAKA_TRAK_TABLE_XML, getXML(table.toXML, self.font))
+
+ def test_toXML_vert(self):
+ table = self.font["trak"]
+ table.vertData = TrackData(OSAKA_VERT_TRACK_ENTRIES)
+ add_name(self.font, "Tight", nameID=265)
+ add_name(self.font, "Normal", nameID=266)
+ add_name(self.font, "Loose", nameID=267)
+ self.assertEqual(OSAKA_VERT_ONLY_TRAK_TABLE_XML, getXML(table.toXML, self.font))
+
+ def test_roundtrip_fromXML_toXML(self):
+ font = {}
+ add_name(font, "Tight", nameID=275)
+ add_name(font, "Normal", nameID=303)
+ add_name(font, "Loose", nameID=276)
+ add_name(font, "Tight", nameID=262)
+ add_name(font, "Normal", nameID=263)
+ add_name(font, "Loose", nameID=264)
+ add_name(font, "Tight", nameID=265)
+ add_name(font, "Normal", nameID=266)
+ add_name(font, "Loose", nameID=267)
+ for input_xml in (
+ SKIA_TRAK_TABLE_XML,
+ OSAKA_TRAK_TABLE_XML,
+ OSAKA_VERT_ONLY_TRAK_TABLE_XML,
+ ):
+ table = table__t_r_a_k()
+ font["trak"] = table
+ for name, attrs, content in parseXML(input_xml):
+ table.fromXML(name, attrs, content, font)
+ output_xml = getXML(table.toXML, font)
+ self.assertEqual(input_xml, output_xml)
def add_name(font, string, nameID):
- nameTable = font.get("name")
- if nameTable is None:
- nameTable = font["name"] = table__n_a_m_e()
- nameTable.names = []
- namerec = NameRecord()
- namerec.nameID = nameID
- namerec.string = string.encode('mac_roman')
- namerec.platformID, namerec.platEncID, namerec.langID = (1, 0, 0)
- nameTable.names.append(namerec)
+ nameTable = font.get("name")
+ if nameTable is None:
+ nameTable = font["name"] = table__n_a_m_e()
+ nameTable.names = []
+ namerec = NameRecord()
+ namerec.nameID = nameID
+ namerec.string = string.encode("mac_roman")
+ namerec.platformID, namerec.platEncID, namerec.langID = (1, 0, 0)
+ nameTable.names.append(namerec)
if __name__ == "__main__":
- import sys
- sys.exit(unittest.main())
+ import sys
+
+ sys.exit(unittest.main())