summaryrefslogtreecommitdiffstats
path: root/tiny_skia/src/window/compositor.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2024-05-23 13:29:45 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2024-05-23 13:29:45 +0200
commitd8ba6b0673a33724a177f3a1ba59705527280142 (patch)
tree89482c8d1e3a03e00b3a8151abbb81e30ae5898c /tiny_skia/src/window/compositor.rs
parent72ed8bcc8def9956e25f3720a3095fc96bb2eef0 (diff)
parent468794d918eb06c1dbebb33c32b10017ad335f05 (diff)
downloadiced-d8ba6b0673a33724a177f3a1ba59705527280142.tar.gz
iced-d8ba6b0673a33724a177f3a1ba59705527280142.tar.bz2
iced-d8ba6b0673a33724a177f3a1ba59705527280142.zip
Merge branch 'master' into feat/text-macro
Diffstat (limited to 'tiny_skia/src/window/compositor.rs')
-rw-r--r--tiny_skia/src/window/compositor.rs95
1 files changed, 45 insertions, 50 deletions
diff --git a/tiny_skia/src/window/compositor.rs b/tiny_skia/src/window/compositor.rs
index a98825f1..153af6d5 100644
--- a/tiny_skia/src/window/compositor.rs
+++ b/tiny_skia/src/window/compositor.rs
@@ -1,44 +1,55 @@
use crate::core::{Color, Rectangle, Size};
use crate::graphics::compositor::{self, Information};
use crate::graphics::damage;
-use crate::graphics::{Error, Viewport};
-use crate::{Backend, Primitive, Renderer, Settings};
+use crate::graphics::error::{self, Error};
+use crate::graphics::{self, Viewport};
+use crate::{Layer, Renderer, Settings};
use std::collections::VecDeque;
-use std::future::{self, Future};
use std::num::NonZeroU32;
+#[allow(missing_debug_implementations)]
pub struct Compositor {
context: softbuffer::Context<Box<dyn compositor::Window>>,
settings: Settings,
}
+#[allow(missing_debug_implementations)]
pub struct Surface {
window: softbuffer::Surface<
Box<dyn compositor::Window>,
Box<dyn compositor::Window>,
>,
clip_mask: tiny_skia::Mask,
- primitive_stack: VecDeque<Vec<Primitive>>,
+ layer_stack: VecDeque<Vec<Layer>>,
background_color: Color,
max_age: u8,
}
impl crate::graphics::Compositor for Compositor {
- type Settings = Settings;
type Renderer = Renderer;
type Surface = Surface;
- fn new<W: compositor::Window>(
- settings: Self::Settings,
+ async fn with_backend<W: compositor::Window>(
+ settings: graphics::Settings,
compatible_window: W,
- ) -> impl Future<Output = Result<Self, Error>> {
- future::ready(Ok(new(settings, compatible_window)))
+ backend: Option<&str>,
+ ) -> Result<Self, Error> {
+ match backend {
+ None | Some("tiny-skia") | Some("tiny_skia") => {
+ Ok(new(settings.into(), compatible_window))
+ }
+ Some(backend) => Err(Error::GraphicsAdapterNotFound {
+ backend: "tiny-skia",
+ reason: error::Reason::DidNotMatch {
+ preferred_backend: backend.to_owned(),
+ },
+ }),
+ }
}
fn create_renderer(&self) -> Self::Renderer {
Renderer::new(
- Backend::new(),
self.settings.default_font,
self.settings.default_text_size,
)
@@ -60,7 +71,7 @@ impl crate::graphics::Compositor for Compositor {
window,
clip_mask: tiny_skia::Mask::new(width, height)
.expect("Create clip mask"),
- primitive_stack: VecDeque::new(),
+ layer_stack: VecDeque::new(),
background_color: Color::BLACK,
max_age: 0,
};
@@ -86,7 +97,7 @@ impl crate::graphics::Compositor for Compositor {
surface.clip_mask =
tiny_skia::Mask::new(width, height).expect("Create clip mask");
- surface.primitive_stack.clear();
+ surface.layer_stack.clear();
}
fn fetch_information(&self) -> Information {
@@ -104,16 +115,7 @@ impl crate::graphics::Compositor for Compositor {
background_color: Color,
overlay: &[T],
) -> Result<(), compositor::SurfaceError> {
- renderer.with_primitives(|backend, primitives| {
- present(
- backend,
- surface,
- primitives,
- viewport,
- background_color,
- overlay,
- )
- })
+ present(renderer, surface, viewport, background_color, overlay)
}
fn screenshot<T: AsRef<str>>(
@@ -124,16 +126,7 @@ impl crate::graphics::Compositor for Compositor {
background_color: Color,
overlay: &[T],
) -> Vec<u8> {
- renderer.with_primitives(|backend, primitives| {
- screenshot(
- surface,
- backend,
- primitives,
- viewport,
- background_color,
- overlay,
- )
- })
+ screenshot(renderer, surface, viewport, background_color, overlay)
}
}
@@ -149,38 +142,42 @@ pub fn new<W: compositor::Window>(
}
pub fn present<T: AsRef<str>>(
- backend: &mut Backend,
+ renderer: &mut Renderer,
surface: &mut Surface,
- primitives: &[Primitive],
viewport: &Viewport,
background_color: Color,
overlay: &[T],
) -> Result<(), compositor::SurfaceError> {
let physical_size = viewport.physical_size();
- let scale_factor = viewport.scale_factor() as f32;
let mut buffer = surface
.window
.buffer_mut()
.map_err(|_| compositor::SurfaceError::Lost)?;
- let last_primitives = {
+ let last_layers = {
let age = buffer.age();
surface.max_age = surface.max_age.max(age);
- surface.primitive_stack.truncate(surface.max_age as usize);
+ surface.layer_stack.truncate(surface.max_age as usize);
if age > 0 {
- surface.primitive_stack.get(age as usize - 1)
+ surface.layer_stack.get(age as usize - 1)
} else {
None
}
};
- let damage = last_primitives
- .and_then(|last_primitives| {
- (surface.background_color == background_color)
- .then(|| damage::list(last_primitives, primitives))
+ 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())]);
@@ -188,10 +185,11 @@ pub fn present<T: AsRef<str>>(
return Ok(());
}
- surface.primitive_stack.push_front(primitives.to_vec());
+ surface.layer_stack.push_front(renderer.layers().to_vec());
surface.background_color = background_color;
- let damage = damage::group(damage, scale_factor, physical_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),
@@ -200,10 +198,9 @@ pub fn present<T: AsRef<str>>(
)
.expect("Create pixel map");
- backend.draw(
+ renderer.draw(
&mut pixels,
&mut surface.clip_mask,
- primitives,
viewport,
&damage,
background_color,
@@ -214,9 +211,8 @@ pub fn present<T: AsRef<str>>(
}
pub fn screenshot<T: AsRef<str>>(
+ renderer: &mut Renderer,
surface: &mut Surface,
- backend: &mut Backend,
- primitives: &[Primitive],
viewport: &Viewport,
background_color: Color,
overlay: &[T],
@@ -226,7 +222,7 @@ pub fn screenshot<T: AsRef<str>>(
let mut offscreen_buffer: Vec<u32> =
vec![0; size.width as usize * size.height as usize];
- backend.draw(
+ renderer.draw(
&mut tiny_skia::PixmapMut::from_bytes(
bytemuck::cast_slice_mut(&mut offscreen_buffer),
size.width,
@@ -234,7 +230,6 @@ pub fn screenshot<T: AsRef<str>>(
)
.expect("Create offscreen pixel map"),
&mut surface.clip_mask,
- primitives,
viewport,
&[Rectangle::with_size(Size::new(
size.width as f32,