fix(blur): apply overview zoom to true blur

This commit is contained in:
2025-11-25 20:47:41 +01:00
parent 272de908b8
commit b72381c10f
10 changed files with 56 additions and 11 deletions

View File

@@ -120,7 +120,7 @@ impl TestCase for Tile {
Rectangle::new(Point::from((-location.x, -location.y)), size.to_logical(1.)),
);
self.tile
.render(renderer, location, true, RenderTarget::Output, None)
.render(renderer, location, true, RenderTarget::Output, None, None)
.map(|elem| Box::new(elem) as _)
.collect()
}

View File

@@ -249,6 +249,7 @@ impl MappedLayer {
.top_left,
self.scale,
self.blur_config,
1.,
)
.into(),
)

View File

@@ -1142,6 +1142,7 @@ impl<W: LayoutElement> FloatingSpace<W> {
target: RenderTarget,
focus_ring: bool,
fx_buffers: Option<EffectsFramebufffersUserData>,
overview_zoom: f64,
) -> Vec<FloatingSpaceRenderElement<R>> {
let mut rv = Vec::new();
@@ -1161,8 +1162,15 @@ impl<W: LayoutElement> FloatingSpace<W> {
let focus_ring = focus_ring && Some(tile.focused_window().id()) == active.as_ref();
rv.extend(
tile.render(renderer, tile_pos, focus_ring, target, fx_buffers.clone())
.map(Into::into),
tile.render(
renderer,
tile_pos,
focus_ring,
target,
fx_buffers.clone(),
Some(overview_zoom),
)
.map(Into::into),
);
}

View File

@@ -4859,7 +4859,7 @@ impl<W: LayoutElement> Layout<W> {
let fx_buffers = EffectsFramebuffers::get_user_data(output);
let iter = move_
.tile
.render(renderer, location, true, target, fx_buffers)
.render(renderer, location, true, target, fx_buffers, Some(zoom))
.map(move |elem| {
RescaleRenderElement::from_element(
elem,

View File

@@ -1736,7 +1736,8 @@ impl<W: LayoutElement> Monitor<W> {
Some(elem)
};
let (floating, scrolling) = ws.render_elements(renderer, target, focus_ring);
let (floating, scrolling) =
ws.render_elements(renderer, target, focus_ring, self.overview_zoom());
let floating = floating.filter_map(map_ws_contents);
let scrolling = scrolling.filter_map(map_ws_contents);

View File

@@ -3248,6 +3248,7 @@ impl<W: LayoutElement> ScrollingSpace<W> {
target: RenderTarget,
focus_ring: bool,
fx_buffers: Option<EffectsFramebufffersUserData>,
overview_zoom: f64,
) -> Vec<ScrollingSpaceRenderElement<R>> {
let mut rv = vec![];
@@ -3285,8 +3286,15 @@ impl<W: LayoutElement> ScrollingSpace<W> {
first = false;
rv.extend(
tile.render(renderer, tile_pos, focus_ring, target, fx_buffers.clone())
.map(Into::into),
tile.render(
renderer,
tile_pos,
focus_ring,
target,
fx_buffers.clone(),
Some(overview_zoom),
)
.map(Into::into),
);
}
}

View File

@@ -1593,6 +1593,7 @@ impl<W: LayoutElement> Tile<W> {
Point::from((0., y))
}
#[allow(clippy::too_many_arguments)]
fn render_inner<'a, R: NiriRenderer + 'a>(
&'a self,
renderer: &mut R,
@@ -1601,6 +1602,7 @@ impl<W: LayoutElement> Tile<W> {
focus_ring: bool,
target: RenderTarget,
fx_buffers: Option<EffectsFramebufffersUserData>,
overview_zoom: Option<f64>,
) -> impl Iterator<Item = TileRenderElement<R>> + 'a {
let _span = tracy_client::span!("Tile::render_inner");
@@ -1928,6 +1930,7 @@ impl<W: LayoutElement> Tile<W> {
radius.top_left,
self.scale,
self.blur_config,
overview_zoom.unwrap_or(1.),
)
.into(),
)
@@ -1963,6 +1966,7 @@ impl<W: LayoutElement> Tile<W> {
focus_ring: bool,
target: RenderTarget,
fx_buffers: Option<EffectsFramebufffersUserData>,
overview_zoom: Option<f64>,
) -> impl Iterator<Item = TileRenderElement<R>> + 'a {
let _span = tracy_client::span!("Tile::render");
@@ -1988,6 +1992,7 @@ impl<W: LayoutElement> Tile<W> {
focus_ring,
target,
fx_buffers.clone(),
overview_zoom,
);
let elements = elements.collect::<Vec<TileRenderElement<_>>>();
match open.render(
@@ -2015,6 +2020,7 @@ impl<W: LayoutElement> Tile<W> {
focus_ring,
target,
fx_buffers.clone(),
overview_zoom,
);
let elements = elements.collect::<Vec<TileRenderElement<_>>>();
match alpha.offscreen.render(renderer, scale, &elements) {
@@ -2032,9 +2038,15 @@ impl<W: LayoutElement> Tile<W> {
}
if open_anim_elem.is_none() && alpha_anim_elem.is_none() {
window_elems = Some(
self.render_inner(renderer, location, location, focus_ring, target, fx_buffers),
);
window_elems = Some(self.render_inner(
renderer,
location,
location,
focus_ring,
target,
fx_buffers,
overview_zoom,
));
}
open_anim_elem
@@ -2060,6 +2072,7 @@ impl<W: LayoutElement> Tile<W> {
false,
RenderTarget::Output,
None,
None,
);
// A bit of a hack to render blocked out as for screencast, but I think it's fine here.
@@ -2069,6 +2082,7 @@ impl<W: LayoutElement> Tile<W> {
false,
RenderTarget::Screencast,
None,
None,
);
RenderSnapshot {

View File

@@ -1724,6 +1724,7 @@ impl<W: LayoutElement> Workspace<W> {
renderer: &mut R,
target: RenderTarget,
focus_ring: bool,
overview_zoom: f64,
) -> (
impl Iterator<Item = WorkspaceRenderElement<R>>,
impl Iterator<Item = WorkspaceRenderElement<R>>,
@@ -1738,6 +1739,7 @@ impl<W: LayoutElement> Workspace<W> {
target,
scrolling_focus_ring,
fx_buffers.clone(),
overview_zoom,
);
let scrolling = scrolling.into_iter().map(WorkspaceRenderElement::from);
@@ -1750,6 +1752,7 @@ impl<W: LayoutElement> Workspace<W> {
target,
floating_focus_ring,
fx_buffers.clone(),
overview_zoom,
);
floating.into_iter().map(WorkspaceRenderElement::from)
});

View File

@@ -301,6 +301,10 @@ impl EffectsFramebuffers {
CurrentBuffer::Swapped => (&self.effects_swapped, &mut self.effects),
}
}
pub fn output_size(&self) -> Size<i32, Physical> {
self.output_size
}
}
#[allow(clippy::too_many_arguments)]

View File

@@ -110,11 +110,17 @@ impl BlurRenderElement {
corner_radius: f32,
scale: f64,
config: Blur,
zoom: f64,
) -> Self {
let mut final_sample_area = sample_area.to_f64().upscale(zoom);
let center = (fx_buffers.borrow().output_size.to_f64().to_logical(scale) / 2.).to_point();
final_sample_area.loc.x = center.x - (center.x - sample_area.loc.x as f64) * zoom;
final_sample_area.loc.y = center.y - (center.y - sample_area.loc.y as f64) * zoom;
Self::TrueBlur {
id: Id::new(),
scale,
src: sample_area.to_f64(),
src: final_sample_area,
transform: Transform::Normal,
size: sample_area.size,
corner_radius,