summaryrefslogblamecommitdiffstats
path: root/renderer/src/custom.rs
blob: 680aa0b549566e1ec1b072a55d2ac0e5208f1915 (plain) (tree)



































































































































































                                                                            
use crate::core::image;
use crate::core::renderer;
use crate::core::svg;
use crate::core::text::Text;
use crate::core::{
    Background, Color, Font, Pixels, Point, Rectangle, Size, Transformation,
};
use crate::graphics::compositor;
use crate::graphics::text::{Editor, Paragraph};
use crate::graphics::{Mesh, Viewport};

#[cfg(feature = "geometry")]
use crate::graphics::geometry::{self, Fill, Path, Stroke};

use std::borrow::Cow;

pub trait Renderer {
    fn draw_mesh(&mut self, mesh: Mesh);

    fn start_layer(&mut self);

    fn end_layer(&mut self, bounds: Rectangle);

    fn start_transformation(&mut self);

    fn end_transformation(&mut self, transformation: Transformation);

    fn fill_quad(&mut self, quad: renderer::Quad, background: Background);

    fn clear(&mut self);

    fn default_font(&self) -> Font;

    fn default_size(&self) -> Pixels;

    fn load_font(&mut self, bytes: Cow<'static, [u8]>);

    fn fill_paragraph(
        &mut self,
        paragraph: &Paragraph,
        position: Point,
        color: Color,
        clip_bounds: Rectangle,
    );

    fn fill_editor(
        &mut self,
        editor: &Editor,
        position: Point,
        color: Color,
        clip_bounds: Rectangle,
    );

    fn fill_text(
        &mut self,
        text: Text<'_, Font>,
        position: Point,
        color: Color,
        clip_bounds: Rectangle,
    );

    fn measure_image(&self, handle: &image::Handle) -> Size<u32>;

    fn draw_image(
        &mut self,
        handle: image::Handle,
        filter_method: image::FilterMethod,
        bounds: Rectangle,
    );

    fn measure_svg(&self, handle: &svg::Handle) -> Size<u32>;

    fn draw_svg(
        &mut self,
        handle: crate::core::svg::Handle,
        color: Option<crate::core::Color>,
        bounds: Rectangle,
    );

    #[cfg(feature = "geometry")]
    fn new_frame(&self, size: Size) -> Box<dyn Frame>;

    #[cfg(feature = "geometry")]
    fn draw_geometry(&mut self, geometry: Box<dyn Geometry>);

    fn present(
        &mut self,
        surface: &mut dyn Surface,
        viewport: &Viewport,
        background_color: Color,
        compositor: &mut dyn Compositor,
    ) -> Result<(), compositor::SurfaceError>;
}

#[cfg(feature = "geometry")]
pub trait Frame: std::any::Any {
    fn new(&self, size: Size) -> Box<dyn Frame>;

    fn width(&self) -> f32;

    fn height(&self) -> f32;

    fn size(&self) -> Size;

    fn center(&self) -> Point;

    fn fill(&mut self, path: &Path, fill: Fill);

    fn fill_rectangle(&mut self, top_left: Point, size: Size, fill: Fill);

    fn stroke<'a>(&mut self, path: &Path, stroke: Stroke<'a>);

    fn fill_text(&mut self, text: geometry::Text);

    fn translate(&mut self, translation: crate::core::Vector);

    fn rotate(&mut self, angle: crate::core::Radians);

    fn scale(&mut self, scale: f32);

    fn scale_nonuniform(&mut self, scale: crate::core::Vector);

    fn push_transform(&mut self);

    fn pop_transform(&mut self);

    fn clip(&mut self, frame: Box<dyn Frame>, origin: Point);

    fn into_geometry(self: Box<Self>) -> Box<dyn Geometry>;
}

#[cfg(feature = "geometry")]
pub trait Geometry: std::any::Any + std::fmt::Debug {
    fn transform(
        self: Box<Self>,
        transformation: Transformation,
    ) -> Box<dyn Geometry>;

    fn cache(self: Box<Self>) -> std::sync::Arc<dyn Geometry>;

    fn load(self: std::sync::Arc<Self>) -> Box<dyn Geometry>;
}

pub trait Compositor: std::any::Any {
    fn create_renderer(&self) -> Box<dyn Renderer>;

    fn create_surface(
        &mut self,
        window: Box<dyn compositor::Window>,
        width: u32,
        height: u32,
    ) -> Box<dyn Surface>;

    fn configure_surface(
        &mut self,
        surface: &mut Box<dyn Surface>,
        width: u32,
        height: u32,
    );

    fn fetch_information(&self) -> compositor::Information;
}

pub trait Surface: std::any::Any {}