Created: November 27, 2022

Last modified: December 23, 2025

How to get text to screen: text rendering

background

comparison

library language reading shaping rendering itemization bidi line breaking cursors1
freetype C yes no cpu no no no no
harfbuzz C/C++ no yes no no no no no
glyphy C++ no no gpu no no no no
fribidi C no no no no yes no no
pango C freetype harfbuzz cairo/xft/glyphy fontconfig fribidi yes yes
libraqm C freetype harfbuzz no no fribidi/sheenbidi no no
ttf-parser rust yes no no no no no no
rusttype2 rust ttf-parser no gpu no no no no
ab_glyph rust ttf-parser            
ab_glyph_rasterizer rust              
glyph_brush rust              
gfx_glyph rust              
glyph_brush_layout rust              
glyph_brush_draw_cache rust              
fontdue rust ttf-parser no cpu no no yes yes
rustybuzz rust ttf-parser yes no no no no no
swash rust yes yes cpu via zeno no no no no
allsorts rust yes yes no no no no no
fount rust no no no yes no no no
parley rust swash swash no fount yes limited yes
kas-text rust ttf-parser rustybuzz abglyph/fontdue fontdb unicode-bidi limited no
cosmic-text rust ttf-parser rustybuzz swash fontdb unicode-bidi unicode-linebreak yes
fontdb rust ttf-parser no no yes3 no no no
unicode-linebreak rust no no no no no yes no
unicode-bidi rust no no no no yes no no
font-kit rust/platform platform no platform yes no no no
skribo rust font-kit harfbuzz font-kit font-kit no no no
piet rust/platform platform platform platform platform platform platform yes4
pathfinder rust font-kit no gpu font-kit no no no
femtovg rust ttf-parser rustybuzz gpu no unicode-bidi no5 no
glyphon                

some notes:

bidi stuff

unicode stuff

data structures and rendering models

latex and latex alternatives

Footnotes:

1

Note that cursors are “trivial” when not performing shaping or supporting bidi so long as libraries expose an api to get the locations of laid-out glyphs

3

No default font fallback