Make Vello render groups with a blending stack only when necessary (#1905)

Only use group blends when necessary
This commit is contained in:
Dennis Kobert
2024-08-06 05:31:13 +00:00
committed by GitHub
parent ed841803ce
commit 5474a22b2e
@@ -328,17 +328,24 @@ impl GraphicElementRendered for GraphicGroup {
let Some(bounds) = self.bounding_box(transform) else { return }; 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); let blending = vello::peniko::BlendMode::new(self.alpha_blending.blend_mode.into(), vello::peniko::Compose::SrcOver);
let mut layer = false;
if self.alpha_blending.opacity < 1. || self.alpha_blending.blend_mode != BlendMode::default() {
layer = true;
scene.push_layer( scene.push_layer(
blending, blending,
self.alpha_blending.opacity, self.alpha_blending.opacity,
kurbo::Affine::IDENTITY, kurbo::Affine::IDENTITY,
&vello::kurbo::Rect::new(bounds[0].x, bounds[0].y, bounds[1].x, bounds[1].y), &vello::kurbo::Rect::new(bounds[0].x, bounds[0].y, bounds[1].x, bounds[1].y),
); );
}
for element in self.iter() { for element in self.iter() {
element.render_to_vello(scene, child_transform); element.render_to_vello(scene, child_transform);
} }
if layer {
scene.pop_layer(); scene.pop_layer();
} }
}
fn contains_artboard(&self) -> bool { fn contains_artboard(&self) -> bool {
self.iter().any(|element| element.contains_artboard()) self.iter().any(|element| element.contains_artboard())