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