summaryrefslogtreecommitdiffstats
path: root/tiny_skia
diff options
context:
space:
mode:
authorLibravatar Ian Douglas Scott <idscott@system76.com>2024-01-09 07:19:15 -0800
committerLibravatar Ian Douglas Scott <idscott@system76.com>2024-01-16 21:34:38 -0800
commit7289b6091b61b0aa448a756cfe32211c78a4cce0 (patch)
tree480de1e0b9b0694e221ef7fb82f018e2e97eb4af /tiny_skia
parentff268c8c4268d930fc337636302175d44e201448 (diff)
downloadiced-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.rs56
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,