use crate::scene::Scene;
use image::RgbaImage;
use thiserror::Error;
#[derive(Error, Debug)]
pub enum RasterError {
#[error("Backend initialization failed: {0}")]
Init(String),
#[error("Failed to render frame {frame}: {reason}")]
Frame { frame: u32, reason: String },
#[error("Image encode error: {0}")]
ImageEncode(String),
#[error("Image asset error for {path}: {reason}")]
ImageAsset { path: String, reason: String },
#[error("Media asset error for {path}: {reason}")]
MediaAsset { path: String, reason: String },
#[error("Font asset error for {path}: {reason}")]
FontAsset { path: String, reason: String },
#[error("Scene compositing error: {0}")]
Scene(String),
#[error("Render cancelled")]
Cancelled,
#[error("Render timed out")]
Timeout,
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
}
#[derive(Debug, Clone)]
pub struct FrameConfig {
pub width: u32,
pub height: u32,
pub frame: u32,
pub fps: f64,
}
impl FrameConfig {
pub fn new(width: u32, height: u32, frame: u32, fps: f64) -> Self {
Self {
width,
height,
frame,
fps,
}
}
pub fn time_secs(&self) -> f64 {
self.frame as f64 / self.fps
}
}
pub trait RasterizerBackend: Send + Sync {
fn render_frame(&self, scene: &Scene, config: &FrameConfig) -> Result<RgbaImage, RasterError>;
}