#opentype #true-type #otf

no-std ab_glyph

API for loading, scaling, positioning and rasterizing OpenType font glyphs

28 releases

new 0.2.25 Apr 13, 2024
0.2.23 Oct 30, 2023
0.2.21 Apr 21, 2023
0.2.20 Feb 3, 2023
0.2.5 Jul 24, 2020

#100 in Images

Download history 35193/week @ 2023-12-23 49961/week @ 2023-12-30 62637/week @ 2024-01-06 66273/week @ 2024-01-13 70137/week @ 2024-01-20 61848/week @ 2024-01-27 67575/week @ 2024-02-03 66338/week @ 2024-02-10 71191/week @ 2024-02-17 72253/week @ 2024-02-24 73552/week @ 2024-03-02 72448/week @ 2024-03-09 69852/week @ 2024-03-16 75621/week @ 2024-03-23 74305/week @ 2024-03-30 58516/week @ 2024-04-06

288,602 downloads per month
Used in 945 crates (34 directly)

Apache-2.0

85KB
1.5K SLoC

ab_glyph crates.io Documentation

Fast API for loading, scaling, positioning and rasterizing OpenType font glyphs.

use ab_glyph::{FontRef, Font, Glyph, point};

let font = FontRef::try_from_slice(include_bytes!("../../dev/fonts/Exo2-Light.otf"))?;

// Get a glyph for 'q' with a scale & position.
let q_glyph: Glyph = font.glyph_id('q').with_scale_and_position(24.0, point(100.0, 0.0));

// Draw it.
if let Some(q) = font.outline_glyph(q_glyph) {
    q.draw(|x, y, c| { /* draw pixel `(x, y)` with coverage: `c` */ });
}

no_std

no_std environments are supported using alloc & libm.

ab_glyph = { default-features = false, features = ["libm"] }

Comparison with rusttype

ab_glyph is a rewrite of rusttype made after I added .otf support for the latter and saw some performance issue's with the rusttype API.

ab_glyph is a more focussed API concentrating on high performance for both .ttf & .otf fonts.

When laying out glyphs into paragraph, ab_glyph is faster than rusttype using .ttf fonts & much faster for .otf fonts.

group                               ab-glyph                    rusttype 0.9
-----                               --------                    ------------
layout_a_sentence (exo2-ttf)        1.00     11.1±0.08µs        1.56     17.3±0.14µs
layout_a_sentence (exo2-otf)        1.00     11.1±0.12µs        8.85     98.1±1.17µs

Note: Numbers from May-2020 benchmarks, ab-glyph performance is also expected to have improved since then.

Dependencies

~1MB
~19K SLoC