dioxuscut_rasterizer/
backend.rs1use crate::scene::Scene;
4use image::RgbaImage;
5use thiserror::Error;
6
7#[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#[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 pub fn time_secs(&self) -> f64 {
53 self.frame as f64 / self.fps
54 }
55}
56
57pub trait RasterizerBackend: Send + Sync {
59 fn render_frame(&self, scene: &Scene, config: &FrameConfig) -> Result<RgbaImage, RasterError>;
61}