From 88b5d68fec383c6a85dedc30adffecdf9774229a Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Wed, 20 May 2026 11:00:08 +0200 Subject: [PATCH] :tada: Update skia binaries to 0.97.0 --- render-wasm/Cargo.lock | 31 +++++++++------- render-wasm/Cargo.toml | 2 +- render-wasm/_build_env | 9 +++-- render-wasm/lint | 2 +- render-wasm/src/shapes/fills.rs | 32 +++++++++++------ render-wasm/src/shapes/stroke_paths.rs | 4 ++- render-wasm/src/shim/hash_memory.cpp | 49 ++++++++++++++++++++++++++ render-wasm/test | 2 +- render-wasm/watch_test | 2 +- 9 files changed, 103 insertions(+), 30 deletions(-) create mode 100644 render-wasm/src/shim/hash_memory.cpp diff --git a/render-wasm/Cargo.lock b/render-wasm/Cargo.lock index 5d749143fd..a0c66a1404 100644 --- a/render-wasm/Cargo.lock +++ b/render-wasm/Cargo.lock @@ -66,10 +66,11 @@ checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "cc" -version = "1.1.31" +version = "1.2.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" dependencies = [ + "find-msvc-tools", "shlex", ] @@ -142,6 +143,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + [[package]] name = "flate2" version = "1.0.34" @@ -390,9 +397,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.0" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", @@ -402,9 +409,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -521,9 +528,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "skia-bindings" -version = "0.93.1" +version = "0.97.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2359f7e30c9da3f322f8ca3d4ec0abbc12a40035ce758309db0cdab07b5d4476" +checksum = "d6e3bcf8f25bf047e83110838463e8d06696c12fccc3d3794adf448b4d81f34b" dependencies = [ "bindgen", "cc", @@ -538,9 +545,9 @@ dependencies = [ [[package]] name = "skia-safe" -version = "0.93.1" +version = "0.97.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e837ea9d531c9efee8f980bfcdb7226b21db0285b0c3171d8be745829f940" +checksum = "935d4d174fb749bac9265eb41cad75039d32fda2d9c1a1e81b430df0e210a409" dependencies = [ "base64", "bitflags", @@ -573,9 +580,9 @@ dependencies = [ [[package]] name = "tar" -version = "0.4.42" +version = "0.4.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ff6c40d3aedb5e06b57c6f669ad17ab063dd1e63d977c6a88e7f4dfa4f04020" +checksum = "3f6221d9a6003c78398e3b239969f352578258df48c8eb051caadae0015bc840" dependencies = [ "filetime", "libc", diff --git a/render-wasm/Cargo.toml b/render-wasm/Cargo.toml index 77c4c10715..4e06fd9bba 100644 --- a/render-wasm/Cargo.toml +++ b/render-wasm/Cargo.toml @@ -26,7 +26,7 @@ gl = "0.14.0" glam = "0.24.2" indexmap = "2.7.1" macros = { path = "macros" } -skia-safe = { version = "0.93.1", default-features = false, features = [ +skia-safe = { version = "0.97.0", default-features = false, features = [ "gl", "svg", "textlayout", diff --git a/render-wasm/_build_env b/render-wasm/_build_env index b54af40d34..eb5421901a 100644 --- a/render-wasm/_build_env +++ b/render-wasm/_build_env @@ -10,7 +10,7 @@ fi export BUILD_NAME="${BUILD_NAME:-render-wasm}" export CARGO_BUILD_TARGET=${CARGO_BUILD_TARGET:-"wasm32-unknown-emscripten"}; -export SKIA_BINARIES_URL=${SKIA_BINARIES_URL:-"https://github.com/penpot/skia-binaries/releases/download/0.93.1/skia-binaries-319323662b1685a112f5-wasm32-unknown-emscripten-gl-svg-textlayout-binary-cache-webp.tar.gz"} +export SKIA_BINARIES_URL=${SKIA_BINARIES_URL:-"https://github.com/penpot/skia-binaries/releases/download/0.97.0/skia-binaries-fdd89c91b34b4e26dd64-wasm32-unknown-emscripten-gl-svg-textlayout-binary-cache-webp.tar.gz"} # 256 MB of initial heap to perform less # initial calls to memory grow. @@ -29,6 +29,10 @@ export EM_MEMORY_GROWTH_GEOMETRIC_STEP="0.8" # Default: dlmalloc export EM_MALLOC="dlmalloc" +RENDER_WASM_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +# Link Skia's std::__hash_memory at final emcc link (must use em++, not host g++ via build.rs). +export EMCC_HASH_MEMORY_SHIM="${RENDER_WASM_ROOT}/src/shim/hash_memory.cpp" + export EMCC_CFLAGS="--no-entry \ --js-library src/js/wapi.js \ -sMALLOC=$EM_MALLOC \ @@ -44,7 +48,8 @@ export EMCC_CFLAGS="--no-entry \ -sMODULARIZE=1 \ -sDISABLE_EXCEPTION_CATCHING=1 \ -sFILESYSTEM=0 \ - -sEXPORT_ES6=1"; + -sEXPORT_ES6=1 \ + ${EMCC_HASH_MEMORY_SHIM}"; export EM_CACHE="/tmp/emsdk_cache"; diff --git a/render-wasm/lint b/render-wasm/lint index e94145189a..18a5917786 100755 --- a/render-wasm/lint +++ b/render-wasm/lint @@ -11,7 +11,7 @@ fi . ./_build_env export CARGO_BUILD_TARGET=${CARGO_BUILD_TARGET:-"wasm32-unknown-emscripten"}; -export SKIA_BINARIES_URL=${SKIA_BINARIES_URL:-"https://github.com/penpot/skia-binaries/releases/download/0.93.1/skia-binaries-319323662b1685a112f5-wasm32-unknown-emscripten-gl-svg-textlayout-binary-cache-webp.tar.gz"} +export SKIA_BINARIES_URL=${SKIA_BINARIES_URL:-"https://github.com/penpot/skia-binaries/releases/download/0.97.0/skia-binaries-fdd89c91b34b4e26dd64-wasm32-unknown-emscripten-gl-svg-textlayout-binary-cache-webp.tar.gz"} ALLOWED_RULES="-D static_mut_refs" diff --git a/render-wasm/src/shapes/fills.rs b/render-wasm/src/shapes/fills.rs index 87da3881bf..6716da74c1 100644 --- a/render-wasm/src/shapes/fills.rs +++ b/render-wasm/src/shapes/fills.rs @@ -51,12 +51,21 @@ impl Gradient { rect.left + self.end.0 * rect.width(), rect.top + self.end.1 * rect.height(), ); - skia::gradient_shader::linear( - (start, end), - self.colors.as_slice(), + let colors4f: Vec = self.colors.iter().copied().map(Into::into).collect(); + let colors = skia::gradient::Colors::new( + colors4f.as_slice(), Some(self.offsets.as_slice()), skia::TileMode::Clamp, - None, + None::, + ); + let gradient = + skia::gradient::Gradient::new(colors, skia::gradient::Interpolation::default()); + skia::gradient::shaders::linear_gradient( + ( + skia::Point::new(start.0, start.1), + skia::Point::new(end.0, end.1), + ), + &gradient, None, ) } @@ -83,15 +92,16 @@ impl Gradient { transform.pre_scale((self.width * rect.width() / rect.height(), 1.), None); transform.pre_translate((-center.x, -center.y)); - skia::gradient_shader::radial( - center, - distance, - self.colors.as_slice(), + let colors4f: Vec = self.colors.iter().copied().map(Into::into).collect(); + let colors = skia::gradient::Colors::new( + colors4f.as_slice(), Some(self.offsets.as_slice()), skia::TileMode::Clamp, - None, - Some(&transform), - ) + None::, + ); + let gradient = + skia::gradient::Gradient::new(colors, skia::gradient::Interpolation::default()); + skia::gradient::shaders::radial_gradient((center, distance), &gradient, Some(&transform)) } } diff --git a/render-wasm/src/shapes/stroke_paths.rs b/render-wasm/src/shapes/stroke_paths.rs index f98c01ca0f..528dea3aea 100644 --- a/render-wasm/src/shapes/stroke_paths.rs +++ b/render-wasm/src/shapes/stroke_paths.rs @@ -33,7 +33,7 @@ pub fn stroke_to_path( paint.set_stroke_width(stroke.width * 2.0); } - let mut stroke_outline = skia::Path::default(); + let mut stroke_outline = skia::PathBuilder::new(); let success = skia::path_utils::fill_path_with_paint( &transformed_shape_path, &paint, @@ -46,6 +46,8 @@ pub fn stroke_to_path( return None; } + let mut stroke_outline = stroke_outline.detach(); + // For inner/outer strokes, use boolean ops to clip // the 2×-width stroke outline to the correct region. // Set EvenOdd to preserve the annular ring's inner hole, diff --git a/render-wasm/src/shim/hash_memory.cpp b/render-wasm/src/shim/hash_memory.cpp new file mode 100644 index 0000000000..dd8c6ab598 --- /dev/null +++ b/render-wasm/src/shim/hash_memory.cpp @@ -0,0 +1,49 @@ +// Skia 0.97 WASM references std::__hash_memory. Compiled via EMCC_CFLAGS at the +// final emcc link (see _build_env). murmur2 matches libc++ on 32-bit wasm. +#include +#include + +namespace std { +inline namespace __2 { + +static size_t loadword(const void* p) { + size_t r; + std::memcpy(&r, p, sizeof(r)); + return r; +} + +__attribute__((used)) size_t __hash_memory(const void* key, size_t len) noexcept { + const size_t m = 0x5bd1e995; + const size_t r = 24; + size_t h = len; + const auto* data = static_cast(key); + for (; len >= 4; data += 4, len -= 4) { + size_t k = loadword(data); + k *= m; + k ^= k >> r; + k *= m; + h *= m; + h ^= k; + } + switch (len) { + case 3: + h ^= static_cast(data[2] << 16); + [[fallthrough]]; + case 2: + h ^= static_cast(data[1] << 8); + [[fallthrough]]; + case 1: + h ^= data[0]; + h *= m; + break; + default: + break; + } + h ^= h >> 13; + h *= m; + h ^= h >> 15; + return h; +} + +} // namespace __2 +} // namespace std diff --git a/render-wasm/test b/render-wasm/test index f416e6c6bb..1a8766c141 100755 --- a/render-wasm/test +++ b/render-wasm/test @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -x -export SKIA_BINARIES_URL=${SKIA_BINARIES_URL:-"https://github.com/penpot/skia-binaries/releases/download/0.93.1/skia-binaries-319323662b1685a112f5-x86_64-unknown-linux-gnu-gl-svg-textlayout-binary-cache-webp.tar.gz"} +export SKIA_BINARIES_URL=${SKIA_BINARIES_URL:-"https://github.com/penpot/skia-binaries/releases/download/0.97.0/skia-binaries-fdd89c91b34b4e26dd64-x86_64-unknown-linux-gnu-gl-svg-textlayout-binary-cache-webp.tar.gz"} export CARGO_BUILD_TARGET=${CARGO_BUILD_TARGET:-"x86_64-unknown-linux-gnu"}; _SCRIPT_DIR=$(dirname $0); diff --git a/render-wasm/watch_test b/render-wasm/watch_test index 798eb84bf0..bc28b12f6b 100755 --- a/render-wasm/watch_test +++ b/render-wasm/watch_test @@ -1,7 +1,7 @@ #!/usr/bin/env bash _SCRIPT_DIR=$(dirname $0); -export SKIA_BINARIES_URL="https://github.com/penpot/skia-binaries/releases/download/0.93.1/skia-binaries-319323662b1685a112f5-x86_64-unknown-linux-gnu-gl-svg-textlayout-binary-cache-webp.tar.gz" +export SKIA_BINARIES_URL="https://github.com/penpot/skia-binaries/releases/download/0.97.0/skia-binaries-fdd89c91b34b4e26dd64-x86_64-unknown-linux-gnu-gl-svg-textlayout-binary-cache-webp.tar.gz" pushd $_SCRIPT_DIR; cargo watch -x "test --bin render_wasm -- --show-output"