Upgrade Linebender and related dependencies (#3819)

Co-authored-by: Timon <me@timon.zip>
This commit is contained in:
Keavon Chambers 2026-02-25 11:10:57 -08:00 committed by GitHub
parent 8117ddcdb3
commit 82cf8eb369
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 410 additions and 481 deletions

837
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -134,7 +134,7 @@ bytemuck = { version = "1.13", features = ["derive", "min_const_generics"] }
serde = { version = "1.0", features = ["derive", "rc"] } serde = { version = "1.0", features = ["derive", "rc"] }
serde_json = "1.0" serde_json = "1.0"
serde-wasm-bindgen = "0.6" serde-wasm-bindgen = "0.6"
reqwest = { version = "0.12", features = ["blocking", "rustls-tls", "json"] } reqwest = { version = "0.13", features = ["blocking", "json"] }
futures = "0.3" futures = "0.3"
env_logger = "0.11" env_logger = "0.11"
log = "0.4" log = "0.4"
@ -148,7 +148,7 @@ anyhow = "1.0"
proc-macro2 = { version = "1", features = ["span-locations"] } proc-macro2 = { version = "1", features = ["span-locations"] }
quote = "1.0" quote = "1.0"
chrono = "0.4" chrono = "0.4"
ron = "0.11" ron = "0.12"
fastnoise-lite = "1.1" fastnoise-lite = "1.1"
wgpu = { version = "27.0", features = [ wgpu = { version = "27.0", features = [
# We don't have wgpu on multiple threads (yet) https://github.com/gfx-rs/wgpu/blob/trunk/CHANGELOG.md#wgpu-types-now-send-sync-on-wasm # We don't have wgpu on multiple threads (yet) https://github.com/gfx-rs/wgpu/blob/trunk/CHANGELOG.md#wgpu-types-now-send-sync-on-wasm
@ -183,13 +183,13 @@ keyboard-types = "0.8"
url = "2.5" url = "2.5"
tokio = { version = "1.29", features = ["fs", "macros", "io-std", "rt", "rt-multi-thread"] } tokio = { version = "1.29", features = ["fs", "macros", "io-std", "rt", "rt-multi-thread"] }
# Linebender ecosystem (BEGIN) # Linebender ecosystem (BEGIN)
kurbo = { version = "0.12", features = ["serde"] } kurbo = { version = "0.13", features = ["serde"] }
vello = { git = "https://github.com/linebender/vello" } vello = "0.7"
vello_encoding = { git = "https://github.com/linebender/vello" } vello_encoding = "0.7"
resvg = "0.45" resvg = "0.47"
usvg = "0.45" usvg = "0.47"
parley = "0.6" parley = "0.6"
skrifa = "0.36" skrifa = "0.40"
polycool = "0.4" polycool = "0.4"
# Linebender ecosystem (END) # Linebender ecosystem (END)
rand = { version = "0.9", default-features = false, features = ["std_rng"] } rand = { version = "0.9", default-features = false, features = ["std_rng"] }

View File

@ -29,7 +29,7 @@ dyn-any-derive = { path = "derive", optional = true }
# Optional dependencies # Optional dependencies
glam = { version = "0.29", optional = true, default-features = false } glam = { version = "0.29", optional = true, default-features = false }
reqwest = { version = "0.12", optional = true, default-features = false } reqwest = { version = "0.13", optional = true, default-features = false }
[package.metadata.docs.rs] [package.metadata.docs.rs]
all-features = true all-features = true

View File

@ -35,7 +35,7 @@ smallvec = "1.13.2"
[dev-dependencies] [dev-dependencies]
glob = "0.3" glob = "0.3"
svg = "0.18" svg = "0.18"
resvg = "0.44" resvg = "0.47"
image = "0.25" image = "0.25"
# Required dependencies # Required dependencies

View File

@ -34,6 +34,6 @@ thiserror = "2.0.17"
# Optional dependencies (should be dev dependencies, but Cargo currently doesn't allow optional dev dependencies) # Optional dependencies (should be dev dependencies, but Cargo currently doesn't allow optional dev dependencies)
image = { version = "0.25.9", optional = true } image = { version = "0.25.9", optional = true }
reqwest = { version = "0.12.26", optional = true, features = ["blocking"] } reqwest = { version = "0.13", optional = true, features = ["blocking"] }
libraw-rs = { version = "0.0.4", optional = true } libraw-rs = { version = "0.0.4", optional = true }
rayon = { version = "1.11.0", optional = true } rayon = { version = "1.11.0", optional = true }

View File

@ -498,12 +498,12 @@ impl Render for Artboard {
let [a, b] = [self.location.as_dvec2(), self.location.as_dvec2() + self.dimensions.as_dvec2()]; let [a, b] = [self.location.as_dvec2(), self.location.as_dvec2() + self.dimensions.as_dvec2()];
let rect = kurbo::Rect::new(a.x.min(b.x), a.y.min(b.y), a.x.max(b.x), a.y.max(b.y)); let rect = kurbo::Rect::new(a.x.min(b.x), a.y.min(b.y), a.x.max(b.x), a.y.max(b.y));
scene.push_layer(peniko::Mix::Normal, 1., kurbo::Affine::new(transform.to_cols_array()), &rect); scene.push_layer(peniko::Fill::NonZero, peniko::Mix::Normal, 1., kurbo::Affine::new(transform.to_cols_array()), &rect);
scene.fill(peniko::Fill::NonZero, kurbo::Affine::new(transform.to_cols_array()), color, None, &rect); scene.fill(peniko::Fill::NonZero, kurbo::Affine::new(transform.to_cols_array()), color, None, &rect);
scene.pop_layer(); scene.pop_layer();
if self.clip { if self.clip {
scene.push_clip_layer(kurbo::Affine::new(transform.to_cols_array()), &rect); scene.push_clip_layer(peniko::Fill::NonZero, kurbo::Affine::new(transform.to_cols_array()), &rect);
} }
// Since the content's transform is right multiplied in when rendering the content, we just need to right multiply by the artboard offset here. // Since the content's transform is right multiplied in when rendering the content, we just need to right multiply by the artboard offset here.
let child_transform = transform * DAffine2::from_translation(self.location.as_dvec2()); let child_transform = transform * DAffine2::from_translation(self.location.as_dvec2());
@ -643,6 +643,7 @@ impl Render for Table<Graphic> {
if let RenderBoundingBox::Rectangle(bounds) = bounds { if let RenderBoundingBox::Rectangle(bounds) = bounds {
scene.push_layer( scene.push_layer(
peniko::Fill::NonZero,
peniko::BlendMode::new(blend_mode, peniko::Compose::SrcOver), peniko::BlendMode::new(blend_mode, peniko::Compose::SrcOver),
opacity, opacity,
kurbo::Affine::IDENTITY, kurbo::Affine::IDENTITY,
@ -668,9 +669,15 @@ impl Render for Table<Graphic> {
if let RenderBoundingBox::Rectangle(bounds) = bounds { if let RenderBoundingBox::Rectangle(bounds) = bounds {
let rect = kurbo::Rect::new(bounds[0].x, bounds[0].y, bounds[1].x, bounds[1].y); let rect = kurbo::Rect::new(bounds[0].x, bounds[0].y, bounds[1].x, bounds[1].y);
scene.push_layer(peniko::Mix::Normal, 1., kurbo::Affine::IDENTITY, &rect); scene.push_layer(peniko::Fill::NonZero, peniko::Mix::Normal, 1., kurbo::Affine::IDENTITY, &rect);
mask_element.render_to_vello(scene, transform_mask, context, &render_params.for_clipper()); mask_element.render_to_vello(scene, transform_mask, context, &render_params.for_clipper());
scene.push_layer(peniko::BlendMode::new(peniko::Mix::Normal, peniko::Compose::SrcIn), 1., kurbo::Affine::IDENTITY, &rect); scene.push_layer(
peniko::Fill::NonZero,
peniko::BlendMode::new(peniko::Mix::Normal, peniko::Compose::SrcIn),
1.,
kurbo::Affine::IDENTITY,
&rect,
);
} }
row.element.render_to_vello(scene, transform, context, render_params); row.element.render_to_vello(scene, transform, context, render_params);
@ -976,6 +983,7 @@ impl Render for Table<Vector> {
let quad = Quad::from_box(layer_bounds).inflate(weight * max_scale(applied_stroke_transform)); let quad = Quad::from_box(layer_bounds).inflate(weight * max_scale(applied_stroke_transform));
let layer_bounds = quad.bounding_box(); let layer_bounds = quad.bounding_box();
scene.push_layer( scene.push_layer(
peniko::Fill::NonZero,
peniko::BlendMode::new(blend_mode, peniko::Compose::SrcOver), peniko::BlendMode::new(blend_mode, peniko::Compose::SrcOver),
opacity, opacity,
kurbo::Affine::new(multiplied_transform.to_cols_array()), kurbo::Affine::new(multiplied_transform.to_cols_array()),
@ -1144,9 +1152,9 @@ impl Render for Table<Vector> {
}; };
if wants_stroke_below { if wants_stroke_below {
scene.push_layer(peniko::Mix::Normal, 1., kurbo::Affine::IDENTITY, &rect); scene.push_layer(peniko::Fill::NonZero, peniko::Mix::Normal, 1., kurbo::Affine::IDENTITY, &rect);
vector_table.render_to_vello(scene, parent_transform, _context, &render_params.for_alignment(applied_stroke_transform)); vector_table.render_to_vello(scene, parent_transform, _context, &render_params.for_alignment(applied_stroke_transform));
scene.push_layer(peniko::BlendMode::new(peniko::Mix::Normal, compose), 1., kurbo::Affine::IDENTITY, &rect); scene.push_layer(peniko::Fill::NonZero, peniko::BlendMode::new(peniko::Mix::Normal, compose), 1., kurbo::Affine::IDENTITY, &rect);
do_stroke(scene, 2.); do_stroke(scene, 2.);
@ -1158,9 +1166,9 @@ impl Render for Table<Vector> {
// Fill first (unclipped), then stroke (clipped) above // Fill first (unclipped), then stroke (clipped) above
do_fill(scene); do_fill(scene);
scene.push_layer(peniko::Mix::Normal, 1., kurbo::Affine::IDENTITY, &rect); scene.push_layer(peniko::Fill::NonZero, peniko::Mix::Normal, 1., kurbo::Affine::IDENTITY, &rect);
vector_table.render_to_vello(scene, parent_transform, _context, &render_params.for_alignment(applied_stroke_transform)); vector_table.render_to_vello(scene, parent_transform, _context, &render_params.for_alignment(applied_stroke_transform));
scene.push_layer(peniko::BlendMode::new(peniko::Mix::Normal, compose), 1., kurbo::Affine::IDENTITY, &rect); scene.push_layer(peniko::Fill::NonZero, peniko::BlendMode::new(peniko::Mix::Normal, compose), 1., kurbo::Affine::IDENTITY, &rect);
do_stroke(scene, 2.); do_stroke(scene, 2.);
@ -1386,7 +1394,7 @@ impl Render for Table<Raster<CPU>> {
{ {
let blending = peniko::BlendMode::new(blend_mode, peniko::Compose::SrcOver); let blending = peniko::BlendMode::new(blend_mode, peniko::Compose::SrcOver);
let rect = kurbo::Rect::new(bounds[0].x, bounds[0].y, bounds[1].x, bounds[1].y); let rect = kurbo::Rect::new(bounds[0].x, bounds[0].y, bounds[1].x, bounds[1].y);
scene.push_layer(blending, opacity, kurbo::Affine::IDENTITY, &rect); scene.push_layer(peniko::Fill::NonZero, blending, opacity, kurbo::Affine::IDENTITY, &rect);
layer = true; layer = true;
} }
@ -1444,7 +1452,7 @@ impl Render for Table<Raster<GPU>> {
{ {
let blending = peniko::BlendMode::new(blend_mode.blend_mode.to_peniko(), peniko::Compose::SrcOver); let blending = peniko::BlendMode::new(blend_mode.blend_mode.to_peniko(), peniko::Compose::SrcOver);
let rect = kurbo::Rect::new(bounds[0].x, bounds[0].y, bounds[1].x, bounds[1].y); let rect = kurbo::Rect::new(bounds[0].x, bounds[0].y, bounds[1].x, bounds[1].y);
scene.push_layer(blending, blend_mode.opacity, kurbo::Affine::IDENTITY, &rect); scene.push_layer(peniko::Fill::NonZero, blending, blend_mode.opacity, kurbo::Affine::IDENTITY, &rect);
layer = true; layer = true;
} }
@ -1534,7 +1542,7 @@ impl Render for Table<Color> {
let mut layer = false; let mut layer = false;
if opacity < 1. || alpha_blending.blend_mode != BlendMode::default() { if opacity < 1. || alpha_blending.blend_mode != BlendMode::default() {
let blending = peniko::BlendMode::new(blend_mode, peniko::Compose::SrcOver); let blending = peniko::BlendMode::new(blend_mode, peniko::Compose::SrcOver);
scene.push_layer(blending, opacity, kurbo::Affine::scale(f64::INFINITY), &rect); scene.push_layer(peniko::Fill::NonZero, blending, opacity, kurbo::Affine::scale(f64::INFINITY), &rect);
layer = true; layer = true;
} }
@ -1631,7 +1639,7 @@ impl Render for Table<GradientStops> {
if opacity < 1. || alpha_blending.blend_mode != BlendMode::default() { if opacity < 1. || alpha_blending.blend_mode != BlendMode::default() {
let blending = peniko::BlendMode::new(blend_mode, peniko::Compose::SrcOver); let blending = peniko::BlendMode::new(blend_mode, peniko::Compose::SrcOver);
// See implemenation in `Table<Color>` for more detail // See implemenation in `Table<Color>` for more detail
scene.push_layer(blending, opacity, kurbo::Affine::scale(f64::INFINITY), &rect); scene.push_layer(peniko::Fill::NonZero, blending, opacity, kurbo::Affine::scale(f64::INFINITY), &rect);
layer = true; layer = true;
} }