1
0
Fork 0
forked from wry/wry

Preserve rounded clipping for window body backgrounds

This commit is contained in:
atagen 2026-05-27 13:26:15 +10:00
parent 0f6f9f2602
commit 313323888b

View file

@ -552,13 +552,6 @@ impl Renderer<'_> {
if body.is_empty() { if body.is_empty() {
return; 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() { if inset > 0 && !self.state.theme.corner_radius.get().is_zero() {
let inner_cr = self.scale_corner_radius( let inner_cr = self.scale_corner_radius(
self.state self.state
@ -569,24 +562,37 @@ impl Renderer<'_> {
); );
self.corner_radius = Some(inner_cr); 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.render_retained_toplevel(&frame.retained, body.x1(), body.y1(), Some(&bounds));
self.stretch = None; self.stretch = None;
self.corner_radius = None; self.corner_radius = None;
} }
fn render_window_body_background(&mut self, bounds: &Rect) { fn render_window_body_background(&mut self, body: Rect) {
if bounds.is_empty() { if body.is_empty() {
return; return;
} }
let color = self.state.theme.colors.background.get(); 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.sync();
self.base.fill_scaled_boxes( if let Some(cr) = self.corner_radius
slice::from_ref(bounds), && !cr.is_zero()
&color, {
None, self.base
&self.state.color_manager.srgb_gamma22().linear, .fill_rounded_rect(body, &color, None, srgb, perceptual, cr, 0.0);
RenderIntent::Perceptual, } 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( fn render_retained_surface_scaled(
@ -759,10 +765,6 @@ impl Renderer<'_> {
} }
} }
let body = visual_mb.move_(x, y); 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 let content = container
.mono_content .mono_content
.get() .get()
@ -781,6 +783,10 @@ impl Renderer<'_> {
self.corner_radius = Some(inner_cr); 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( self.render_child_or_snapshot(
&child.node, &child.node,
x + content.x1(), x + content.x1(),
@ -836,10 +842,10 @@ impl Renderer<'_> {
self.corner_radius = Some(inner_cr); self.corner_radius = Some(inner_cr);
} }
let body = body.move_(x, y); let body = body.move_(x, y);
let body = self.base.scale_rect(body);
if !child.node.node_is_container() { 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( self.render_child_or_snapshot(
&child.node, &child.node,
x + content.x1(), x + content.x1(),
@ -1109,7 +1115,7 @@ impl Renderer<'_> {
let inner_cr = self.scale_corner_radius(cr.expanded_by(-(bw as f32))); let inner_cr = self.scale_corner_radius(cr.expanded_by(-(bw as f32)));
self.corner_radius = Some(inner_cr); 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.render_child_or_snapshot(&child, body.x1(), body.y1(), Some(&scissor_body));
self.stretch = None; self.stretch = None;
self.corner_radius = None; self.corner_radius = None;