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): |     def test_binary_parameters(self): | ||||||
|         cases = { |         cases = { | ||||||
|             39: (5, 64, 14), |             39: (32, 5), | ||||||
|             10: (3, 16, 4) |             10: (8, 3), | ||||||
|  |             19: (16, 4) | ||||||
|         } |         } | ||||||
|         for n, result in cases.items(): |         for n, result in cases.items(): | ||||||
|             self.assertEqual(binary_search_parameters(n), result) |             self.assertEqual(binary_search_parameters(n), result) | ||||||
|   | |||||||
| @@ -118,7 +118,7 @@ class TTFSubset: | |||||||
|         self.cmap_ranges[-1].iddelta = 0 |         self.cmap_ranges[-1].iddelta = 0 | ||||||
|  |  | ||||||
|         seg_count = len(self.cmap_ranges) |         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 |         length = 16 + 8 * seg_count + len(self.glyph_to_char) + 1 | ||||||
|  |  | ||||||
|         data = [ |         data = [ | ||||||
| @@ -195,7 +195,8 @@ class TTFSubset: | |||||||
|         st.coverage = 1 |         st.coverage = 1 | ||||||
|         kern.write(st.as_bytes()) |         kern.write(st.as_bytes()) | ||||||
|         kern.write(pack(">H", len(entries))) |         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(): |         for key, diff in entries.items(): | ||||||
|             kern.write(pack(">HHh", key[0], key[1], diff)) |             kern.write(pack(">HHh", key[0], key[1], diff)) | ||||||
|  |  | ||||||
| @@ -220,7 +221,9 @@ class TTFSubset: | |||||||
|         header.version_raw = 0x00010000 |         header.version_raw = 0x00010000 | ||||||
|  |  | ||||||
|         output = BytesIO() |         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()) |         output.write(header.as_bytes()) | ||||||
|  |  | ||||||
|         head_offset = 0 |         head_offset = 0 | ||||||
|   | |||||||
| @@ -98,15 +98,14 @@ def binary_search_parameters(length): | |||||||
|     """ The TTF specification has several places that require binary search |     """ The TTF specification has several places that require binary search | ||||||
|         parameters. For an example look at the CMAP Format 4 table. |         parameters. For an example look at the CMAP Format 4 table. | ||||||
|     :param length: The range over which the search will be performed. |     :param length: The range over which the search will be performed. | ||||||
|     :return: The 3 parameters required. |     :return: The 2 parameters required. | ||||||
|     """ |     """ | ||||||
|     search_range = 2 |     search_range = 2 | ||||||
|     entry_selector = 1 |     entry_selector = 1 | ||||||
|     while search_range * 2 <= length: |     while search_range * 2 <= length: | ||||||
|         search_range *= 2 |         search_range *= 2 | ||||||
|         entry_selector += 1 |         entry_selector += 1 | ||||||
|     search_range *= 2 |     return search_range, entry_selector | ||||||
|     return entry_selector, search_range, 2 * length - search_range |  | ||||||
|  |  | ||||||
|  |  | ||||||
| class Range: | class Range: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user