From 5474a22b2eaf5fdf780b7b201255a192d767233c Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Tue, 6 Aug 2024 07:31:13 +0200 Subject: [PATCH] Make Vello render groups with a blending stack only when necessary (#1905) Only use group blends when necessary --- .../gcore/src/graphic_element/renderer.rs | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/node-graph/gcore/src/graphic_element/renderer.rs b/node-graph/gcore/src/graphic_element/renderer.rs index 991d7062..2182e246 100644 --- a/node-graph/gcore/src/graphic_element/renderer.rs +++ b/node-graph/gcore/src/graphic_element/renderer.rs @@ -328,16 +328,23 @@ impl GraphicElementRendered for GraphicGroup { let Some(bounds) = self.bounding_box(transform) else { return }; let blending = vello::peniko::BlendMode::new(self.alpha_blending.blend_mode.into(), vello::peniko::Compose::SrcOver); - scene.push_layer( - blending, - self.alpha_blending.opacity, - kurbo::Affine::IDENTITY, - &vello::kurbo::Rect::new(bounds[0].x, bounds[0].y, bounds[1].x, bounds[1].y), - ); + let mut layer = false; + + if self.alpha_blending.opacity < 1. || self.alpha_blending.blend_mode != BlendMode::default() { + layer = true; + scene.push_layer( + blending, + self.alpha_blending.opacity, + kurbo::Affine::IDENTITY, + &vello::kurbo::Rect::new(bounds[0].x, bounds[0].y, bounds[1].x, bounds[1].y), + ); + } for element in self.iter() { element.render_to_vello(scene, child_transform); } - scene.pop_layer(); + if layer { + scene.pop_layer(); + } } fn contains_artboard(&self) -> bool {