Skip to content

Commit f6d1070

Browse files
committed
damage: small fixes
1 parent 33d6f82 commit f6d1070

File tree

1 file changed

+30
-16
lines changed
  • src/backend/renderer/damage

1 file changed

+30
-16
lines changed

src/backend/renderer/damage/mod.rs

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -628,16 +628,24 @@ impl OutputDamageTracker {
628628
let mut force_effect_redraw = false;
629629

630630
// add the damage for elements gone that are not covered an opaque region
631-
let elements_gone = self.last_state.elements.iter().filter(|(id, _)| {
632-
element_render_states
633-
.states
634-
.get(id)
635-
.map(|state| state.presentation_state == RenderElementPresentationState::Skipped)
636-
.unwrap_or(true)
637-
});
631+
let mut elements_gone = self
632+
.last_state
633+
.elements
634+
.iter()
635+
.filter(|(id, _)| {
636+
element_render_states
637+
.states
638+
.get(id)
639+
.map(|state| state.presentation_state == RenderElementPresentationState::Skipped)
640+
.unwrap_or(true)
641+
})
642+
.peekable();
643+
644+
if elements_gone.peek().is_some() {
645+
force_effect_redraw = true;
646+
}
638647

639648
for (_, state) in elements_gone {
640-
force_effect_redraw = true;
641649
self.damage.extend(
642650
state
643651
.last_instances
@@ -695,24 +703,29 @@ impl OutputDamageTracker {
695703
self.opaque_regions_index[z_index].start
696704
};
697705
let element_geometry = element.geometry(output_scale);
698-
let intersection = element_geometry.intersection(output_geo);
706+
// SAFETY: render_elements only contains elements overlapping with the output geometry
707+
let intersection = element_geometry.intersection(output_geo).unwrap();
699708
let element_state = element_render_states.states.get_mut(element.id()).unwrap();
700709
let with_element_state = with_states
701710
.as_ref()
702711
.and_then(|states| states.states.get(element.id()));
703712

704713
if element_state.needs_capture
705714
|| with_element_state.is_some_and(|state| state.needs_capture)
706-
|| intersection.is_some_and(|i| self.damage.iter().skip(damage_index).any(|d| d.overlaps(i)))
715+
|| self
716+
.damage
717+
.iter()
718+
.skip(damage_index)
719+
.any(|d| d.overlaps(intersection))
707720
{
708721
element_state.needs_capture = true;
709-
self.damage.push(intersection.unwrap());
722+
self.damage.push(intersection);
710723
// also drop all opaque regions on top, so they don't block re-drawing below the blur element
711724
for region in self.opaque_regions.iter_mut().take(opaque_regions_index) {
712725
// we want to leave `self.opaque_regions_index` intact,
713726
// fixing it up would be very involved, so lets do the next best thing
714727
// and keep at least part of the opaque region, if possible.
715-
*region = Rectangle::subtract_rect(*region, intersection.unwrap())
728+
*region = Rectangle::subtract_rect(*region, intersection)
716729
.into_iter()
717730
.next()
718731
.unwrap_or_default();
@@ -918,25 +931,26 @@ impl OutputDamageTracker {
918931
element_damage,
919932
);
920933

934+
let element_src = element.src();
921935
if states
922936
.element_render_state(element_id.clone())
923937
.is_some_and(|state| state.needs_capture)
924938
{
925939
let cache = self
926940
.last_state
927941
.effects_cache
928-
.entry(element.id().clone())
942+
.entry(element_id.clone())
929943
.or_default();
930-
element.capture_framebuffer(&mut frame, element.src(), element_geometry, cache)?;
944+
element.capture_framebuffer(&mut frame, element_src, element_geometry, cache)?;
931945
}
932946

933947
element.draw(
934948
&mut frame,
935-
element.src(),
949+
element_src,
936950
element_geometry,
937951
&element_damage,
938952
&element_opaque_regions,
939-
self.last_state.effects_cache.get(element.id()),
953+
self.last_state.effects_cache.get(element_id),
940954
)?;
941955
}
942956

0 commit comments

Comments
 (0)