41 次重大发布

0.43.0 2024 年 8 月 10 日
0.42.0 2024 年 6 月 1 日
0.41.0 2024 年 4 月 3 日
0.40.0 2024 年 2 月 17 日
0.1.0 2017 年 12 月 18 日

#6图像

Download history 26778/week @ 2024-05-04 27084/week @ 2024-05-11 26712/week @ 2024-05-18 27932/week @ 2024-05-25 27507/week @ 2024-06-01 38784/week @ 2024-06-08 42269/week @ 2024-06-15 44572/week @ 2024-06-22 39773/week @ 2024-06-29 40467/week @ 2024-07-06 41907/week @ 2024-07-13 42705/week @ 2024-07-20 37840/week @ 2024-07-27 37732/week @ 2024-08-03 39513/week @ 2024-08-10 34847/week @ 2024-08-17

156,680 每月下载次数
用于 228 个 crate(120 个直接使用)

MPL-2.0 许可证

740KB
17K SLoC

resvg

Build Status Crates.io Documentation Rust 1.67.1+

resvg 是一个 SVG 渲染库。

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

核心思想是创建一个快速、小巧、可移植的 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 编写的库。最终二进制文件中没有非 Rust 代码。

此外,几乎没有 unsafe 代码。尽管如此,一些依赖项中仍然存在一些 unsafe 代码,字体内存映射本质上就是 unsafe,但在内存安全性方面已经是最好的了。

然而,这不仅仅是内存安全。代码库 resvg 进行了广泛的检查,以防止无限循环(冻结)和栈溢出(通过递归)。

零冗余

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

便携性

resvg 保证在您能编译 Rust 的任何地方都能正常工作,包括 WASM。在与某些不为人知的 CPU 架构和移动操作系统(主要是指系统字体加载)有关的一些边缘问题上可能会有一些困难,但总体上应该不会很痛苦。

SVG 预处理

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

性能

比较不同 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 库都相当糟糕,我们并没有测试所有 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 项目接近75000行代码。考虑到resvg所做的事情,这并不多。这绝对是最小的选择之一。

许可证

resvg项目采用MPLv2.0许可证。

依赖关系

~3-4MB
~80K SLoC