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 数据格式

Download history 13852/week @ 2024-05-03 11905/week @ 2024-05-10 11379/week @ 2024-05-17 11690/week @ 2024-05-24 11615/week @ 2024-05-31 11168/week @ 2024-06-07 14465/week @ 2024-06-14 13347/week @ 2024-06-21 13738/week @ 2024-06-28 20239/week @ 2024-07-05 26379/week @ 2024-07-12 24793/week @ 2024-07-19 22345/week @ 2024-07-26 21380/week @ 2024-08-02 24968/week @ 2024-08-09 16793/week @ 2024-08-16

88,778 每月下载量
117 个crate中使用 (15 直接)

MIT/Apache

1.5MB
23K SLoC

swash

Swash 是一个纯Rust、跨平台的crate,提供字体内省、复杂文本造型和字形渲染。

Crates.io Docs.rs MIT licensed Apache licensed

目标

此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