2个版本
0.1.1 | 2023年3月19日 |
---|---|
0.1.0 | 2022年10月14日 |
#550 in 压缩
每月3,952次下载
在7个crate(3个直接使用)中使用
61KB
1.5K SLoC
subsetter
通过TrueType或CFF轮廓减少OpenType字体的尺寸和覆盖范围。
[dependencies]
subsetter = "0.1"
示例
在下面的示例中,我们移除了除了ID为68、69、70的符号之外的所有符号。这些符号对应于字母'a'、'b'和'c'。
use subsetter::{subset, Profile};
// Read the raw font data.
let data = std::fs::read("fonts/NotoSans-Regular.ttf")?;
// Keep only three glyphs and the OpenType tables
// required for embedding the font in a PDF file.
let glyphs = &[68, 69, 70];
let profile = Profile::pdf(glyphs);
let sub = subset(&data, 0, profile)?;
// Write the resulting file.
std::fs::write("target/Noto-Small.ttf", sub)?;
值得注意的是,这个subsetter实际上并没有删除符号,只是删除了它们的轮廓。这意味着你不必担心符号ID的改变。然而,这也意味着生成的字体并不总是尽可能小。为了多少弥补这一点,这个crate有时至少将无法完全删除的未使用数据清零。这有助于在字体被压缩时,例如在PDF文件中嵌入时。
在上面的示例中,原始字体为375 KB(188 KB压缩后),而生成的字体为36 KB(5 KB压缩后)。
局限性
目前,该库仅对静态轮廓字体进行子集化。此外,它旨在用于文本已映射到符号的用例。可能的未来工作包括
- 传递变异数据的选项,这将使subsetter创建一个变量字体的静态实例。
- 位图、颜色和SVG表的子集化。
- 一个配置文件,它使用字符集而不是符号集,并子集化布局表。
安全和依赖性
该crate禁止不安全代码,并且没有依赖项。
许可证
该crate根据MIT和Apache 2.0许可证双许可。