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:
david reid
2015-03-21 23:20:03 +00:00
parent 8342904f7f
commit 1388af6b76
3 changed files with 11 additions and 8 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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: