74个版本 (重大变更)
0.75.0 | 2024年6月2日 |
---|---|
0.72.0 | 2024年3月13日 |
0.69.0 | 2023年12月4日 |
0.68.0 | 2023年10月28日 |
0.19.0 | 2019年11月11日 |
#12 in 图像
每月下载量53,216
用于 51 个crate(直接使用17个)
3MB
83K SLoC
Safe Rust绑定到Skia图形库。
此包包含对Skia的安全Rust包装器,并使用skia-bindings构建并与Skia C++库进行接口。
有关支持的构建目标和如何运行示例的信息,请访问rust-skia项目的GitHub页面。
文档
函数级别的文档尚未提供。要开始,请查看Rust示例或Skia文档。
绑定与包装器
Skia-safe包装了公共Skia C++ API的大部分内容
- 向量几何:矩阵、矩形、点、大小等。
- 大多数与绘图相关的类和函数:Surface、Canvas、Paint、Path。
- 效果和着色器。
- 我们认为有用的实用类。
- PDF和SVG渲染
- Skia模块
- GPU 后端
- Vulkan
- OpenGL
- Metal
- Direct3D
- WebGPU Dawn
目前不支持封装接受回调和虚拟类的函数。虽然我们认为它们应该被封装,但相关的用例似乎相当特殊,所以我们暂时推迟。
编解码器
默认情况下,所有平台的完整构建和预构建的二进制文件都支持以下图像格式[^1]
解码 | 编码 |
---|---|
BMP, GIF, ICO, JPEG, PNG, WBMP | JPEG, PNG |
[^1]: Skia-safe 版本在 0.34.1 之前不支持解码 GIF 图像。
此外,可以通过以下说明的特性能启用对 WEBP 图像格式的支持:webp-encode
,webp-decode
和 webp
。
特性
Skia-safe 支持以下特性,可以通过 cargo 进行配置
gl
可以通过添加特性 gl
启用对 OpenGL 或 OpenGL ES 的平台支持。从版本 0.25.0
开始,rust-skia 默认配置为仅启用 CPU 渲染。在此之前,OpenGL 支持包含在每个特性配置中。要使用 OpenGL 渲染示例,请使用
(cd skia-org && cargo run --features gl [OUTPUT_DIR] --driver opengl)
egl
,x11
,wayland
这些特性配置窗口管理器集成。它们在基于 Linux 的平台上受支持,并隐式启用 gl
特性。
egl
使用 EGL 而不是 GLX 来设置 OpenGL 上下文,这是启用 wayland
的先决条件。
x11
启用设置 X11 OpenGL 上下文的支持。
wayland
启用对 Wayland 显示服务器协议 的支持,并隐式启用 egl
。
vulkan
可以通过添加特性 vulkan
启用 Vulkan 支持。要使用 Vulkan 渲染示例,请使用
(cd skia-org && cargo run --features vulkan [OUTPUT_DIR] --driver vulkan)
请注意,需要提供 Vulkan 驱动程序。在 Windows 上,它们可能已经可用,在 Linux 上,您可以参考 linuxconfig.org 上的这篇文章 开始安装,在 macOS 上,支持 Metal,请通过 安装 Mac 的 Vulkan SDK 并根据 Documentation/getting_started_macos.html
中的说明配置 MoltenVK,设置环境变量 DYLD_LIBRARY_PATH
,VK_LAYER_PATH
和 VK_ICD_FILENAMES
。
metal
可以通过添加特性 metal
启用对 macOS 和 iOS 目标上 Metal 的支持。
d3d
可以通过添加特性 d3d
在 Windows 目标上启用 Direct3D 后端。
textlayout
Cargo 特性 textlayout
通过提供对 Skia 模块 skshaper 和 skparagraph 的绑定,启用 Harfbuzz 和 ICU 的文本形状。
可以通过 skia_safe::Shaper
访问 skshaper 模块,Rust 绑定位于 skia_safe::textlayout
模块。
svg
此特性启用对渲染 SVG 文件 (svg::Dom
) 的支持。
webp-encode
,webp-decode
,webp
webp-encode
允许支持将 Skia 位图和图像编码为 WEBP 图像格式,而 webp-decode
允许支持将 WEBP 解码为 Skia 位图和图像。可以使用 webp
功能作为简写来启用 webp-encode
和 webp-decode
功能。
binary-cache
(默认启用)
binary-cache
允许下载预构建的 Skia 二进制文件而不是在本地构建。
embed-icudtl
(默认启用)
通常在 Windows 上使用 Skia 时,必须在可执行文件的目录中提供 icudtl.dat
文件。但如果启用此默认功能,icudtl.dat
文件将直接嵌入 Rust,并在使用任何 textlayout
功能之前自动初始化。
如果禁用此功能,则需要将 icudtl.dat
文件从构建输出目录复制到可执行文件目录。如果可执行文件目录可写,可以在使用 skia_safe::icu::init()
函数之前,将此操作完成。在调用 skia_safe::textlayout
模块之前使用。
当使用带有 cargo build -vv | grep "ninja: Entering directory"
的命令编译 skia-bindings 时,将显示输出目录。
有关如何使用 skshaper
和 skparagraph
模块绑定的简单示例,可以在 skia-org 示例命令行应用程序中找到。
embed-freetype
在大多数平台上,Skia 可以与已安装的 FreeType 版本良好地构建和运行。如果您在较旧的平台(例如 Debian 9 "stretch")上遇到与 FreeType 相关的构建错误,embed-freetype
确保FreeType 与 Skia 一起构建和嵌入。
多线程
与 Rust 哲学相冲突,我们决定完全支持 Skia 的引用计数语义,这意味着可以克隆和修改所有引用计数类型,而无需跨线程。要将引用计数类型发送到另一个线程,其引用计数必须为 1,并且必须将其包装在 Sendable
类型中,然后在接收线程中解包。以下函数支持发送机制
每个可变引用计数类型都实现了以下两个函数
can_send(&self) -> bool
返回 true
,如果句柄现在可以发送到另一个线程。
wrap_send(self) -> Result<Sendable<Self>, Self>
将句柄包装到实现 Send
的 Sendable
类型中。
Sendable
类型实现
unwrap(self)
它解包原始句柄。
有关各种包装类型的更多信息,请参阅 rust-skia wiki。
依赖关系
~0.3–40MB
~615K SLoC