use crate::core::Rect;
use crate::performance::DirtyRegionTracker;
pub fn render_dirty_regions(
tracker: &mut DirtyRegionTracker,
ctx: &mut crate::render::RenderContext,
mut render_all: impl FnMut(&mut crate::render::RenderContext),
) {
tracker.merge();
if tracker.is_empty() {
return;
}
if tracker.len() > 16 {
if let Some(bounding) = tracker.get_bounding_rect() {
ctx.push_clip(bounding.x, bounding.y, bounding.width, bounding.height);
render_all(ctx);
ctx.pop_clip();
}
tracker.clear();
return;
}
let regions: Vec<Rect> = tracker.regions().iter().map(|r| r.rect).collect();
for rect in regions {
ctx.push_clip(rect.x, rect.y, rect.width, rect.height);
render_all(ctx);
ctx.pop_clip();
}
tracker.clear();
}
#[cfg(test)]
mod tests {
use super::*;
use crate::core::Rect;
#[test]
fn test_dirty_region_tracker() {
let mut tracker = DirtyRegionTracker::new();
tracker.add(Rect::new(0, 0, 100, 100));
tracker.add(Rect::new(50, 50, 100, 100));
tracker.merge();
assert_eq!(tracker.len(), 1);
assert!(!tracker.is_empty());
}
}