Skia Submodule Status: chrome/m76 (pending changes).
This project attempts to provide up to date safe bindings that bridge idiomatic Rust with Skia's C++ API on all major desktop, mobile, and WebAssembly platforms, including GPU rendering support for Vulkan, Metal, and OpenGL.
An official crate is not yet available on crates.io but every update to the release
branch uploads new crates to the releases tab and there is also a Milestone that tracks the progress.
We wrapped most part of the public Skia C++ APIs. To see what's missing, take a look at the API Complete Milestone.
Wrappers for functions that take callbacks and virtual classes are not supported right now. While we think they should be wrapped, the use cases related seem to be rather special, so we postponed that for now.
Note that the information in this section is preliminary. Please open an issue for any build problem.
This project requires LLVM, Python 2, and git to build.
To see which version of LLVM/Clang is available, use clang --version
.
We recommend version 8, but also had successes to build Skia with 6.0.1 and 7.0.1, and - on macOS - Apple LLVM version 10. So it's probably best to use the preinstalled version or install version 8 if LLVM is not available on your platform by default.
Python version 2.7 should be available. The build script probes for python --version
and python2 --version
and uses the first one that looks like a version 2 executable.
Install the XCode command line developer tools with
bash
xcode-select --install
macOS Mojave Version 10.14: install the SDK headers:
bash
sudo open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
otherwise the Skia build may fail to build SkJpegUtility.cpp
and the binding generation will fail with 'TargetConditionals.h' file not found
. Also note that the command line developer tools and SDK headers should be reinstalled after an update of XCode.
As an alternative to Apple LLVM 10, install LLVM via brew install llvm
or brew install llvm@7
and then set PATH
, CPPFLAGS
, and LDFLAGS
like instructed.
git
command line tool is installed.mingw-w64-x86_64-python2
.C:/Program Files/LLVM
, so be sure it's available from there.Then use:
cargo build -vv
On Linux, OpenGL libraries may be missing, if that is the case, install OpenGL drivers for you graphics card, or install a mesa OpenGL package like libgl1-mesa-dev
.
Please share your build experience so that we can try to automate the build and get to the point where cargo build
is sufficient to build the bindings including Skia, and if that is not possible, clearly prompts to what's missing.
Cross compilation to Android is supported for targeting 64 bit ARM and Intel x86 architectures (aarch64
and x86_64
):
For example, to compile for aarch64
:
rustup target install aarch64-linux-android
.build/tools/make_standalone_toolchain.py --arch arm64 --install-dir /tmp/ndk
aarch64-linux-android
target:On macOS & Linux:
bash
ANDROID_NDK=~/path/to/android-ndk-r18b PATH=$PATH:/tmp/ndk/bin cargo build --target aarch64-linux-android -vv
On Windows it's a bit more complicated, because the Android NDK clang executable must be invoked through .cmd scripts:
bash
ANDROID_NDK=~/path/to/android-ndk-r18b PATH=$PATH:/tmp/ndk/bin CC_aarch64_linux_android=aarch64-linux-android-clang.cmd CXX_aarch64_linux_android=aarch64-linux-android-clang++.cmd CARGO_TARGET_aarch64_linux_android_LINKER=aarch64-linux-android-clang.cmd cargo build --target aarch64-linux-android -vv
Notes:
touch skia-bindings/build.rs
will force a rebuild (#10).Compilation to iOS is supported on macOS targeting the iOS simulator (--target x86_64-apple-ios
) and 64 bit ARM devices (--target aarch64-apple-ios
).
For situations in which Skia does not build or needs to be configured differently, we support some customization support in skia-bindings/build.rs
. For more details about how to customize Skia builds, take a look at the README of the skia-bindings package.
Note that crate packages will try to download prebuilt binaries from skia-binaries if the platform matches with one of the binaries build on the CI. If the download fails, a full build of Skia is triggered.
vulkan
Vulkan support can be enabled by setting the Cargo feature default = ["vulkan"]
in skia-safe/Cargo.toml
, which will cause a rebuild of Skia. To render the examples with Vulkan use cargo run --example skia-org -- [OUTPUT_DIR] --driver vulkan
.
Note that Vulkan drivers need to be available. On Windows, they are most likely available already, on Linux this article on linuxconfig.org might get you started, and on macOS with Metal support, install the Vulkan SDK for Mac and configure MoltenVK by setting the DYLD_LIBRARY_PATH
, VK_LAYER_PATH
, and VK_ICD_FILENAMES
environment variables as described in Documentation/getting_started_macos.html
.
shaper
The Cargo feature shaper
enables text shaping with Harfbuzz and ICU.
On Windows, the file icudtl.dat
must be available in your executable's directory. To provide the data file, either copy it from the build's output directory (shown when skia-bindings is compiled with cargo build -vv | grep "ninja: Entering directory"
), or - if your executable directory is writable - invoke the function skia_safe::icu::init()
before creating the skia_safe::Shaper
object.
A simple example can be found in the skia-org command line application.
The examples are taken from Skia's website and ported to the Rust API.
If you were able to build the project, run
cargo run --example skia-org -- [OUTPUT_DIR]
to generate some Skia drawn PNG images in the directory OUTPUT_DIR
. To render with OpenGL, use
cargo run --example skia-org -- [OUTPUT_DIR] --driver opengl
And cargo run --example skia-org -- --help
shows the drivers that are supported.
Some examples:
Fill, Stroke, Text:
Sweep Gradient:
Dash Path Effect:
For more, you may take a look at the rust-skia.github.io repository.
If you'd like to help with the bindings, take a look at the Wiki to get started and create an issue to avoid duplicate work. For smaller tasks, grep for "TODO" in the source code. And for heroic work, check out the label help wanted. And if you like to help making the Rust API nicer to use, look out for open issues with the label api ergonomics.
MIT