1//! Interface implemented by backends
2
3use crate::{InitError, Rect, SoftBufferError};
4
5use raw_window_handle::{HasDisplayHandle, HasWindowHandle};
6use std::num::NonZeroU32;
7
8pub(crate) trait ContextInterface<D: HasDisplayHandle + ?Sized> {
9 fn new(display: D) -> Result<Self, InitError<D>>
10 where
11 D: Sized,
12 Self: Sized;
13}
14
15pub(crate) trait SurfaceInterface<D: HasDisplayHandle + ?Sized, W: HasWindowHandle + ?Sized> {
16 type Context: ContextInterface<D>;
17 type Buffer<'a>: BufferInterface
18 where
19 Self: 'a;
20
21 fn new(window: W, context: &Self::Context) -> Result<Self, InitError<W>>
22 where
23 W: Sized,
24 Self: Sized;
25 /// Get the inner window handle.
26 fn window(&self) -> &W;
27 /// Resize the internal buffer to the given width and height.
28 fn resize(&mut self, width: NonZeroU32, height: NonZeroU32) -> Result<(), SoftBufferError>;
29 /// Get a mutable reference to the buffer.
30 fn buffer_mut(&mut self) -> Result<Self::Buffer<'_>, SoftBufferError>;
31 /// Fetch the buffer from the window.
32 fn fetch(&mut self) -> Result<Vec<u32>, SoftBufferError> {
33 Err(SoftBufferError::Unimplemented)
34 }
35}
36
37pub(crate) trait BufferInterface {
38 fn pixels(&self) -> &[u32];
39 fn pixels_mut(&mut self) -> &mut [u32];
40 fn age(&self) -> u8;
41 fn present_with_damage(self, damage: &[Rect]) -> Result<(), SoftBufferError>;
42 fn present(self) -> Result<(), SoftBufferError>;
43}
44