Source for: fonts.py [raw]
1import harfbuzz as hb
2import freetype2 as ft
3
4
5def adjust_widths_by_letter(boxes):
6 """Takes a list of boxes as arguments, and uses harfbuzz to
7 adjust the width of each box to match the harfbuzz text shaping."""
8 buf = hb.Buffer.create()
9 buf.add_str("".join(b.letter for b in boxes))
10 buf.guess_segment_properties()
11 font_lib = ft.get_default_lib()
12 face = font_lib.find_face("Arial")
13 face.set_char_size(size=1, resolution=64)
14 font = hb.Font.ft_create(face)
15 hb.shape(font, buf)
16 # at this point buf.glyph_positions has all the data we need
17 for box, position in zip(boxes, buf.glyph_positions):
18 # For us, newlines should have zero width
19 if box.letter != "\n":
20 box.w = position.x_advance
21 else:
22 box.w = 0
23