Skip to main content

dioxuscut_rasterizer/
backend.rs

1//! Rasterizer backend trait and frame configuration.
2
3use crate::scene::Scene;
4use image::RgbaImage;
5use thiserror::Error;
6
7/// Error type for rasterization failures.
8#[derive(Error, Debug)]
9pub enum RasterError {
10    #[error("Backend initialization failed: {0}")]
11    Init(String),
12    #[error("Failed to render frame {frame}: {reason}")]
13    Frame { frame: u32, reason: String },
14    #[error("Image encode error: {0}")]
15    ImageEncode(String),
16    #[error("Image asset error for {path}: {reason}")]
17    ImageAsset { path: String, reason: String },
18    #[error("Media asset error for {path}: {reason}")]
19    MediaAsset { path: String, reason: String },
20    #[error("Font asset error for {path}: {reason}")]
21    FontAsset { path: String, reason: String },
22    #[error("Scene compositing error: {0}")]
23    Scene(String),
24    #[error("Render cancelled")]
25    Cancelled,
26    #[error("Render timed out")]
27    Timeout,
28    #[error("IO error: {0}")]
29    Io(#[from] std::io::Error),
30}
31
32/// Per-frame rendering configuration.
33#[derive(Debug, Clone)]
34pub struct FrameConfig {
35    pub width: u32,
36    pub height: u32,
37    pub frame: u32,
38    pub fps: f64,
39}
40
41impl FrameConfig {
42    pub fn new(width: u32, height: u32, frame: u32, fps: f64) -> Self {
43        Self {
44            width,
45            height,
46            frame,
47            fps,
48        }
49    }
50
51    /// Current playback time in seconds.
52    pub fn time_secs(&self) -> f64 {
53        self.frame as f64 / self.fps
54    }
55}
56
57/// Trait implemented by every rasterizer backend.
58pub trait RasterizerBackend: Send + Sync {
59    /// Render a single `Scene` into an `RgbaImage`.
60    fn render_frame(&self, scene: &Scene, config: &FrameConfig) -> Result<RgbaImage, RasterError>;
61}