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日

图像类别中排名196

Download history 7679/week @ 2024-05-03 8255/week @ 2024-05-10 7805/week @ 2024-05-17 7562/week @ 2024-05-24 7929/week @ 2024-05-31 19358/week @ 2024-06-07 22710/week @ 2024-06-14 23446/week @ 2024-06-21 20221/week @ 2024-06-28 13498/week @ 2024-07-05 13095/week @ 2024-07-12 12309/week @ 2024-07-19 12826/week @ 2024-07-26 11648/week @ 2024-08-02 14612/week @ 2024-08-09 14322/week @ 2024-08-16

每月下载量55,770
52个crate中使用(直接使用2个)

MIT许可协议

2MB
56K SLoC

Skia Bindings

这是一个skia-safe的支持包,它提供了对Skia图形库的安全Rust绑定的支持。

组织结构

该包包含三个组件。

  • 首先,在build.rsbuild_support/中为Skia提供了完整的配置和构建支持。
  • 额外的C语言绑定,以帮助bindgen处理它遇到的问题或解决链接器错误。这些是src/bindings.cppsrc/shaper.cpp
  • 以及一些用于下载预构建二进制文件的功能。

Skia构建支持

构建Skia相当特别,需要在目标平台上有许多先决条件,并且配置正确。

要配置和构建Skia,build_support/skia.rs 执行了所有艰苦的工作:它从谷歌的仓库中拉取 depot_tools/skia/,并通过执行 skia/tools/git-sync-deps 使用Python来获取许多额外的依赖项。之后,它使用谷歌的 GN 工具配置Skia,并最终通过将控制权交给 ninja 可执行文件(来自 depot_tools/ 包)来构建它。

绑定生成

文件 src/*.cpp 包含Rust需要与Skia代码库交互的C++代码。这些文件由 Rust的绑定生成器 处理,该生成器使用libclang进行布局计算,并也由 clang 编译。

如果两个步骤都进行得很顺利,生成的Rust绑定代码将写入 OUT_DIR/skia/bindings.rs,并且 skia-bindings 库将在输出目录中找到。

调试构建

默认情况下,出于性能原因,即使cargo创建调试输出,Skia也以发布模式构建。只有通过明确设置环境变量 SKIA_DEBUG=1,才能启用Skia的调试构建。

预构建的二进制文件

由于构建Skia和创建绑定很慢,并且依赖于许多位于Rust生态系统之外组件,我们决定尝试使用预构建的二进制文件。

每当从我们的CI服务器上的 release 分支构建新的 rust-skia 版本时,生成的Skia库、skia-bindings 库和 bindings.rs 都会被压缩并上传到 skia-binaries 仓库 的发布标签页。

当构建脚本检测到 skia-bindings 是在crate内部构建的,并且有一个与仓库的哈希值、平台和功能匹配的预构建存档可用时,它会下载该包,解压缩它,并跳过Skia和绑定的完整构建步骤。

离线环境中的预构建二进制文件

一些用户可能没有稳定的互联网连接,或者是在离线环境中构建 skia-bindings。您可以在有互联网连接的环境中,从 skia-binaries 仓库 手动下载二进制文件。

要在离线构建中使用这些二进制文件,必须设置环境变量 SKIA_BINARIES_URL。此环境变量必须指向包含二进制的 tar.gz 文件,前面加上 file://

export SKIA_BINARIES_URL='file://path/to/skia-binaries.tar.gz'

更改用作 ninjagn 的可执行文件

在某些系统上,捆绑的 ninjagn 可执行文件可能不起作用(如NixOS上那样)。为了解决这个问题,可以使用以下环境变量设置使用的可执行文件

变量 描述 默认值
SKIA_NINJA_COMMAND 要运行的 ninja 命令。它可以是命令名或绝对路径。 ninja 默认,Windows上的 ninja.exe
SKIA_GN_COMMAND 要运行的 gn 命令。它可以是命令名或以Skia源目录为起点的路径。 bin/gn

更改Skia源目录

在某些情况下,可能需要提供替代的Skia源目录。这可以通过设置SKIA_SOURCE_DIR来实现,它必须是包含所有依赖项的Skia源目录的绝对路径。

使用系统库

默认情况下,Skia自身之外还构建了众多依赖库。如果不想这样做(比如,如果包正在作为构建过程的构建部分构建),可以通过设置环境变量SKIA_USE_SYSTEM_LIBRARIES来禁用此行为。

此外,这里有一个例外。默认情况下,FreeType只嵌入在Android平台上。FreeType。如果您的平台不支持更新的FreeType版本,则必须使用特性embed-freetype构建skia-bindings。

构建自定义

除了可以在将包作为cargo依赖项添加时直接指定的glvulkanmetaltextlayout功能之外,Skia的构建还可以通过在build.rs中调整在build_support/skia.rs中定义的两个结构体之一来进一步自定义。

构建配置

此结构体表示skia-bindings的最高级构建配置,并包含多个单个功能标志。

最终构建配置

FinalBuildConfiguration是从BuildConfiguration创建的,它包含GN用于参数化Skia构建和用于创建src/bindings.rs文件和skia-bindings库的预处理定义所用的键值对。

为Linux交叉编译

在Linux上为不同的架构交叉编译Skia和Rust绑定是可能的。设置以下环境变量,然后使用所需的--target triple调用cargo

  • CLANGCC:调用clang交叉编译所需目标架构C代码的命令行。此命令行可能包括--target=<triple>选项。
  • CLANGCXX:调用clang交叉编译所需目标架构C++代码的命令行。此命令行可能包括--target=<triple>选项。
  • SDKTARGETSYSROOT:目标sysroot的路径。
  • 或者
    • CC/CXX提供交叉编译的命令行(clang不是必需的)和HOST_CC提供为宿主机构建的命令行。
    • CC_<target>/CXX_<target>提供交叉编译的命令行(clang不是必需的)。

在使用Yocto SDK进行交叉编译时,通过源environment-setup-*脚本进入Yocto SDK环境时,将设置所有上述环境变量,并将CC/CXX设置为交叉编译。这意味着还需要设置HOST_CC,通常将其设置为仅gcc即可。

为了将您的Rust应用程序链接,您可能还需要指导cargo使用正确的链接器,并在sysroot中查找本地库依赖项(例如Skia的FreeType依赖项)。这可以通过一个.cargo/config文件或通过环境变量来完成。例如,如果您的Rust目标平台是aarch64-unknown-linux-gnu,并且您的Yocto SDK目标为aarch64-poky-linux

  • CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-poky-linux-g++
  • RUSTFLAGS="-Clink-args=--sysroot=$SDKTARGETSYSROOT"

依赖项

~0–4MB
~72K SLoC