anyrender_vello_cpu 0.10.0

vello_cpu backend for anyrender
Documentation
use crate::VelloCpuScenePainter;
use anyrender::ImageRenderer;
use debug_timer::debug_timer;
use vello_cpu::{RenderContext, RenderMode};

pub struct VelloCpuImageRenderer {
    scene: VelloCpuScenePainter,
}

impl ImageRenderer for VelloCpuImageRenderer {
    type ScenePainter<'a> = VelloCpuScenePainter;

    fn new(width: u32, height: u32) -> Self {
        Self {
            scene: VelloCpuScenePainter(RenderContext::new(width as u16, height as u16)),
        }
    }

    fn resize(&mut self, width: u32, height: u32) {
        self.scene.0 = RenderContext::new(width as u16, height as u16);
    }

    fn reset(&mut self) {
        self.scene.0.reset();
    }

    fn render<F: FnOnce(&mut Self::ScenePainter<'_>)>(&mut self, draw_fn: F, buffer: &mut [u8]) {
        debug_timer!(timer, feature = "log_frame_times");

        draw_fn(&mut self.scene);
        timer.record_time("cmds");

        self.scene.0.flush();
        timer.record_time("flush");

        self.scene.0.render_to_buffer(
            buffer,
            self.scene.0.width(),
            self.scene.0.height(),
            RenderMode::OptimizeSpeed,
        );
        timer.record_time("render");

        timer.print_times("vello_cpu: ");
    }

    fn render_to_vec<F: FnOnce(&mut Self::ScenePainter<'_>)>(
        &mut self,
        draw_fn: F,
        buffer: &mut Vec<u8>,
    ) {
        let width = self.scene.0.width();
        let height = self.scene.0.height();
        buffer.resize(width as usize * height as usize * 4, 0);
        self.render(draw_fn, buffer);
    }
}