Skip to main content

cranpose_render_pixels/
lib.rs

1#![deny(unsafe_code)]
2
3mod draw;
4mod pipeline;
5pub mod scene;
6pub mod style;
7
8use cranpose_render_common::{RenderScene, Renderer};
9use cranpose_ui::LayoutTree;
10use cranpose_ui_graphics::Size;
11
12pub use draw::draw_scene;
13pub use scene::{HitRegion, Scene};
14
15#[derive(Debug)]
16pub enum PixelsRendererError {
17    Layout(String),
18}
19
20pub struct PixelsRenderer {
21    scene: Scene,
22    text_resources: draw::PixelsTextResources,
23}
24
25impl Default for PixelsRenderer {
26    fn default() -> Self {
27        Self::new()
28    }
29}
30
31impl PixelsRenderer {
32    pub fn new() -> Self {
33        Self {
34            scene: Scene::new(),
35            text_resources: draw::PixelsTextResources::default(),
36        }
37    }
38
39    pub fn draw(&self, frame: &mut [u8], width: u32, height: u32) {
40        draw::draw_scene_with_text_resources(
41            frame,
42            width,
43            height,
44            &self.scene,
45            &self.text_resources,
46        );
47    }
48}
49
50impl Renderer for PixelsRenderer {
51    type Scene = Scene;
52    type Error = PixelsRendererError;
53
54    fn attach_app_context_services(&mut self, app_context: &cranpose_ui::AppContext) {
55        app_context.set_text_measurer(draw::CachedFontTextMeasurer::with_text_resources(
56            self.text_resources.clone(),
57            64,
58        ));
59    }
60
61    fn scene(&self) -> &Self::Scene {
62        &self.scene
63    }
64
65    fn scene_mut(&mut self) -> &mut Self::Scene {
66        &mut self.scene
67    }
68
69    fn rebuild_scene(
70        &mut self,
71        layout_tree: &LayoutTree,
72        _viewport: Size,
73    ) -> Result<(), Self::Error> {
74        self.scene.clear();
75        pipeline::render_layout_tree(layout_tree.root(), &mut self.scene);
76        Ok(())
77    }
78
79    fn rebuild_scene_from_applier(
80        &mut self,
81        applier: &mut cranpose_core::MemoryApplier,
82        root: cranpose_core::NodeId,
83        _viewport: Size,
84    ) -> Result<(), Self::Error> {
85        self.scene.clear();
86        pipeline::render_from_applier(applier, root, &mut self.scene);
87        Ok(())
88    }
89}