#opentype #true-type #otf

no-std ab_glyph

OpenType 字体符号的加载、缩放、定位和光栅化 API

31 个版本

0.2.28 2024 年 7 月 4 日
0.2.26 2024 年 5 月 10 日
0.2.23 2023 年 10 月 30 日
0.2.21 2023 年 4 月 21 日
0.2.5 2020 年 7 月 24 日

#62图像

Download history 79427/week @ 2024-05-04 86122/week @ 2024-05-11 81723/week @ 2024-05-18 83304/week @ 2024-05-25 89394/week @ 2024-06-01 96015/week @ 2024-06-08 97236/week @ 2024-06-15 96737/week @ 2024-06-22 92090/week @ 2024-06-29 93807/week @ 2024-07-06 95580/week @ 2024-07-13 99594/week @ 2024-07-20 94165/week @ 2024-07-27 96800/week @ 2024-08-03 121180/week @ 2024-08-10 87317/week @ 2024-08-17

416,600 每月下载量
用于 1,131 个crate (47 直接)

Apache-2.0

88KB
1.5K SLoC

ab_glyph crates.io 文档

快速加载、缩放、定位和光栅化 OpenType 字体符号的 API。

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

使用 alloclibm 支持 no_std 环境。

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

rusttype 的比较

在为 rusttype 添加 .otf 支持后,我看到了 rusttype API 中的一些性能问题,因此重新编写了 ab_glyph。

ab_glyph 是一个更专注于高性能的 API,针对 .ttf 和 .otf 字体。

当将符号布局到段落中时,ab_glyph 使用 .ttf 字体比 rusttype 快,对于 .otf 字体则快得多。

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

注意:以下数据来自 2020 年 5 月的基准测试,ab-glyph 的性能自那时以来也有望得到提升.

依赖项

~1MB
~20K SLoC