From 5b9dd96e028fc4e81fe20a76f6693841e8d64be6 Mon Sep 17 00:00:00 2001 From: elenatorro Date: Mon, 10 Mar 2025 15:44:17 +0100 Subject: [PATCH] :bug: Fix children clip bounds inheritance --- render-wasm/src/render.rs | 45 ++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/render-wasm/src/render.rs b/render-wasm/src/render.rs index 6fac18351..12f83db2f 100644 --- a/render-wasm/src/render.rs +++ b/render-wasm/src/render.rs @@ -53,6 +53,35 @@ pub struct NodeRenderState { pub mask: bool, } +impl NodeRenderState { + pub fn get_children_clip_bounds( + &self, + element: &Shape, + modifiers: &HashMap, + ) -> Option<(Rect, Option, Matrix)> { + if self.id.is_nil() || !element.clip() { + return self.clip_bounds; + } + + let bounds = element.selrect(); + let mut transform = element.transform; + transform.post_translate(bounds.center()); + transform.pre_translate(-bounds.center()); + + if let Some(modifier) = modifiers.get(&element.id) { + transform.post_concat(modifier); + } + + let corners = match &element.shape_type { + Type::Rect(data) => data.corners, + Type::Frame(data) => data.corners, + _ => None, + }; + + Some((bounds, corners, transform)) + } +} + pub(crate) struct RenderState { gpu_state: GpuState, pub options: RenderOptions, @@ -675,21 +704,7 @@ impl RenderState { if element.is_recursive() { let children_clip_bounds = - (!node_render_state.id.is_nil() & element.clip()).then(|| { - let bounds = element.selrect(); - let mut transform = element.transform; - transform.post_translate(bounds.center()); - transform.pre_translate(-bounds.center()); - if let Some(modifiers) = modifiers.get(&element.id) { - transform.post_concat(&modifiers); - } - let corners = match &element.shape_type { - Type::Rect(data) => data.corners, - Type::Frame(data) => data.corners, - _ => None, - }; - (bounds, corners, transform) - }); + node_render_state.get_children_clip_bounds(element, &modifiers); for child_id in element.children_ids().iter().rev() { self.pending_nodes.push(NodeRenderState {