sdl2_extras/adapters/
canvas_adapter.rs

1use sdl2::{
2    render::{Canvas, TextureCreator},
3    video::{Window, WindowContext}
4};
5
6pub type GetCanvasError = String;
7
8pub struct CanvasAdapter {
9    canvas: Option<Canvas<Window>>
10}
11
12unsafe impl Send for CanvasAdapter {}
13unsafe impl Sync for CanvasAdapter {}
14
15impl Default for CanvasAdapter {
16    fn default() -> Self { CanvasAdapter::new(None) }
17}
18
19impl CanvasAdapter {
20    pub fn new(canvas: Option<Canvas<Window>>) -> Self {
21        CanvasAdapter {
22            canvas: canvas
23        }
24    }
25
26    pub fn borrow(&mut self) -> Option<&mut Canvas<Window>> {
27        return self.canvas.as_mut();
28    }
29
30    pub fn proceed<F>(&mut self, canvas_action: F) -> Result<(), GetCanvasError>
31    where F: Fn(&mut Canvas<Window>) {
32        let mut canvas = self.get_canvas()?;
33        canvas_action(&mut canvas);
34        Ok(())
35    }
36
37    pub fn texture_creator(&mut self) -> Result<TextureCreator<WindowContext>, GetCanvasError> {
38        let canvas = self.get_canvas()?;
39        Ok(canvas.texture_creator())
40    }
41
42    fn get_canvas(&mut self) -> Result<&mut Canvas<Window>, GetCanvasError> {
43        match self.borrow() {
44            Some(canvas) => Ok(canvas),
45            None => Err("Canvas not loaded".into())
46        }
47    }
48}