diff options
author | 2024-04-10 20:23:07 +0200 | |
---|---|---|
committer | 2024-04-10 20:23:07 +0200 | |
commit | 1e8554bf02f366b18b31b9ea1dfb150f7935ca06 (patch) | |
tree | 95333a49013ab5a17d2232791b339386fa432384 | |
parent | fdd9896dc5f727f4c659ad6252f1ab36cca77762 (diff) | |
download | iced-1e8554bf02f366b18b31b9ea1dfb150f7935ca06.tar.gz iced-1e8554bf02f366b18b31b9ea1dfb150f7935ca06.tar.bz2 iced-1e8554bf02f366b18b31b9ea1dfb150f7935ca06.zip |
Sort damage by distance from origin in `iced_graphics::damage`
-rw-r--r-- | graphics/src/damage.rs | 7 | ||||
-rw-r--r-- | tiny_skia/src/layer.rs | 18 |
2 files changed, 12 insertions, 13 deletions
diff --git a/graphics/src/damage.rs b/graphics/src/damage.rs index ff8edaf5..17d60451 100644 --- a/graphics/src/damage.rs +++ b/graphics/src/damage.rs @@ -1,5 +1,5 @@ //! Compute the damage between frames. -use crate::core::Rectangle; +use crate::core::{Point, Rectangle}; /// Diffs the damage regions given some previous and current primitives. pub fn diff<T>( @@ -50,9 +50,10 @@ pub fn group(mut damage: Vec<Rectangle>, bounds: Rectangle) -> Vec<Rectangle> { const AREA_THRESHOLD: f32 = 20_000.0; damage.sort_by(|a, b| { - a.x.partial_cmp(&b.x) + a.center() + .distance(Point::ORIGIN) + .partial_cmp(&b.center().distance(Point::ORIGIN)) .unwrap_or(Ordering::Equal) - .then_with(|| a.y.partial_cmp(&b.y).unwrap_or(Ordering::Equal)) }); let mut output = Vec::new(); diff --git a/tiny_skia/src/layer.rs b/tiny_skia/src/layer.rs index d3d8b988..ec87c2bf 100644 --- a/tiny_skia/src/layer.rs +++ b/tiny_skia/src/layer.rs @@ -213,16 +213,14 @@ impl Layer { ¤t.primitives, |item| match item { Item::Live(primitive) => vec![primitive.visible_bounds()], - Item::Group(primitives, bounds, transformation) => { - damage::group( - primitives - .as_slice() - .iter() - .map(Primitive::visible_bounds) - .map(|bounds| bounds * *transformation) - .collect(), - *bounds, - ) + Item::Group(primitives, group_bounds, transformation) => { + primitives + .as_slice() + .iter() + .map(Primitive::visible_bounds) + .map(|bounds| bounds * *transformation) + .filter_map(|bounds| bounds.intersection(group_bounds)) + .collect() } Item::Cached(_, bounds, _) => { vec![*bounds] |