diff --git a/src/niri.rs b/src/niri.rs index c74c5493..aef828f6 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -148,7 +148,7 @@ use crate::protocols::mutter_x11_interop::MutterX11InteropManagerState; use crate::protocols::output_management::OutputManagementManagerState; use crate::protocols::screencopy::{Screencopy, ScreencopyBuffer, ScreencopyManagerState}; use crate::protocols::virtual_pointer::VirtualPointerManagerState; -use crate::render_helpers::debug::draw_opaque_regions; +use crate::render_helpers::debug::push_opaque_regions; use crate::render_helpers::primary_gpu_texture::PrimaryGpuTextureRenderElement; use crate::render_helpers::renderer::NiriRenderer; use crate::render_helpers::solid_color::{SolidColorBuffer, SolidColorRenderElement}; @@ -4036,12 +4036,6 @@ impl Niri { self.render_inner(renderer, output, include_pointer, target, &mut |elem| { elements.push(elem) }); - - if self.debug_draw_opaque_regions { - let output_scale = Scale::from(output.current_scale().fractional_scale()); - draw_opaque_regions(&mut elements, output_scale); - } - elements } @@ -4066,6 +4060,15 @@ impl Niri { let output_scale = Scale::from(output.current_scale().fractional_scale()); + let push = if self.debug_draw_opaque_regions { + &mut move |elem| { + push_opaque_regions(&elem, output_scale, push); + push(elem); + } + } else { + push + }; + // The pointer goes on the top. if include_pointer && self.pointer_visibility.is_visible() { self.render_pointer(renderer, output, &mut |elem| push(elem.into())); diff --git a/src/render_helpers/debug.rs b/src/render_helpers/debug.rs index 6843aeb4..ed96d772 100644 --- a/src/render_helpers/debug.rs +++ b/src/render_helpers/debug.rs @@ -8,54 +8,45 @@ use super::renderer::NiriRenderer; use super::solid_color::SolidColorRenderElement; use crate::niri::OutputRenderElements; -pub fn draw_opaque_regions( - elements: &mut Vec>, +pub fn push_opaque_regions( + elem: &OutputRenderElements, scale: Scale, + push: &mut dyn FnMut(OutputRenderElements), ) { - let _span = tracy_client::span!("draw_opaque_regions"); + // HACK + if format!("{elem:?}").contains("ExtraDamage") { + return; + } - let mut i = 0; - while i < elements.len() { - let elem = &elements[i]; - i += 1; + let geo = elem.geometry(scale); + let mut opaque = elem.opaque_regions(scale).to_vec(); - // HACK - if format!("{elem:?}").contains("ExtraDamage") { - continue; - } + for rect in &mut opaque { + rect.loc += geo.loc; + } - let geo = elem.geometry(scale); - let mut opaque = elem.opaque_regions(scale).to_vec(); + let semitransparent = geo.subtract_rects(opaque.iter().copied()); - for rect in &mut opaque { - rect.loc += geo.loc; - } + for rect in opaque { + let color = SolidColorRenderElement::new( + Id::new(), + rect.to_f64().to_logical(scale), + CommitCounter::default(), + Color32F::from([0., 0., 0.2, 0.2]), + Kind::Unspecified, + ); + push(color.into()); + } - let semitransparent = geo.subtract_rects(opaque.iter().copied()); - - for rect in opaque { - let color = SolidColorRenderElement::new( - Id::new(), - rect.to_f64().to_logical(scale), - CommitCounter::default(), - Color32F::from([0., 0., 0.2, 0.2]), - Kind::Unspecified, - ); - elements.insert(i - 1, OutputRenderElements::SolidColor(color)); - i += 1; - } - - for rect in semitransparent { - let color = SolidColorRenderElement::new( - Id::new(), - rect.to_f64().to_logical(scale), - CommitCounter::default(), - Color32F::from([0.3, 0., 0., 0.3]), - Kind::Unspecified, - ); - elements.insert(i - 1, OutputRenderElements::SolidColor(color)); - i += 1; - } + for rect in semitransparent { + let color = SolidColorRenderElement::new( + Id::new(), + rect.to_f64().to_logical(scale), + CommitCounter::default(), + Color32F::from([0.3, 0., 0., 0.3]), + Kind::Unspecified, + ); + push(color.into()); } }