#font #harfbuzz #subsetting #code-point #api-bindings

hb-subset

HarfBuzz 字体子集API的包装器

3个不稳定版本

0.3.0 2023年11月12日
0.2.1 2023年11月6日
0.2.0 2023年11月4日
0.1.0 2023年11月2日

#813编码


mkwebfont 中使用

MIT 许可证

2MB
38K SLoC

C++ 32K SLoC // 0.3% comments Python 3.5K SLoC // 0.1% comments Rust 2K SLoC // 0.0% comments Automake 529 SLoC // 0.0% comments C 32 SLoC // 0.4% comments Pan 6 SLoC // 0.3% comments

crates.io docs.rs

hb-subset

Rust 对 HarfBuzz 子集API的包装

这个crate公开了HarfBuzz API用于字体子集。

什么是子集?

来自HarfBuzz文档

子集减少了字体文件的码点覆盖率,并删除了所有不再需要的数据。子集输入描述了所需的子集。输入与字体一起提供给子集操作。输出是一个新的字体文件,其中只包含输入中指定的数据。

目前支持大多数轮廓和位图表:glyf, CFF, CFF2, sbix, COLR, 和 CBDT/CBLC。这还包括通过OpenType变体具有可变轮廓的字体。值得注意的是,EBDT/EBLC和SVG不受支持。布局子集仅支持OpenType Layout表(GSUB, GPOS, GDEF)。值得注意的是,石墨或AAT表的子集尚不支持。

具有石墨或AAT表的字体可能仍然可以进行子集,但可能需要使用保留字形ID选项,并将子集配置为未修改地通过布局表。

换句话说,子集允许您从一个大字体构建一个新的、更小的字体,该字体仅包含您需要的字符。但请务必检查字体的许可证,因为并非所有字体都可以合法地进行子集。

为什么?

许多现代字体可以包含数百甚至数千个字形,其中只有几十个或一百个在任何单个文档中需要。这也意味着,与现代字体相比,现代字体可能非常庞大。解决这个问题的是字体子集:我们可以构建一个只包含文档需要的字形和特性的字体。

用法

构建字体子集的最简单方法是使用[subset()]函数。在以下示例中,我们只保留显示任何组合的字符'a'、'b'和'c'所需的所有字形,例如“abc”和“cabba”可以渲染,但“foobar”不能。

let font = fs::read("tests/fonts/NotoSans.ttf")?;
let subset_font = hb_subset::subset(&font, "abc".chars())?;
fs::write("tests/fonts/subset.ttf", subset_font)?;

要更精细地控制字体的子集以及包含的内容,可以直接使用低级API。

// Load font directly from a file
let font = Blob::from_file("tests/fonts/NotoSans.ttf")?;
let font = FontFace::new(font)?;

// Construct a subset manually and include only some of the letters
let mut subset = SubsetInput::new()?;
subset.unicode_set().insert('f');
subset.unicode_set().insert('i');

// Subset the font using just-constructed subset input
let new_font = subset.subset_font(&font)?;

// Extract the raw font and write to an output file
std::fs::write("tests/fonts/subset.ttf", &*new_font.underlying_blob())?;

使用捆绑的HarfBuzz版本

默认情况下,此crate使用系统HarfBuzz安装。如果不可用或版本太旧,此crate还可以通过使用功能bundled使用捆绑的HarfBuzz副本。

cargo add hb-subset --features bundled

许可证

此软件包采用MIT许可证授权(请参阅LICENSE.mdhttps://opensource.org/licenses/MIT)。

此存储库包含HarfBuzz作为子模块,并链接到它。它使用"旧MIT"许可证

此存储库还包含一个用于测试目的的NotoSans字体副本,位于tests/fonts中。它采用SIL开源字体许可证,版本1.1

依赖项

~0.3–2.7MB
~56K SLoC