Coalesce neighboring symbol maps for better lookup performance

This commit is contained in:
Kovid Goyal 2019-11-12 20:05:48 +05:30
parent 83932c8099
commit a649eb2a48
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 29 additions and 2 deletions

View File

@ -25,8 +25,29 @@ else:
current_faces = None current_faces = None
def coalesce_symbol_maps(maps):
if not maps:
return maps
items = tuple((k, maps[k]) for k in sorted(maps))
ans = [items[0]]
def merge(prev_item, item):
s, e = item[0]
pe = prev_item[0][1]
ans[-1] = ((prev_item[0][0], max(pe, e)), prev_item[1])
for item in items[1:]:
current_item = ans[-1]
if current_item[1] != item[1] or item[0][0] > current_item[0][1] + 1:
ans.append(item)
else:
merge(current_item, item)
return dict(ans)
def create_symbol_map(opts): def create_symbol_map(opts):
val = opts.symbol_map val = coalesce_symbol_maps(opts.symbol_map)
family_map = {} family_map = {}
count = 0 count = 0
for family in val.values(): for family in val.values():

View File

@ -11,7 +11,9 @@ from kitty.fast_data_types import (
test_render_line, test_sprite_position_for, wcwidth test_render_line, test_sprite_position_for, wcwidth
) )
from kitty.fonts.box_drawing import box_chars from kitty.fonts.box_drawing import box_chars
from kitty.fonts.render import render_string, setup_for_testing, shape_string from kitty.fonts.render import (
coalesce_symbol_maps, render_string, setup_for_testing, shape_string
)
from . import BaseTest from . import BaseTest
@ -122,3 +124,7 @@ class Rendering(BaseTest):
finally: finally:
sys.stderr = orig sys.stderr = orig
self.assertIn('LastResort', buf.getvalue()) self.assertIn('LastResort', buf.getvalue())
def test_coalesce_symbol_maps(self):
q = {(2, 3): 'a', (4, 6): 'b', (5, 5): 'b', (7, 7): 'b', (9, 9): 'b', (1, 1): 'a'}
self.ae(coalesce_symbol_maps(q), {(1, 3): 'a', (4, 7): 'b', (9, 9): 'b'})