Skip to main content

kozan_core/html/
html_canvas_element.rs

1//! `HTMLCanvasElement` — a canvas for 2D/WebGL rendering.
2//!
3//! Chrome equivalent: `HTMLCanvasElement`.
4//! A replaced element — its intrinsic size comes from the `width`/`height`
5//! attributes (defaulting to 300x150 per HTML spec).
6
7use super::replaced::{IntrinsicSizing, ReplacedElement};
8use crate::Handle;
9use kozan_macros::{Element, Props};
10
11/// Default canvas width per HTML spec.
12const DEFAULT_CANVAS_WIDTH: f32 = 300.0;
13/// Default canvas height per HTML spec.
14const DEFAULT_CANVAS_HEIGHT: f32 = 150.0;
15
16/// A canvas element (`<canvas>`).
17///
18/// Chrome equivalent: `HTMLCanvasElement`.
19/// Replaced element — intrinsic size from width/height attributes.
20#[derive(Copy, Clone, Element)]
21#[element(tag = "canvas", data = CanvasData)]
22pub struct HtmlCanvasElement(Handle);
23
24/// Element-specific data for `<canvas>`.
25#[derive(Clone, Props)]
26#[props(element = HtmlCanvasElement)]
27pub struct CanvasData {
28    /// The canvas bitmap width in pixels.
29    #[prop]
30    pub canvas_width: f32,
31    /// The canvas bitmap height in pixels.
32    #[prop]
33    pub canvas_height: f32,
34}
35
36impl Default for CanvasData {
37    fn default() -> Self {
38        Self {
39            canvas_width: DEFAULT_CANVAS_WIDTH,
40            canvas_height: DEFAULT_CANVAS_HEIGHT,
41        }
42    }
43}
44
45impl ReplacedElement for HtmlCanvasElement {
46    fn intrinsic_sizing(&self) -> IntrinsicSizing {
47        IntrinsicSizing::from_size(self.canvas_width(), self.canvas_height())
48    }
49}
50
51#[cfg(test)]
52mod tests {
53    use super::*;
54    use crate::dom::document::Document;
55
56    #[test]
57    fn canvas_default_size() {
58        let doc = Document::new();
59        let canvas = doc.create::<HtmlCanvasElement>();
60
61        // HTML spec defaults: 300x150.
62        let sizing = canvas.intrinsic_sizing();
63        assert_eq!(sizing.width, Some(300.0));
64        assert_eq!(sizing.height, Some(150.0));
65    }
66
67    #[test]
68    fn canvas_custom_size() {
69        let doc = Document::new();
70        let canvas = doc.create::<HtmlCanvasElement>();
71
72        canvas.set_canvas_width(1024.0);
73        canvas.set_canvas_height(768.0);
74
75        let sizing = canvas.intrinsic_sizing();
76        assert_eq!(sizing.width, Some(1024.0));
77        assert_eq!(sizing.height, Some(768.0));
78    }
79}