45 lines
1.2 KiB
Python
45 lines
1.2 KiB
Python
|
"""
|
||
|
Text layouting utilities.
|
||
|
"""
|
||
|
|
||
|
import dataclasses
|
||
|
|
||
|
from .ft2font import KERNING_DEFAULT, LOAD_NO_HINTING
|
||
|
|
||
|
|
||
|
LayoutItem = dataclasses.make_dataclass(
|
||
|
"LayoutItem", ["char", "glyph_idx", "x", "prev_kern"])
|
||
|
|
||
|
|
||
|
def layout(string, font, *, kern_mode=KERNING_DEFAULT):
|
||
|
"""
|
||
|
Render *string* with *font*. For each character in *string*, yield a
|
||
|
(glyph-index, x-position) pair. When such a pair is yielded, the font's
|
||
|
glyph is set to the corresponding character.
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
string : str
|
||
|
The string to be rendered.
|
||
|
font : FT2Font
|
||
|
The font.
|
||
|
kern_mode : int
|
||
|
A FreeType kerning mode.
|
||
|
|
||
|
Yields
|
||
|
------
|
||
|
glyph_index : int
|
||
|
x_position : float
|
||
|
"""
|
||
|
x = 0
|
||
|
prev_glyph_idx = None
|
||
|
for char in string:
|
||
|
glyph_idx = font.get_char_index(ord(char))
|
||
|
kern = (font.get_kerning(prev_glyph_idx, glyph_idx, kern_mode) / 64
|
||
|
if prev_glyph_idx is not None else 0.)
|
||
|
x += kern
|
||
|
glyph = font.load_glyph(glyph_idx, flags=LOAD_NO_HINTING)
|
||
|
yield LayoutItem(char, glyph_idx, x, kern)
|
||
|
x += glyph.linearHoriAdvance / 65536
|
||
|
prev_glyph_idx = glyph_idx
|