use crate::{ColorU8, geom};
pub trait Surface {
fn prepare(&mut self, size: geom::Size);
fn fill(&mut self, fill: Paint);
fn draw_rect(&mut self, rect: &Rect) {
let path = rect.rect.to_path();
let rpath = self::Path {
path: &path,
fill: rect.fill,
stroke: rect.stroke,
transform: rect.transform,
};
self.draw_path(&rpath);
}
fn draw_path(&mut self, path: &Path);
fn push_clip(&mut self, clip: &Clip);
fn pop_clip(&mut self);
}
#[derive(Debug, Clone, Copy)]
pub enum Paint {
Solid(ColorU8),
}
impl From<ColorU8> for Paint {
fn from(value: ColorU8) -> Self {
Paint::Solid(value)
}
}
#[derive(Debug, Clone, Copy, Default)]
pub enum LinePattern<'a> {
#[default]
Solid,
Dash(&'a [f32]),
}
#[derive(Debug, Clone, Copy)]
pub struct Stroke<'a> {
pub color: ColorU8,
pub width: f32,
pub pattern: LinePattern<'a>,
}
#[derive(Debug, Clone)]
pub struct Rect<'a> {
pub rect: geom::Rect,
pub fill: Option<Paint>,
pub stroke: Option<Stroke<'a>>,
pub transform: Option<&'a geom::Transform>,
}
#[derive(Debug, Clone)]
pub struct Path<'a> {
pub path: &'a geom::Path,
pub fill: Option<Paint>,
pub stroke: Option<Stroke<'a>>,
pub transform: Option<&'a geom::Transform>,
}
#[derive(Debug, Clone)]
pub struct Clip<'a> {
pub rect: &'a geom::Rect,
pub transform: Option<&'a geom::Transform>,
}