diff options
Diffstat (limited to 'tiny_skia/src/window/compositor.rs')
-rw-r--r-- | tiny_skia/src/window/compositor.rs | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/tiny_skia/src/window/compositor.rs b/tiny_skia/src/window/compositor.rs index e1a9dfec..153af6d5 100644 --- a/tiny_skia/src/window/compositor.rs +++ b/tiny_skia/src/window/compositor.rs @@ -1,5 +1,6 @@ use crate::core::{Color, Rectangle, Size}; use crate::graphics::compositor::{self, Information}; +use crate::graphics::damage; use crate::graphics::error::{self, Error}; use crate::graphics::{self, Viewport}; use crate::{Layer, Renderer, Settings}; @@ -154,7 +155,7 @@ pub fn present<T: AsRef<str>>( .buffer_mut() .map_err(|_| compositor::SurfaceError::Lost)?; - let _last_layers = { + let last_layers = { let age = buffer.age(); surface.max_age = surface.max_age.max(age); @@ -167,26 +168,28 @@ pub fn present<T: AsRef<str>>( } }; - // TODO - // let damage = last_layers - // .and_then(|last_layers| { - // (surface.background_color == background_color) - // .then(|| damage::layers(last_layers, renderer.layers())) - // }) - // .unwrap_or_else(|| vec![Rectangle::with_size(viewport.logical_size())]); - - let damage = vec![Rectangle::with_size(viewport.logical_size())]; + let damage = last_layers + .and_then(|last_layers| { + (surface.background_color == background_color).then(|| { + damage::diff( + last_layers, + renderer.layers(), + |layer| vec![layer.bounds], + Layer::damage, + ) + }) + }) + .unwrap_or_else(|| vec![Rectangle::with_size(viewport.logical_size())]); if damage.is_empty() { return Ok(()); } - surface - .layer_stack - .push_front(renderer.layers().cloned().collect()); + surface.layer_stack.push_front(renderer.layers().to_vec()); surface.background_color = background_color; - // let damage = damage::group(damage, viewport.logical_size()); + let damage = + damage::group(damage, Rectangle::with_size(viewport.logical_size())); let mut pixels = tiny_skia::PixmapMut::from_bytes( bytemuck::cast_slice_mut(&mut buffer), |