10 个重大版本发布
0.38.0 | 2024 年 1 月 21 日 |
---|---|
0.37.0 | 2023 年 12 月 16 日 |
0.36.0 | 2023 年 10 月 5 日 |
0.35.0 | 2023 年 6 月 28 日 |
0.28.0 | 2022 年 12 月 3 日 |
#386 in 图像
46,883 每月下载量
在 28 个 crate 中使用(通过 svg2colored-png)
150KB
3K SLoC
resvg
resvg 是一个 SVG 渲染库。
它可以作为一个 Rust 库、C 库以及命令行应用程序来渲染静态 SVG 文件。
核心思想是创建一个快速、小巧、可移植的 SVG 库,目标是支持整个 SVG 规范。
特性
针对边缘情况设计
SVG 是一个非常复杂的格式,具有庞大的规范(SVG 1.1 几乎有 900 页)。您基本上需要一个网页浏览器来处理所有这些。但事实是,即使是浏览器在这方面也会失败(参见 SVG 支持)。是的,与 resvg
不同,浏览器确实支持动态 SVG 功能,如动画和脚本。但使用浏览器来正确渲染 SVG 是一个不可行的选择。
为了证明其正确性,resvg
具有一个庞大的测试套件,包括大约 1600 个测试。这些只是 SVG 到 PNG 的回归测试。这还不包括 resvg
依赖项中的测试。最好的是,resvg
的测试套件对每个人都是可用的。它以任何方式都与 resvg
无关。这应该有助于那些计划开发自己的 SVG 库的人。
安全性
当我们谈论 Rust 和处理随机输入时的安全性时,很难不提到它。我们谈论的不仅仅是 SVG/XML,还包括 CSS、TTF、PNG、JPEG、GIF 和 GZIP。
虽然 resvg
不是唯一用 Rust 编写的 SVG 库,但它是在 Rust 中完全编写的唯一库。最终二进制文件中没有非 Rust 代码。
此外,几乎没有 unsafe
代码。尽管如此,一些依赖项有一些 unsafe
代码,字体内存映射本质上是不安全的,但在内存安全方面这是最好的选择。
然而,这并不仅限于内存安全。《code>resvg》拥有广泛的检查来防止无限循环(冻结)和栈溢出(通过递归)。
无冗余
目前,resvg
CLI应用程序的大小不到3MB,且不需要任何外部依赖。该二进制文件中不包含任何与渲染SVG文件无关的内容。
便携性
resvg
保证在您能够编译Rust的所有地方都能工作,包括WASM。在某些不为人知的CPU架构和移动操作系统(主要是系统字体加载)方面可能有一些粗糙的边缘,但其他方面应该相当顺利。
SVG预处理
与其它SVG渲染库相比的另一个重大区别是,在resvg
中,SVG解析和渲染是完全独立的两个步骤。这些步骤也被分割成两个独立的库:resvg
和usvg。这意味着您可以在喜欢的任何2D库之上轻松编写自己的渲染器。
性能
比较不同SVG渲染库的性能就像比较苹果和橙子。每个人都有非常不同的支持功能、语言、编译标志等。无论如何,《code>resvg是用Rust编写的,并使用tiny-skia进行渲染——它相当快。还应该有相当多的改进空间。
可重复性
由于resvg
不依赖于任何系统库,这使我们能够在所有支持的平台上有可重复的结果。这意味着如果您在x86 Windows上渲染一个SVG文件,然后将其在ARM macOS上渲染——产生的图像将是相同的。每个像素都将具有相同的值。
限制
- 没有动画
也没有计划实现它们。 - 没有本地文本渲染
resvg
不依赖于任何系统库,这意味着我们无法使用本地文本渲染。尽管如此,本地文本渲染是针对小水平文本进行优化的,这在SVG中并不常见。 - 仅限Unicode
这是21世纪。未使用UTF-8编码的文本文件已不再相关。
SVG支持
resvg
旨在仅支持静态 SVG子集;即不支持a
、script
、view
或cursor
元素,不支持事件和动画。
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 许可。
依赖关系
~5MB
~101K SLoC