2个不稳定版本
0.4.0 | 2024年6月28日 |
---|---|
0.3.0 | 2024年5月19日 |
431 在 编码
每月下载量 46
在 2 个crate中使用(通过 mkwebfont_fontops)
2MB
39K SLoC
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.md 或 https://opensource.org/licenses/MIT)。
该仓库包含HarfBuzz作为子模块,并与其链接。它采用"旧版MIT"许可协议。
该仓库还包含用于测试目的的NotoSans 字体副本,位于tests/fonts
。它采用SIL开放字体许可协议,版本1.1。
依赖项
~0.3–2.7MB
~55K SLoC