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}