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

mkwebfont_hb-subset

HarfBuzz字体子集API的包装器

2个不稳定版本

0.4.0 2024年6月28日
0.3.0 2024年5月19日

431编码

每月下载量 46
2 个crate中使用(通过 mkwebfont_fontops

MIT 许可证

2MB
39K SLoC

C++ 33K 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

mkwebfont_hb-subset

HarfBuzz子集API的Rust包装器

此crate公开了HarfBuzz API以进行字体子集操作。

这是针对mkwebfont修改的,并且仍然得到维护,与原始的hb-subset不同。为了简化并减少依赖,已删除对使用未捆绑版本的hb-subset的支持。

什么是子集?

来自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())?;

许可证

此crate在MIT许可证下发布(LICENSE.mdhttps://opensource.org/licenses/MIT)。

该仓库包含HarfBuzz作为子模块,并与其链接。它采用"旧版MIT"许可协议

该仓库还包含用于测试目的的NotoSans 字体副本,位于tests/fonts。它采用SIL开放字体许可协议,版本1.1

依赖项

~0.3–2.7MB
~55K SLoC