After reviewing the binary search parameters again, change things round
a little to make it more useful and more consistent. Add an additional test case.
This commit is contained in:
		| @@ -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) | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user