diff options
Diffstat (limited to 'tiny_skia/src/window/compositor.rs')
-rw-r--r-- | tiny_skia/src/window/compositor.rs | 56 |
1 files changed, 29 insertions, 27 deletions
diff --git a/tiny_skia/src/window/compositor.rs b/tiny_skia/src/window/compositor.rs index 788d7297..b5e9bcd8 100644 --- a/tiny_skia/src/window/compositor.rs +++ b/tiny_skia/src/window/compositor.rs @@ -4,34 +4,33 @@ use crate::graphics::damage; use crate::graphics::{Error, Viewport}; use crate::{Backend, Primitive, Renderer, Settings}; -use raw_window_handle::{HasDisplayHandle, HasWindowHandle}; use std::collections::VecDeque; use std::marker::PhantomData; use std::num::NonZeroU32; -pub struct Compositor<W: HasDisplayHandle + HasWindowHandle, Theme> { - context: Option<softbuffer::Context<W>>, +pub struct Compositor<Theme> { + context: Option<softbuffer::Context<Box<dyn compositor::Window>>>, settings: Settings, _theme: PhantomData<Theme>, } -pub struct Surface<W: HasDisplayHandle + HasWindowHandle> { - window: softbuffer::Surface<W, W>, +pub struct Surface { + window: softbuffer::Surface< + Box<dyn compositor::Window>, + Box<dyn compositor::Window>, + >, clip_mask: tiny_skia::Mask, // Primitives of existing buffers, by decreasing age primitives: VecDeque<Vec<Primitive>>, background_color: Color, } -// XXX avoid clone bound? -impl<W: HasDisplayHandle + HasWindowHandle + Clone, Theme> - crate::graphics::Compositor<W> for Compositor<W, Theme> -{ +impl<Theme> crate::graphics::Compositor for Compositor<Theme> { type Settings = Settings; type Renderer = Renderer<Theme>; - type Surface = Surface<W>; + type Surface = Surface; - fn new( + fn new<W: compositor::Window>( settings: Self::Settings, compatible_window: Option<W>, ) -> Result<Self, Error> { @@ -46,19 +45,21 @@ impl<W: HasDisplayHandle + HasWindowHandle + Clone, Theme> ) } - fn create_surface( + fn create_surface<W: compositor::Window + Clone>( &mut self, window: W, width: u32, height: u32, - ) -> Surface<W> { + ) -> Surface { let window = if let Some(context) = self.context.as_ref() { - softbuffer::Surface::new(context, window) + softbuffer::Surface::new(context, Box::new(window.clone()) as _) .expect("Create softbuffer surface for window") } else { - let context = softbuffer::Context::new(window.clone()) - .expect("Create softbuffer context for window"); - softbuffer::Surface::new(&context, window) + let context = + softbuffer::Context::new(Box::new(window.clone()) as _) + .expect("Create softbuffer context for window"); + + softbuffer::Surface::new(&context, Box::new(window.clone()) as _) .expect("Create softbuffer surface for window") }; @@ -73,7 +74,7 @@ impl<W: HasDisplayHandle + HasWindowHandle + Clone, Theme> fn configure_surface( &mut self, - surface: &mut Surface<W>, + surface: &mut Surface, width: u32, height: u32, ) { @@ -92,7 +93,7 @@ impl<W: HasDisplayHandle + HasWindowHandle + Clone, Theme> fn present<T: AsRef<str>>( &mut self, renderer: &mut Self::Renderer, - surface: &mut Surface<W>, + surface: &mut Surface, viewport: &Viewport, background_color: Color, overlay: &[T], @@ -130,13 +131,14 @@ impl<W: HasDisplayHandle + HasWindowHandle + Clone, Theme> } } -pub fn new<W: HasWindowHandle + HasDisplayHandle, Theme>( +pub fn new<W: compositor::Window, Theme>( settings: Settings, compatible_window: Option<W>, -) -> Compositor<W, Theme> { +) -> Compositor<Theme> { #[allow(unsafe_code)] - let context = - compatible_window.and_then(|w| softbuffer::Context::new(w).ok()); + let context = compatible_window + .and_then(|w| softbuffer::Context::new(Box::new(w) as _).ok()); + Compositor { context, settings, @@ -144,9 +146,9 @@ pub fn new<W: HasWindowHandle + HasDisplayHandle, Theme>( } } -pub fn present<W: HasDisplayHandle + HasWindowHandle, T: AsRef<str>>( +pub fn present<T: AsRef<str>>( backend: &mut Backend, - surface: &mut Surface<W>, + surface: &mut Surface, primitives: &[Primitive], viewport: &Viewport, background_color: Color, @@ -218,8 +220,8 @@ pub fn present<W: HasDisplayHandle + HasWindowHandle, T: AsRef<str>>( buffer.present().map_err(|_| compositor::SurfaceError::Lost) } -pub fn screenshot<W: HasDisplayHandle + HasWindowHandle, T: AsRef<str>>( - surface: &mut Surface<W>, +pub fn screenshot<T: AsRef<str>>( + surface: &mut Surface, backend: &mut Backend, primitives: &[Primitive], viewport: &Viewport, |