From a53d64053f8c4e6f48c1f2025cc7bc325b162ef7 Mon Sep 17 00:00:00 2001 From: Victor Brekenfeld Date: Fri, 14 Jan 2022 18:51:44 +0100 Subject: [PATCH] space: Handle multiple overlapping rects when merging damage --- src/desktop/space/mod.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/desktop/space/mod.rs b/src/desktop/space/mod.rs index 47116b4..7908b1f 100644 --- a/src/desktop/space/mod.rs +++ b/src/desktop/space/mod.rs @@ -557,12 +557,15 @@ impl Space { damage.retain(|rect| rect.overlaps(output_geo)); damage.retain(|rect| rect.size.h > 0 && rect.size.w > 0); // merge overlapping rectangles - damage = damage.into_iter().fold(Vec::new(), |mut new_damage, rect| { - if let Some(existing) = new_damage.iter_mut().find(|other| rect.overlaps(**other)) { - *existing = existing.merge(rect); - } else { - new_damage.push(rect); + damage = damage.into_iter().fold(Vec::new(), |new_damage, mut rect| { + // replace with drain_filter, when that becomes stable to reuse the original Vec's memory + let (overlapping, mut new_damage): (Vec<_>, Vec<_>) = + new_damage.into_iter().partition(|other| other.overlaps(rect)); + + for overlap in overlapping { + rect = rect.merge(overlap); } + new_damage.push(rect); new_damage });