1import io 2import copy 3import pickle 4import tempfile 5from fontTools.ttLib import TTFont 6from fontTools.ttLib.sfnt import calcChecksum, SFNTReader, WOFFFlavorData 7from pathlib import Path 8import pytest 9 10TEST_DATA = Path(__file__).parent / "data" 11 12 13@pytest.fixture 14def ttfont_path(): 15 font = TTFont() 16 font.importXML(TEST_DATA / "TestTTF-Regular.ttx") 17 with tempfile.NamedTemporaryFile(suffix=".ttf", delete=False) as fp: 18 font_path = Path(fp.name) 19 font.save(font_path) 20 yield font_path 21 font_path.unlink() 22 23 24def test_calcChecksum(): 25 assert calcChecksum(b"abcd") == 1633837924 26 assert calcChecksum(b"abcdxyz") == 3655064932 27 28 29EMPTY_SFNT = b"\x00\x01\x00\x00" + b"\x00" * 8 30 31 32def pickle_unpickle(obj): 33 return pickle.loads(pickle.dumps(obj)) 34 35 36class SFNTReaderTest: 37 @pytest.mark.parametrize("deepcopy", [copy.deepcopy, pickle_unpickle]) 38 def test_pickle_protocol_FileIO(self, deepcopy, tmp_path): 39 fontfile = tmp_path / "test.ttf" 40 fontfile.write_bytes(EMPTY_SFNT) 41 reader = SFNTReader(fontfile.open("rb")) 42 43 reader2 = deepcopy(reader) 44 45 assert reader2 is not reader 46 assert reader2.file is not reader.file 47 48 assert isinstance(reader2.file, io.BufferedReader) 49 assert isinstance(reader2.file.raw, io.FileIO) 50 assert reader2.file.name == reader.file.name 51 assert reader2.file.tell() == reader.file.tell() 52 53 for k, v in reader.__dict__.items(): 54 if k == "file": 55 continue 56 assert getattr(reader2, k) == v 57 58 @pytest.mark.parametrize("deepcopy", [copy.deepcopy, pickle_unpickle]) 59 def test_pickle_protocol_BytesIO(self, deepcopy, tmp_path): 60 buf = io.BytesIO(EMPTY_SFNT) 61 reader = SFNTReader(buf) 62 63 reader2 = deepcopy(reader) 64 65 assert reader2 is not reader 66 assert reader2.file is not reader.file 67 68 assert isinstance(reader2.file, io.BytesIO) 69 assert reader2.file.tell() == reader.file.tell() 70 assert reader2.file.getvalue() == reader.file.getvalue() 71 72 for k, v in reader.__dict__.items(): 73 if k == "file": 74 continue 75 assert getattr(reader2, k) == v 76 77 78def test_ttLib_sfnt_write_privData(tmp_path, ttfont_path): 79 output_path = tmp_path / "TestTTF-Regular.woff" 80 font = TTFont(ttfont_path) 81 82 privData = "Private Eyes".encode() 83 84 data = WOFFFlavorData() 85 head = font["head"] 86 data.majorVersion, data.minorVersion = map( 87 int, format(head.fontRevision, ".3f").split(".") 88 ) 89 90 data.privData = privData 91 font.flavor = "woff" 92 font.flavorData = data 93 font.save(output_path) 94 95 assert output_path.exists() 96 assert TTFont(output_path).flavorData.privData == privData 97