sdl2_extras/adapters/
canvas_adapter.rs1use 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}