diff options
author | 2024-01-09 07:19:15 -0800 | |
---|---|---|
committer | 2024-01-16 21:34:38 -0800 | |
commit | 7289b6091b61b0aa448a756cfe32211c78a4cce0 (patch) | |
tree | 480de1e0b9b0694e221ef7fb82f018e2e97eb4af /tiny_skia | |
parent | ff268c8c4268d930fc337636302175d44e201448 (diff) | |
download | iced-7289b6091b61b0aa448a756cfe32211c78a4cce0.tar.gz iced-7289b6091b61b0aa448a756cfe32211c78a4cce0.tar.bz2 iced-7289b6091b61b0aa448a756cfe32211c78a4cce0.zip |
WIP raw-window-handle 0.6
Diffstat (limited to 'tiny_skia')
-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 d99b85d4..788d7297 100644 --- a/tiny_skia/src/window/compositor.rs +++ b/tiny_skia/src/window/compositor.rs @@ -4,33 +4,36 @@ use crate::graphics::damage; use crate::graphics::{Error, Viewport}; use crate::{Backend, Primitive, Renderer, Settings}; -use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}; +use raw_window_handle::{HasDisplayHandle, HasWindowHandle}; use std::collections::VecDeque; use std::marker::PhantomData; use std::num::NonZeroU32; -pub struct Compositor<Theme> { - context: Option<softbuffer::Context>, +pub struct Compositor<W: HasDisplayHandle + HasWindowHandle, Theme> { + context: Option<softbuffer::Context<W>>, settings: Settings, _theme: PhantomData<Theme>, } -pub struct Surface { - window: softbuffer::Surface, +pub struct Surface<W: HasDisplayHandle + HasWindowHandle> { + window: softbuffer::Surface<W, W>, clip_mask: tiny_skia::Mask, // Primitives of existing buffers, by decreasing age primitives: VecDeque<Vec<Primitive>>, background_color: Color, } -impl<Theme> crate::graphics::Compositor for Compositor<Theme> { +// XXX avoid clone bound? +impl<W: HasDisplayHandle + HasWindowHandle + Clone, Theme> + crate::graphics::Compositor<W> for Compositor<W, Theme> +{ type Settings = Settings; type Renderer = Renderer<Theme>; - type Surface = Surface; + type Surface = Surface<W>; - fn new<W: HasRawWindowHandle + HasRawDisplayHandle>( + fn new( settings: Self::Settings, - compatible_window: Option<&W>, + compatible_window: Option<W>, ) -> Result<Self, Error> { Ok(new(settings, compatible_window)) } @@ -43,20 +46,19 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { ) } - fn create_surface<W: HasRawWindowHandle + HasRawDisplayHandle>( + fn create_surface( &mut self, - window: &W, + window: W, width: u32, height: u32, - ) -> Surface { - #[allow(unsafe_code)] + ) -> Surface<W> { let window = if let Some(context) = self.context.as_ref() { - unsafe { softbuffer::Surface::new(context, window) } + softbuffer::Surface::new(context, window) .expect("Create softbuffer surface for window") } else { - let context = unsafe { softbuffer::Context::new(window) } + let context = softbuffer::Context::new(window.clone()) .expect("Create softbuffer context for window"); - unsafe { softbuffer::Surface::new(&context, window) } + softbuffer::Surface::new(&context, window) .expect("Create softbuffer surface for window") }; @@ -71,7 +73,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { fn configure_surface( &mut self, - surface: &mut Surface, + surface: &mut Surface<W>, width: u32, height: u32, ) { @@ -90,7 +92,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { fn present<T: AsRef<str>>( &mut self, renderer: &mut Self::Renderer, - surface: &mut Self::Surface, + surface: &mut Surface<W>, viewport: &Viewport, background_color: Color, overlay: &[T], @@ -128,13 +130,13 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { } } -pub fn new<W: HasRawWindowHandle + HasRawDisplayHandle, Theme>( +pub fn new<W: HasWindowHandle + HasDisplayHandle, Theme>( settings: Settings, - compatible_window: Option<&W>, -) -> Compositor<Theme> { + compatible_window: Option<W>, +) -> Compositor<W, Theme> { #[allow(unsafe_code)] - let context = compatible_window - .and_then(|w| unsafe { softbuffer::Context::new(w) }.ok()); + let context = + compatible_window.and_then(|w| softbuffer::Context::new(w).ok()); Compositor { context, settings, @@ -142,9 +144,9 @@ pub fn new<W: HasRawWindowHandle + HasRawDisplayHandle, Theme>( } } -pub fn present<T: AsRef<str>>( +pub fn present<W: HasDisplayHandle + HasWindowHandle, T: AsRef<str>>( backend: &mut Backend, - surface: &mut Surface, + surface: &mut Surface<W>, primitives: &[Primitive], viewport: &Viewport, background_color: Color, @@ -216,8 +218,8 @@ pub fn present<T: AsRef<str>>( buffer.present().map_err(|_| compositor::SurfaceError::Lost) } -pub fn screenshot<T: AsRef<str>>( - surface: &mut Surface, +pub fn screenshot<W: HasDisplayHandle + HasWindowHandle, T: AsRef<str>>( + surface: &mut Surface<W>, backend: &mut Backend, primitives: &[Primitive], viewport: &Viewport, |