#![forbid(unsafe_code)]
use std::{error::Error, fmt::Debug};
pub use raw_window_handle::{DisplayHandle, HandleError, HasDisplayHandle, HasWindowHandle, WindowHandle};
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub struct RenderExtent {
pub width: u32,
pub height: u32,
}
impl RenderExtent {
pub const fn new(width: u32, height: u32) -> Self {
Self { width, height }
}
pub const fn is_empty(self) -> bool {
self.width == 0 || self.height == 0
}
}
pub trait RenderWindow: Debug + HasDisplayHandle + HasWindowHandle {
fn size(&self) -> RenderExtent;
}
pub trait Renderer: Debug {
type Error: Error + Send + Sync + 'static;
fn prepare_frame(&mut self) -> Result<(), Self::Error>;
fn render(&mut self) -> Result<(), Self::Error>;
fn resize(&mut self, extent: RenderExtent) -> Result<(), Self::Error>;
}
pub type BoxedRenderer<E> = Box<dyn Renderer<Error = E>>;
pub trait RendererFactory: Debug {
type Error: Error + Send + Sync + 'static;
fn create_renderer(&mut self, window: &dyn RenderWindow) -> Result<BoxedRenderer<Self::Error>, Self::Error>;
}