cranpose_render_pixels/
lib.rs1#![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}