3个不稳定版本
0.3.0 | 2023年11月12日 |
---|---|
0.2.1 | 2023年11月6日 |
0.2.0 | 2023年11月4日 |
0.1.0 |
|
#813 在 编码
在 mkwebfont 中使用
2MB
38K SLoC
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.md或https://opensource.org/licenses/MIT)。
此存储库包含HarfBuzz作为子模块,并链接到它。它使用"旧MIT"许可证。
此存储库还包含一个用于测试目的的NotoSans字体副本,位于tests/fonts
中。它采用SIL开源字体许可证,版本1.1。
依赖项
~0.3–2.7MB
~56K SLoC