cranpose-render-pixels 0.1.11

Pixels renderer backend for Cranpose
Documentation
#![deny(unsafe_code)]

mod draw;
mod pipeline;
pub mod scene;
pub mod style;

use cranpose_render_common::{RenderScene, Renderer};
use cranpose_ui::LayoutTree;
use cranpose_ui_graphics::Size;

pub use draw::draw_scene;
pub use scene::{HitRegion, Scene};

#[derive(Debug)]
pub enum PixelsRendererError {
    Layout(String),
}

pub struct PixelsRenderer {
    scene: Scene,
    text_resources: draw::PixelsTextResources,
}

impl Default for PixelsRenderer {
    fn default() -> Self {
        Self::new()
    }
}

impl PixelsRenderer {
    pub fn new() -> Self {
        Self {
            scene: Scene::new(),
            text_resources: draw::PixelsTextResources::default(),
        }
    }

    pub fn draw(&self, frame: &mut [u8], width: u32, height: u32) {
        draw::draw_scene_with_text_resources(
            frame,
            width,
            height,
            &self.scene,
            &self.text_resources,
        );
    }
}

impl Renderer for PixelsRenderer {
    type Scene = Scene;
    type Error = PixelsRendererError;

    fn attach_app_context_services(&mut self, app_context: &cranpose_ui::AppContext) {
        app_context.set_text_measurer(draw::CachedFontTextMeasurer::with_text_resources(
            self.text_resources.clone(),
            64,
        ));
    }

    fn scene(&self) -> &Self::Scene {
        &self.scene
    }

    fn scene_mut(&mut self) -> &mut Self::Scene {
        &mut self.scene
    }

    fn rebuild_scene(
        &mut self,
        layout_tree: &LayoutTree,
        _viewport: Size,
    ) -> Result<(), Self::Error> {
        self.scene.clear();
        pipeline::render_layout_tree(layout_tree.root(), &mut self.scene);
        Ok(())
    }

    fn rebuild_scene_from_applier(
        &mut self,
        applier: &mut cranpose_core::MemoryApplier,
        root: cranpose_core::NodeId,
        _viewport: Size,
    ) -> Result<(), Self::Error> {
        self.scene.clear();
        pipeline::render_from_applier(applier, root, &mut self.scene);
        Ok(())
    }
}