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