twors/
canvas.rs

1use crate::{Vertex2, error::Result};
2use wasm_bindgen::JsCast;
3use web_sys::{CanvasRenderingContext2d, Element, HtmlCanvasElement};
4
5pub struct Canvas {
6    element: HtmlCanvasElement,
7    context: CanvasRenderingContext2d,
8}
9
10impl Canvas {
11    pub fn new(element: Element) -> Result<Self> {
12        let element = element
13            .dyn_into::<HtmlCanvasElement>()
14            .map_err(|_| "Could not cast element into canvas")?;
15
16        let context = element
17            .get_context("2d")
18            .map_err(|_| "Error getting the canvas context")?;
19        let context = context.ok_or("Failed to find a canvas context")?;
20        let context = context
21            .dyn_into::<CanvasRenderingContext2d>()
22            .map_err(|_| "Could not cast canvas into a canvas rendering context")?;
23
24        Ok(Self { element, context })
25    }
26
27    pub fn context(&self) -> &CanvasRenderingContext2d {
28        &self.context
29    }
30
31    pub fn resize(&self, size: Vertex2<u32>) {
32        self.element.set_width(size.x);
33        self.element.set_height(size.y);
34    }
35
36    pub fn clear(&self) {
37        self.context.clear_rect(
38            0.0,
39            0.0,
40            self.element.width() as f64,
41            self.element.height() as f64,
42        );
43    }
44}