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