#font #shaping #opentype #true-type #parse #parser

no-std allsorts_no_std

OpenType、WOFF和WOFF2的字体解析器、形变引擎和子集器

1个不稳定版本

0.5.2 2021年3月6日

#1378文本处理

Apache-2.0

1MB
22K SLoC


Allsorts

用Rust实现的OpenType、WOFF和WOFF2的字体解析器、形变引擎和子集器


Allsorts是一个完全用Rust编写的字体解析器、形变引擎和子集器,用于OpenType、WOFF和WOFF2。它是从Prince工具中提取出来的,该工具可以将HTML和CSS文档排版成PDF。

Allsorts形变引擎是与OpenType形变规范一起开发的,该规范旨在指定OpenType字体形变行为。

特性

  • 解析 TrueType(ttf)、OpenType(otf)、WOFF和WOFF2文件。
  • 形变 阿拉伯语、西里尔语、希腊语、希伯来语、印度语系(孟加拉语、德文那加利语、古吉拉特语、古尔木基语、卡纳达语、马拉雅拉姆语、奥里亚语、泰米尔语、泰卢固语)、拉丁语、叙利亚语和其他语系。
  • 子集 从TrueType、OpenType、WOFF和WOFF2文件中提取到OpenType。

什么是字体形变?

字体形变是从Unicode码点形式的文本和字体中提取字形的过程,并根据文本将字体中的字形布局。这涉及到遵守字体指定的字距调整、连字和替换。对于某些语言来说,这相对简单。对于其他语言,如印度语系,这相当复杂。形变后,其他库如PathfinderFreeType负责渲染字形。要了解更多关于文本渲染的信息,Andrea Cognolato有一个很好的关于Linux上现代字体渲染的概述。其他平台的概念类似。

示例

请参考Allsorts工具仓库,该仓库包含三个测试Allsorts字体解析、形变和子集的工具。

未实现的功能/已知问题

我们目前不支持

  • 形变高棉语、蒙古语、僧伽罗语和藏语。
  • 苹果的morx表
  • Unicode标准化。

已知限制

  • 该crate的文档尚不完善(#5)。
  • 所有字体不支持字体查找/匹配。为此,建议使用类似 font-kit 的工具。
  • 目前子集实现主要针对PDF字体嵌入(主要针对 cmap0 参数到 子集函数)。

开发状态

所有字体仍在积极开发中,但已达到第一个里程碑,即在Prince 13中包含。在Prince中,它负责所有字体加载和字体形状。

目前字体解析代码是手写的。计划最终通过我们的 声明性数据定义语言项目 用机器生成的代码替换。

平台支持

所有字体的CI在Linux、macOS和Windows上运行测试。通过Prince,它还支持FreeBSD。

构建和测试

最低支持的Rust版本 1.38.0

要构建包,请确保已安装 Rust 1.38.0 或更高版本

使用 cargo build 构建,并使用 cargo test 运行测试。

贡献

欢迎贡献,请参阅 贡献文档 了解更多详情。

行为准则

我们旨在遵守Rust社区标准

我们致力于为所有人提供一个友好、安全、包容的环境,无论其性别、性取向、残疾、种族、宗教或类似个人特征。

我们遵循 Rust行为准则

致谢

  • OpenType形状文档 构成了形状引擎实现的规范。
  • Harfbuzz 是广泛使用的开源字体形状引擎,被用作测试输出的参考。
  • Adobe Annotated OpenType Specification 测试套件被用作Allsorts测试套件的一部分。

许可

所有字体根据Apache许可证(版本2.0)分发。

有关详情,请参阅 LICENSE

依赖

~8.5MB
~231K SLoC