0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-03-11 23:31:21 -05:00

Merge pull request #6048 from penpot/elenatorro-10448-fix-clipping-over-groups

🐛 Fix children clip bounds inheritance
This commit is contained in:
Elena Torró 2025-03-11 12:06:40 +01:00 committed by GitHub
commit f35723e772
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -53,6 +53,35 @@ pub struct NodeRenderState {
pub mask: bool,
}
impl NodeRenderState {
pub fn get_children_clip_bounds(
&self,
element: &Shape,
modifiers: &HashMap<Uuid, Matrix>,
) -> Option<(Rect, Option<Corners>, 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 {