forked from Mirror/niri
fix(blur): apply overview zoom to true blur
This commit is contained in:
@@ -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()
|
||||
}
|
||||
|
||||
@@ -249,6 +249,7 @@ impl MappedLayer {
|
||||
.top_left,
|
||||
self.scale,
|
||||
self.blur_config,
|
||||
1.,
|
||||
)
|
||||
.into(),
|
||||
)
|
||||
|
||||
@@ -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),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
});
|
||||
|
||||
@@ -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)]
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user