16个版本
0.1.18 | 2024年7月29日 |
---|---|
0.1.16 | 2024年5月22日 |
0.1.13 | 2024年3月14日 |
0.1.8 | 2023年5月6日 |
0.1.4 | 2021年7月29日 |
#2 in 数据格式
88,778 每月下载量
在 117 个crate中使用 (15 直接)
1.5MB
23K SLoC
swash
Swash 是一个纯Rust、跨平台的crate,提供字体内省、复杂文本造型和字形渲染。
目标
此crate旨在为美丽排版的跨平台、高性能组件系列奠定基础。特别是,这个库专注于字体及其直接相关的操作。在很大程度上,我们希望对资源管理、高级布局和底层渲染保持中立。
非目标
由于旨在具有普遍适用性和易于集成,以下相关领域被特别避免
-
文本布局。这是高度应用特定的,功能和性能要求在网页浏览器、文字处理器、文本编辑器、游戏引擎等之间差异很大。有一个正在开发的同级crate,它基于这个库提供通用文本布局。
-
合成。与布局一样,这也具有应用特定性和硬件依赖性。字形缓存、几何批处理和渲染都属于这里,并且应该与应用程序和硬件环境很好地集成。
通用功能
- 简单的借用字体表示,不强制资源管理,导致...
- 线程友好的架构。加速结构完全独立于字体数据,并且可以按线程保留,随时丢弃和重新物质化
- 零临时堆分配。所有刮擦缓冲区和缓存都由上下文维护。属于被驱逐缓存条目的资源将立即重用
内省
- 枚举字体集合(ttc/otc)
- 本地化字符串,包括名称和其他元数据
- 字体变体轴和命名实例
- 全面的字体和每个字形的度量(如果没有提供,则合成垂直度量)
- 主要属性(拉伸、重量、样式),支持基于可用变体和缩放变换(仿粗体和斜体)的建议。
- 色彩方案
- 嵌入色彩和alpha位图特效
- 字符到规范字形标识符的映射,支持列举所有配对
- 书写系统:提供所有支持的字形/语言对的列表及其相关的排版特征
- 所有检查都是零分配和零复制
复杂文本形状
- 完全支持OpenType高级排版(GSUB/GPOS)
- 部分支持Apple高级排版:字形变形(morx)完全支持,而当前的扩展字距调整支持(kerx)覆盖了大多数常见情况(字距调整和标记定位)
- 完全支持可变字体,包括定位和特征替换
- 实现了通用形状引擎,用于复杂脚本,如德文尼加利语、马拉雅拉姆语等。
- 阿拉伯语连接,包括乌尔都语风格的上升行
- 基本形状支持:连字、标记、字距调整等。
- 通过参数支持启用/禁用单个功能,激活如花体等替代方案...
- 预形状集群解析,使用迭代映射技术(包括标准化),允许在不进行启发式形状运行的开销下实现复杂的字体回退机制
- 形状输出通过集群结构化,包括原始源范围,并提供简化的连字和复杂多字形集群的识别
- 每个字符的用户数据(单个u32)透传,以准确地将样式属性与字形关联
- 每个集群的信息透传,以保留文本分析结果,如单词和行边界、空白识别和emoji展示模式
缩放
- 支持全变体的可缩放轮廓(TrueType和Postscript)
- 非对称垂直提示(TrueType和Postscript)
- 水平亚像素渲染和分数定位
- 完全支持Apple(sbix)、Google(CBLC/CBDT)和Microsoft(COLR/CPAL)格式的emoji
- 路径效果(描边和虚线)
- 变换,包括合成加粗和仿射变换
- 可定制的字形源优先级(最佳拟合颜色位图 -> 精确尺寸alpha位图 -> 轮廓)
文本分析
- 与布局和形状相关的Unicode字符属性
- 字符组合和分解(规范和兼容)
- 复杂、脚本感知的集群分割
- 单次遍历、基于迭代器的分析确定单词和行边界,并检测是否需要bidi解析
性能
性能是这个crate的主要目标,初步的微基准测试显示,平均比FreeType和Harfbuzz提高了约10-20%,某些情况下显示显著的优势,尤其是在缩放Postscript轮廓或对具有复杂特征的文本进行形状时。具体来说,使用如Calibri和Noto Sans Myanmar等字体进行形状运行的效率几乎是两倍。简单的字体和纯ASCII运行往往显示最小的增益,因为这些只是简单地测量形状初始化和字形迭代。需要一套全面的基准测试(以及测试案例!)来获得更多见解并跟踪回归。
贡献
欢迎和感谢贡献!所有贡献都必须根据此项目发布的许可证进行授予。
依赖
~4.5MB
~99K SLoC