Fix Vello rendering of transforms for nested graphic groups (#1871)

Fix transforms for nested graphic groups
This commit is contained in:
Dennis Kobert
2024-07-29 05:49:48 -07:00
committed by GitHub
parent 5b1d3a0ae4
commit 5087a2b0f8
@@ -269,17 +269,18 @@ impl GraphicElementRendered for GraphicGroup {
#[cfg(feature = "vello")] #[cfg(feature = "vello")]
fn render_to_vello(&self, scene: &mut Scene, transform: DAffine2) { fn render_to_vello(&self, scene: &mut Scene, transform: DAffine2) {
let kurbo_transform = kurbo::Affine::new((transform * self.transform).to_cols_array()); let child_transform = transform * self.transform;
let Some(bounds) = self.bounding_box(DAffine2::IDENTITY) 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);
scene.push_layer( scene.push_layer(
blending, blending,
self.alpha_blending.opacity, self.alpha_blending.opacity,
kurbo_transform, 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, transform * self.transform); element.render_to_vello(scene, child_transform);
} }
scene.pop_layer(); scene.pop_layer();
} }
@@ -327,7 +328,7 @@ impl GraphicElementRendered for VectorData {
let stroke_width = self.style.stroke().map(|s| s.weight()).unwrap_or_default(); let stroke_width = self.style.stroke().map(|s| s.weight()).unwrap_or_default();
let scale = transform.decompose_scale(); let scale = transform.decompose_scale();
let offset = DVec2::splat(stroke_width * scale.x.max(scale.y) / 2.); let offset = DVec2::splat(stroke_width * scale.x.max(scale.y) / 2.);
self.bounding_box_with_transform(self.transform * transform).map(|[a, b]| [a - offset, b + offset]) self.bounding_box_with_transform(transform * self.transform).map(|[a, b]| [a - offset, b + offset])
} }
fn add_click_targets(&self, click_targets: &mut Vec<ClickTarget>) { fn add_click_targets(&self, click_targets: &mut Vec<ClickTarget>) {
@@ -513,7 +514,7 @@ impl GraphicElementRendered for Artboard {
if self.clip { if self.clip {
scene.push_layer(blend_mode, 1., kurbo::Affine::new(transform.to_cols_array()), &rect); scene.push_layer(blend_mode, 1., kurbo::Affine::new(transform.to_cols_array()), &rect);
} }
self.graphic_group.render_to_vello(scene, transform * self.transform()); self.graphic_group.render_to_vello(scene, transform);
if self.clip { if self.clip {
scene.pop_layer(); scene.pop_layer();
} }