#![warn(missing_docs)]
use kurbo::Affine;
use oxframe_2d::{DrawItem, Primitive, SceneGraph};
use oxframe_core::Color;
pub use oxframe_core::Image;
#[cfg(feature = "cpu")]
mod blur;
#[cfg(feature = "cpu")]
mod cpu;
#[cfg(feature = "cpu")]
pub use cpu::CpuRenderer;
#[cfg(feature = "gpu")]
mod gpu;
#[cfg(feature = "gpu")]
pub use gpu::{GpuError, GpuRenderer};
#[derive(Debug, Clone, Copy)]
pub struct RenderOptions {
pub width: u32,
pub height: u32,
pub background: Color,
}
pub trait Renderer {
fn render(&mut self, graph: &SceneGraph, options: &RenderOptions) -> Image;
fn render_list(
&mut self,
graph: &SceneGraph,
items: &[DrawItem],
options: &RenderOptions,
) -> Image;
fn render_pixels(&mut self, graph: &SceneGraph, options: &RenderOptions) -> Image {
self.render(graph, options)
}
fn present_image(&mut self, _image: &Image) {}
}
#[cfg(any(feature = "cpu", feature = "gpu"))]
pub(crate) fn image_ids(items: &[DrawItem]) -> std::collections::BTreeSet<u64> {
items
.iter()
.filter_map(|item| match &item.prim {
Primitive::Image { image, .. } => Some(image.id),
_ => None,
})
.collect()
}
pub fn scene_to_pixels(scene: (u32, u32), out: (u32, u32)) -> Affine {
let (sw, sh) = (f64::from(scene.0), f64::from(scene.1));
let (ow, oh) = (f64::from(out.0), f64::from(out.1));
let k = (ow / sw).min(oh / sh);
Affine::translate((ow / 2.0, oh / 2.0)) * Affine::scale(k)
}