From 313323888b1dd2c1d748f18b0b3df6ab08018039 Mon Sep 17 00:00:00 2001 From: atagen Date: Wed, 27 May 2026 13:26:15 +1000 Subject: [PATCH] Preserve rounded clipping for window body backgrounds --- src/renderer.rs | 52 +++++++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/src/renderer.rs b/src/renderer.rs index 38a38464..b80e3f18 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -552,13 +552,6 @@ impl Renderer<'_> { if body.is_empty() { return; } - let bounds = self.base.scale_rect(body); - self.render_window_body_background(&bounds); - self.stretch = if frame.source_body_size != body.size() { - Some(self.base.scale_point(body.width(), body.height())) - } else { - None - }; if inset > 0 && !self.state.theme.corner_radius.get().is_zero() { let inner_cr = self.scale_corner_radius( self.state @@ -569,24 +562,37 @@ impl Renderer<'_> { ); self.corner_radius = Some(inner_cr); } + self.render_window_body_background(body); + let bounds = self.base.scale_rect(body); + self.stretch = if frame.source_body_size != body.size() { + Some(self.base.scale_point(body.width(), body.height())) + } else { + None + }; self.render_retained_toplevel(&frame.retained, body.x1(), body.y1(), Some(&bounds)); self.stretch = None; self.corner_radius = None; } - fn render_window_body_background(&mut self, bounds: &Rect) { - if bounds.is_empty() { + fn render_window_body_background(&mut self, body: Rect) { + if body.is_empty() { return; } let color = self.state.theme.colors.background.get(); + let srgb_srgb = self.state.color_manager.srgb_gamma22(); + let srgb = &srgb_srgb.linear; + let perceptual = RenderIntent::Perceptual; self.base.sync(); - self.base.fill_scaled_boxes( - slice::from_ref(bounds), - &color, - None, - &self.state.color_manager.srgb_gamma22().linear, - RenderIntent::Perceptual, - ); + if let Some(cr) = self.corner_radius + && !cr.is_zero() + { + self.base + .fill_rounded_rect(body, &color, None, srgb, perceptual, cr, 0.0); + } else { + let bounds = self.base.scale_rect(body); + self.base + .fill_scaled_boxes(slice::from_ref(&bounds), &color, None, srgb, perceptual); + } } fn render_retained_surface_scaled( @@ -759,10 +765,6 @@ impl Renderer<'_> { } } let body = visual_mb.move_(x, y); - let body = self.base.scale_rect(body); - if !child.node.node_is_container() { - self.render_window_body_background(&body); - } let content = container .mono_content .get() @@ -781,6 +783,10 @@ impl Renderer<'_> { self.corner_radius = Some(inner_cr); } } + if !child.node.node_is_container() { + self.render_window_body_background(body); + } + let body = self.base.scale_rect(body); self.render_child_or_snapshot( &child.node, x + content.x1(), @@ -836,10 +842,10 @@ impl Renderer<'_> { self.corner_radius = Some(inner_cr); } let body = body.move_(x, y); - let body = self.base.scale_rect(body); if !child.node.node_is_container() { - self.render_window_body_background(&body); + self.render_window_body_background(body); } + let body = self.base.scale_rect(body); self.render_child_or_snapshot( &child.node, x + content.x1(), @@ -1109,7 +1115,7 @@ impl Renderer<'_> { let inner_cr = self.scale_corner_radius(cr.expanded_by(-(bw as f32))); self.corner_radius = Some(inner_cr); } - self.render_window_body_background(&scissor_body); + self.render_window_body_background(body); self.render_child_or_snapshot(&child, body.x1(), body.y1(), Some(&scissor_body)); self.stretch = None; self.corner_radius = None;