#svg #text-layout #text-rendering #render #spec

usvgr-text-layout

一个 SVG 文本布局实现

10 个版本

1.1.1 2024 年 3 月 21 日
0.30.0 2024 年 3 月 22 日
0.28.9 2024 年 3 月 21 日
0.28.5 2023 年 10 月 2 日
0.27.0 2023 年 1 月 23 日

169图像

30 每月下载量
用于 fframes_renderer

MPL-2.0 许可证

70KB
1.5K SLoC

resvg

Build Status Crates.io Documentation Rust 1.65+

resvg 是一个 SVG 渲染库。

它可以作为一个 Rust 库、C 库以及 CLI 应用程序来渲染静态 SVG 文件。

核心思想是创建一个快速、小巧、可移植的 SVG 库,目标是支持整个 SVG 规范。

功能

专为边缘情况设计

SVG 是一个非常复杂的格式,具有庞大的规范(SVG 1.1 约有 900 页)。您基本上需要一个网络浏览器来处理所有这些。但事实是,即使是浏览器在这方面也会失败(见 SVG 支持)。是的,与 resvg 不同,浏览器确实支持动态 SVG 功能,如动画和脚本。但使用浏览器来正确渲染 SVG 是一个不可行的选择。

为了证明其正确性,resvg 拥有一个庞大的测试套件,包括大约 1600 个测试。这只是 SVG-to-PNG 回归测试。这还不包括 resvg 依赖项中的测试。最好的是,resvg 的测试套件对每个人都是可用的。它与 resvg 没有任何关联。这应该有助于那些计划开发自己的 SVG 库的人。

安全性

当我们谈论 Rust 和处理随机输入时的安全性时,很难不提到它。我们谈论的不仅是 SVG/XML,还包括 CSS、TTF、PNG、JPEG、GIF 和 GZIP。

虽然 resvg 不是用 Rust 编写的唯一 SVG 库,但它是用 Rust 完全编写的唯一 SVG 库。最终二进制文件中没有非 Rust 代码。

此外,几乎没有不安全的代码。然而,一些依赖项中包含一些不安全的代码,而字体内存映射本身也是不安全的,但在内存安全性方面这是你能做到的最好。

然而,这不仅仅关乎内存安全性。resvg有广泛的检查来防止无限循环(冻结)和栈溢出(通过递归)。

无膨胀

目前,resvg的CLI应用程序大小不到3MB,且不依赖任何外部依赖项。二进制文件中不包含渲染SVG文件不需要的内容。

便携性

resvg保证在你可以编译Rust的所有地方都能工作,包括WASM。在某些CPU架构和移动操作系统(主要是系统字体加载)方面可能会有一些粗糙的边缘,但其他方面应该相当顺利。

SVG预处理

与其他SVG渲染库相比,另一个主要区别是resvg中的SVG解析和渲染是完全独立的两个步骤。这些步骤也分成了两个独立的库:resvgusvg。这意味着你可以轻松地在usvg之上编写自己的渲染器,使用你喜欢的任何2D库。

性能

比较不同SVG渲染库的性能就像比较苹果和橙子一样。每个人的支持特性、语言、构建标志等都非常不同。无论如何,由于resvg是用Rust编写的,并使用tiny-skia进行渲染,所以它相当快。应该还有相当多的改进空间。

可重复性

由于resvg不依赖于任何系统库,这使我们能够在所有支持的平台上获得可重复的结果。这意味着如果你在x86 Windows上渲染一个SVG文件,然后在其上渲染ARM macOS,生成的图像将是相同的。每个像素的值都相同。

局限性

  • 没有动画
    也没有计划实现它们。
  • 没有原生文本渲染
    resvg不依赖于任何系统库,这意味着我们无法使用原生文本渲染。尽管如此,原生文本渲染是针对小水平文本进行优化的,这在SVG中并不常见。
  • 仅限Unicode
    现在是21世纪。未使用UTF-8编码的文本文件已经不再相关。

SVG支持

resvg旨在只支持静态 SVG子集;即不支持ascriptviewcursor元素,不支持事件和动画。

SVG 2的支持正在开发中。您可以通过svg2标签或我们的SVG 2更改日志查找相关的问题。

SVG Tiny 1.2不受支持,并且也没有计划支持。

resvg测试套件的结果

仅SVG 2的结果

您可以在这里找到支持的特性的完整表。它还包括一些替代库。

我们不是针对所有SVG库进行测试,因为其中许多都很差。一些库没有列入名单,因为它们没有通过25%的标记。这些库包括:wxSvg、LunaSVG和nanosvg。

resvg项目

resvg 作为 和作为 项目 之间存在着微妙的区别。虽然大多数用户只会与 resvg 库进行交互,但这只是冰山一角。为了使 resvg 成为可能,我不得不编写许多库。以下是其中一些:

  • resvg - 实际的 SVG 渲染器
  • usvg - SVG 预处理器/简化器
  • tiny-skia - 将 Skia 子集移植到 Rust 的库
  • rustybuzz - 将 harfbuzz 子集移植到 Rust 的库
  • ttf-parser - TrueType/OpenType 字体解析器
  • fontdb - 简单的内存字体数据库,具有类似 CSS 的查询
  • roxmltree - XML 解析库
  • simplecss - 非常不错的 CSS 2 解析器和选择器
  • pico-args - 极其最小化但出奇受欢迎的命令行参数解析器

因此,虽然 resvg 的大小令人难以置信的小(大约 2500 行代码),但 resvg 项目 的代码行数接近 75,000 行。考虑到 resvg 所能做的事情,这并不算多。这绝对是当前最小的选择之一。

许可证

resvg 项目采用 MPLv2.0 许可。

依赖关系

~7.5MB
~144K SLoC