#harfbuzz #shaping #text #ffi #textlayout

harfbuzz_rs

HarfBuzz 的高级接口,使用 Rust 以安全的方式公开其最重要的功能。

11 个版本 (7 个稳定版)

2.0.1 2021 年 8 月 28 日
1.2.0 2020 年 8 月 7 日
1.1.2 2020 年 7 月 13 日
1.0.1 2020 年 1 月 18 日
0.1.0 2018 年 1 月 11 日

#191 in 渲染

Download history 356/week @ 2024-03-14 291/week @ 2024-03-21 478/week @ 2024-03-28 708/week @ 2024-04-04 699/week @ 2024-04-11 773/week @ 2024-04-18 634/week @ 2024-04-25 551/week @ 2024-05-02 548/week @ 2024-05-09 730/week @ 2024-05-16 693/week @ 2024-05-23 920/week @ 2024-05-30 1093/week @ 2024-06-06 720/week @ 2024-06-13 839/week @ 2024-06-20 514/week @ 2024-06-27

每月下载量 3,344
39 个 crate (4 个直接使用) 中使用

MIT 许可证

205KB
2.5K SLoC

harfbuzz_rs

Crates.io Documentation Build Status Build status

harfbuzz_rs 是 HarfBuzz 的高级接口,使用 Rust 以安全的方式公开其最重要的功能。

什么是 HarfBuzz?

HarfBuzz 是一个执行复杂文本布局的库。它不执行任何绘制操作。这是一个相当底层的操作。如果你只想在屏幕上绘制一些文本,你可能需要选择另一个更高级的库。但是,如果你想要构建一个在画布上绘制文本的库或需要大量控制高级文本布局,那么这个库就是正确的选择。

入门指南

要调整一段简单的文本,你需要从字体文件创建一个 Font,用一些文本填充一个 Buffer,然后调用 shape 函数。

use harfbuzz_rs::*;

let path = "path/to/some/font_file.otf";
let index = 0; //< face index in the font file
let face = Face::from_file(path, index)?;
let mut font = Font::new(face);

let buffer = UnicodeBuffer::new().add_str("Hello World!");
let output = shape(&font, buffer, &[]);

// The results of the shaping operation are stored in the `output` buffer.

let positions = output.get_glyph_positions();
let infos = output.get_glyph_infos();

// iterate over the shaped glyphs
for (position, info) in positions.iter().zip(infos) {
    let gid = info.codepoint;
    let cluster = info.cluster;
    let x_advance = position.x_advance;
    let x_offset = position.x_offset;
    let y_offset = position.y_offset;

    // Here you would usually draw the glyphs.
    println!("gid{:?}={:?}@{:?},{:?}+{:?}", gid, cluster, x_advance, x_offset, y_offset);
}

这将打印出类似以下的内容

gid41=0@741,0+0
gid70=1@421,0+0
gid77=2@258,0+0
gid77=3@253,0+0
gid80=4@510,0+0
gid1=5@227,0+0
gid56=6@874,0+0
gid80=7@498,0+0
gid83=8@367,0+0
gid77=9@253,0+0
gid69=10@528,0+0
gid2=11@276,0+0

默认情况下,x_advancex_offsety_advancey_offset 的值都是以所谓的 字体单位 表示。通过调用 face.upem(),你可以得到特定 face 的每个 EM 所对应的字体单位数。这个 upem 值可以用来将进位和偏移缩放到给定的字体大小。例如,如果你想要以 16 点 (pt) 的大小显示字体,这意味着 1 EM = 16 pt。在这个例子中,要将一个值,比如 x_advance,从字体单位转换为点,我们计算 ((x_advance * font_size) as f64) / (upem as f64),其中 font_size = 16 是一个变量,指定了以点为单位的字体大小。

注意,harfbuzz 内部也支持自身缩放字体(使用 font.set_scale(...) 等),但在我看来,像上面段落中描述的那样自己缩放结果更容易。

支持的 HarfBuzz 版本

这个包经过测试,可以与 HarfBuzz 2.0 及更高版本一起使用。较旧版本也可能一样工作。我建议静态链接 harfbuzz-sys 包提供的 harfbuzz 库,该库始终保持最新。

可选功能

如果你想使用 rusttype 作为字体函数,请启用 rusttype 功能。

依赖项

~2.2–3.5MB
~75K SLoC