iced_graphics/
compositor.rs1use crate::core::Color;
4use crate::core::backend;
5use crate::core::font;
6use crate::core::renderer;
7use crate::futures::{MaybeSend, MaybeSync};
8use crate::{Shell, Viewport};
9
10use raw_window_handle::{HasDisplayHandle, HasWindowHandle};
11use thiserror::Error;
12
13use std::borrow::Cow;
14use std::fmt::Debug;
15
16pub trait Compositor: Sized {
18 type Renderer;
20
21 type Surface;
23
24 fn new(
26 settings: backend::Settings,
27 display: impl Display + Clone,
28 compatible_window: impl Window + Clone,
29 shell: Shell,
30 ) -> impl Future<Output = Result<Self, backend::Error>>;
31
32 fn create_renderer(&self, settings: renderer::Settings) -> Self::Renderer;
34
35 fn create_surface(
39 &mut self,
40 window: impl Window + Clone,
41 width: u32,
42 height: u32,
43 ) -> Self::Surface;
44
45 fn configure_surface(&mut self, surface: &mut Self::Surface, width: u32, height: u32);
49
50 fn information(&self) -> Information;
52
53 fn load_font(&mut self, font: Cow<'static, [u8]>) -> Result<(), font::Error> {
55 crate::text::font_system()
56 .write()
57 .expect("Write to font system")
58 .load_font(font);
59
60 Ok(())
62 }
63
64 fn list_fonts(&mut self) -> Result<Vec<font::Family>, font::Error> {
66 use std::collections::BTreeSet;
67
68 let font_system = crate::text::font_system()
69 .read()
70 .expect("Read from font system");
71
72 let families = BTreeSet::from_iter(font_system.families());
73
74 Ok(families.into_iter().map(font::Family::name).collect())
75 }
76
77 fn present(
82 &mut self,
83 renderer: &mut Self::Renderer,
84 surface: &mut Self::Surface,
85 viewport: &Viewport,
86 background_color: Color,
87 on_pre_present: impl FnOnce(),
88 ) -> Result<(), SurfaceError>;
89
90 fn screenshot(
95 &mut self,
96 renderer: &mut Self::Renderer,
97 viewport: &Viewport,
98 background_color: Color,
99 ) -> Vec<u8>;
100}
101
102pub trait Window: HasWindowHandle + Debug + MaybeSend + MaybeSync + 'static {}
107
108impl<T> Window for T where T: HasWindowHandle + Debug + MaybeSend + MaybeSync + 'static {}
109
110pub trait Display: HasDisplayHandle + Debug + Send + Sync + 'static {}
115
116impl<T> Display for T where T: HasDisplayHandle + Debug + Send + Sync + 'static {}
117
118pub trait Default {
120 type Compositor: Compositor<Renderer = Self>;
122}
123
124#[derive(Clone, PartialEq, Eq, Debug, Error)]
126pub enum SurfaceError {
127 #[error("A timeout was encountered while trying to acquire the next frame")]
129 Timeout,
130 #[error("The underlying surface has changed, and therefore the surface must be updated.")]
132 Outdated,
133 #[error("The surface has been lost and needs to be recreated")]
135 Lost,
136 #[error("There is no more memory left to allocate a new frame")]
138 OutOfMemory,
139 #[error("The surface is occluded and must not be drawn to")]
141 Occluded,
142 #[error("Acquiring a texture failed with a generic error")]
144 Other,
145}
146
147#[derive(Debug)]
149pub struct Information {
150 pub adapter: String,
152 pub backend: String,
154}
155
156#[cfg(debug_assertions)]
157impl Compositor for () {
158 type Renderer = ();
159 type Surface = ();
160
161 async fn new(
162 _settings: backend::Settings,
163 _display: impl Display,
164 _compatible_window: impl Window + Clone,
165 _shell: Shell,
166 ) -> Result<Self, backend::Error> {
167 Ok(())
168 }
169
170 fn create_renderer(&self, _settings: renderer::Settings) -> Self::Renderer {}
171
172 fn create_surface(
173 &mut self,
174 _window: impl Window + Clone,
175 _width: u32,
176 _height: u32,
177 ) -> Self::Surface {
178 }
179
180 fn configure_surface(&mut self, _surface: &mut Self::Surface, _width: u32, _height: u32) {}
181
182 fn load_font(&mut self, _font: Cow<'static, [u8]>) -> Result<(), font::Error> {
183 Ok(())
184 }
185
186 fn list_fonts(&mut self) -> Result<Vec<font::Family>, font::Error> {
187 Ok(Vec::new())
188 }
189
190 fn information(&self) -> Information {
191 Information {
192 adapter: String::from("Null Renderer"),
193 backend: String::from("Null"),
194 }
195 }
196
197 fn present(
198 &mut self,
199 _renderer: &mut Self::Renderer,
200 _surface: &mut Self::Surface,
201 _viewport: &Viewport,
202 _background_color: Color,
203 _on_pre_present: impl FnOnce(),
204 ) -> Result<(), SurfaceError> {
205 Ok(())
206 }
207
208 fn screenshot(
209 &mut self,
210 _renderer: &mut Self::Renderer,
211 _viewport: &Viewport,
212 _background_color: Color,
213 ) -> Vec<u8> {
214 vec![]
215 }
216}
217
218#[cfg(debug_assertions)]
219impl Default for () {
220 type Compositor = ();
221}