woff2: allow to recompress woff2 while keeping flavorData

optionally modifying the list of transformed tables
This commit is contained in:
Cosimo Lupo 2019-06-19 12:13:14 +01:00
parent 1c369da8c9
commit 84e9ea167a
No known key found for this signature in database
GPG Key ID: 20D4A261E4A0E642
2 changed files with 29 additions and 8 deletions

View File

@ -1158,10 +1158,7 @@ class WOFF2FlavorData(WOFFFlavorData):
"'reader' and 'transformedTables' arguments are mutually exclusive" "'reader' and 'transformedTables' arguments are mutually exclusive"
) )
if transformedTables is None: if transformedTables is not None and (
transformedTables = woff2TransformedTableTags
else:
if (
"glyf" in transformedTables and "loca" not in transformedTables "glyf" in transformedTables and "loca" not in transformedTables
or "loca" in transformedTables and "glyf" not in transformedTables or "loca" in transformedTables and "glyf" not in transformedTables
): ):
@ -1198,9 +1195,12 @@ class WOFF2FlavorData(WOFFFlavorData):
self.majorVersion = data.minorVersion self.majorVersion = data.minorVersion
self.metaData = data.metaData self.metaData = data.metaData
self.privData = data.privData self.privData = data.privData
if hasattr(data, "transformedTables"): if transformedTables is None and hasattr(data, "transformedTables"):
transformedTables = data.transformedTables transformedTables = data.transformedTables
if transformedTables is None:
transformedTables = woff2TransformedTableTags
self.transformedTables = set(transformedTables) self.transformedTables = set(transformedTables)

View File

@ -386,15 +386,18 @@ class WOFF2FlavorDataTest(unittest.TestCase):
self.assertEqual(flavorData.minorVersion, 1) self.assertEqual(flavorData.minorVersion, 1)
def test_mutually_exclusive_args(self): def test_mutually_exclusive_args(self):
msg = "arguments are mutually exclusive"
reader = DummyReader(self.file) reader = DummyReader(self.file)
with self.assertRaisesRegex(TypeError, "arguments are mutually exclusive"): with self.assertRaisesRegex(TypeError, msg):
WOFF2FlavorData(reader, transformedTables={"hmtx"}) WOFF2FlavorData(reader, transformedTables={"hmtx"})
with self.assertRaisesRegex(TypeError, msg):
WOFF2FlavorData(reader, data=WOFF2FlavorData())
def test_transformTables_default(self): def test_transformedTables_default(self):
flavorData = WOFF2FlavorData() flavorData = WOFF2FlavorData()
self.assertEqual(flavorData.transformedTables, set(woff2TransformedTableTags)) self.assertEqual(flavorData.transformedTables, set(woff2TransformedTableTags))
def test_transformTables_invalid(self): def test_transformedTables_invalid(self):
msg = r"'glyf' and 'loca' must be transformed \(or not\) together" msg = r"'glyf' and 'loca' must be transformed \(or not\) together"
with self.assertRaisesRegex(ValueError, msg): with self.assertRaisesRegex(ValueError, msg):
@ -1258,6 +1261,24 @@ class MainTest(object):
assert (tmpdir / "TestOTF-Regular.woff2").check(file=True) assert (tmpdir / "TestOTF-Regular.woff2").check(file=True)
def test_recompress_woff2_keeps_flavorData(self, tmpdir):
woff2_font = ttLib.TTFont(BytesIO(TT_WOFF2.getvalue()))
woff2_font.flavorData.privData = b"FOOBAR"
woff2_file = tmpdir / "TestTTF-Regular.woff2"
woff2_font.save(str(woff2_file))
assert woff2_font.flavorData.transformedTables == {"glyf", "loca"}
woff2.main(["compress", "--hmtx-transform", str(woff2_file)])
output_file = tmpdir / "TestTTF-Regular#1.woff2"
assert output_file.check(file=True)
new_woff2_font = ttLib.TTFont(str(output_file))
assert new_woff2_font.flavorData.transformedTables == {"glyf", "loca", "hmtx"}
assert new_woff2_font.flavorData.privData == b"FOOBAR"
def test_decompress_ttf(self, tmpdir): def test_decompress_ttf(self, tmpdir):
input_file = tmpdir / "TestTTF-Regular.woff2" input_file = tmpdir / "TestTTF-Regular.woff2"
input_file.write_binary(TT_WOFF2.getvalue()) input_file.write_binary(TT_WOFF2.getvalue())