diff --git a/tests/utils_test.py b/tests/utils_test.py index a1c506b..7fe138e 100644 --- a/tests/utils_test.py +++ b/tests/utils_test.py @@ -16,8 +16,9 @@ class TestUtils(unittest.TestCase): def test_binary_parameters(self): cases = { - 39: (5, 64, 14), - 10: (3, 16, 4) + 39: (32, 5), + 10: (8, 3), + 19: (16, 4) } for n, result in cases.items(): self.assertEqual(binary_search_parameters(n), result) diff --git a/zttf/subset.py b/zttf/subset.py index 0103c73..3e9bbe7 100644 --- a/zttf/subset.py +++ b/zttf/subset.py @@ -118,7 +118,7 @@ class TTFSubset: self.cmap_ranges[-1].iddelta = 0 seg_count = len(self.cmap_ranges) - src_range, entry_selector, range_shift = binary_search_parameters(seg_count * 2) + src_range, entry_selector = binary_search_parameters(seg_count * 2) length = 16 + 8 * seg_count + len(self.glyph_to_char) + 1 data = [ @@ -195,7 +195,8 @@ class TTFSubset: st.coverage = 1 kern.write(st.as_bytes()) kern.write(pack(">H", len(entries))) - kern.write(pack(">HHH", *binary_search_parameters(len(entries)))) + src_rng, sel = binary_search_parameters(len(entries)) + kern.write(pack(">HHH", src_rng, sel, len(entries) - sel * calcsize(">HHH"))) for key, diff in entries.items(): kern.write(pack(">HHh", key[0], key[1], diff)) @@ -220,7 +221,9 @@ class TTFSubset: header.version_raw = 0x00010000 output = BytesIO() - header.entry_selector, header.search_range, header.range_shift = binary_search_parameters(len(self.tables)) + header.search_range, header.entry_selector = binary_search_parameters(len(self.tables)) + header.search_range *= 16 + header.range_shift = len(self.tables) * 16 - header.search_range output.write(header.as_bytes()) head_offset = 0 diff --git a/zttf/utils.py b/zttf/utils.py index b878a13..f137a27 100644 --- a/zttf/utils.py +++ b/zttf/utils.py @@ -98,15 +98,14 @@ def binary_search_parameters(length): """ The TTF specification has several places that require binary search parameters. For an example look at the CMAP Format 4 table. :param length: The range over which the search will be performed. - :return: The 3 parameters required. + :return: The 2 parameters required. """ search_range = 2 entry_selector = 1 while search_range * 2 <= length: search_range *= 2 entry_selector += 1 - search_range *= 2 - return entry_selector, search_range, 2 * length - search_range + return search_range, entry_selector class Range: