diff options
| author | 2020-02-12 03:47:36 +0100 | |
|---|---|---|
| committer | 2020-02-12 03:47:36 +0100 | |
| commit | f436f20eb86b2324126a54d4164b4cedf2134a45 (patch) | |
| tree | a19be4a267640d459ae4cbd6b5a26e3c69120189 /wgpu/src/widget/canvas | |
| parent | 8daf798e5760a0d35d5491027d51a5dd96898b0d (diff) | |
| download | iced-f436f20eb86b2324126a54d4164b4cedf2134a45.tar.gz iced-f436f20eb86b2324126a54d4164b4cedf2134a45.tar.bz2 iced-f436f20eb86b2324126a54d4164b4cedf2134a45.zip  | |
Draft `Canvas` types and `clock` example
Diffstat (limited to 'wgpu/src/widget/canvas')
| -rw-r--r-- | wgpu/src/widget/canvas/data.rs | 20 | ||||
| -rw-r--r-- | wgpu/src/widget/canvas/frame.rs | 39 | ||||
| -rw-r--r-- | wgpu/src/widget/canvas/layer.rs | 41 | ||||
| -rw-r--r-- | wgpu/src/widget/canvas/path.rs | 78 | 
4 files changed, 178 insertions, 0 deletions
diff --git a/wgpu/src/widget/canvas/data.rs b/wgpu/src/widget/canvas/data.rs new file mode 100644 index 00000000..25d94f4c --- /dev/null +++ b/wgpu/src/widget/canvas/data.rs @@ -0,0 +1,20 @@ +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)] +pub struct Data<T> { +    raw: T, +    version: usize, +} + +impl<T> Data<T> { +    pub fn new(data: T) -> Self { +        Data { +            raw: data, +            version: 0, +        } +    } + +    pub fn update(&mut self, f: impl FnOnce(&mut T)) { +        f(&mut self.raw); + +        self.version += 1; +    } +} diff --git a/wgpu/src/widget/canvas/frame.rs b/wgpu/src/widget/canvas/frame.rs new file mode 100644 index 00000000..65c22c0c --- /dev/null +++ b/wgpu/src/widget/canvas/frame.rs @@ -0,0 +1,39 @@ +use iced_native::Point; + +use crate::{ +    canvas::{Fill, Path, Stroke}, +    triangle, +}; + +#[derive(Debug)] +pub struct Frame { +    width: u32, +    height: u32, +    buffers: lyon::tessellation::VertexBuffers<triangle::Vertex2D, u16>, +} + +impl Frame { +    pub(crate) fn new(width: u32, height: u32) -> Frame { +        Frame { +            width, +            height, +            buffers: lyon::tessellation::VertexBuffers::new(), +        } +    } + +    pub fn width(&self) -> u32 { +        self.width +    } + +    pub fn height(&self) -> u32 { +        self.height +    } + +    pub fn center(&self) -> Point { +        Point::new(self.width as f32 / 2.0, self.height as f32 / 2.0) +    } + +    pub fn fill(&mut self, path: Path, fill: Fill) {} + +    pub fn stroke(&mut self, path: Path, stroke: Stroke) {} +} diff --git a/wgpu/src/widget/canvas/layer.rs b/wgpu/src/widget/canvas/layer.rs new file mode 100644 index 00000000..f97634e4 --- /dev/null +++ b/wgpu/src/widget/canvas/layer.rs @@ -0,0 +1,41 @@ +use crate::canvas::Frame; + +pub trait Layer: std::fmt::Debug {} + +use std::marker::PhantomData; +use std::sync::{Arc, Weak}; + +#[derive(Debug)] +pub struct Cached<T: Drawable> { +    input: PhantomData<T>, +} + +impl<T> Cached<T> +where +    T: Drawable + std::fmt::Debug, +{ +    pub fn new() -> Self { +        Cached { input: PhantomData } +    } + +    pub fn clear(&mut self) {} + +    pub fn with<'a>(&'a self, input: &'a T) -> impl Layer + 'a { +        Bind { +            cache: self, +            input: input, +        } +    } +} + +#[derive(Debug)] +struct Bind<'a, T: Drawable> { +    cache: &'a Cached<T>, +    input: &'a T, +} + +impl<'a, T> Layer for Bind<'a, T> where T: Drawable + std::fmt::Debug {} + +pub trait Drawable { +    fn draw(&self, frame: &mut Frame); +} diff --git a/wgpu/src/widget/canvas/path.rs b/wgpu/src/widget/canvas/path.rs new file mode 100644 index 00000000..2732b1bd --- /dev/null +++ b/wgpu/src/widget/canvas/path.rs @@ -0,0 +1,78 @@ +use iced_native::{Point, Vector}; + +#[allow(missing_debug_implementations)] +pub struct Path { +    raw: lyon::path::Builder, +} + +impl Path { +    pub fn new() -> Path { +        Path { +            raw: lyon::path::Path::builder(), +        } +    } + +    #[inline] +    pub fn move_to(&mut self, point: Point) { +        let _ = self.raw.move_to(lyon::math::Point::new(point.x, point.y)); +    } + +    #[inline] +    pub fn line_to(&mut self, point: Point) { +        let _ = self.raw.line_to(lyon::math::Point::new(point.x, point.y)); +    } + +    #[inline] +    pub fn arc(&mut self, arc: Arc) { +        self.ellipse(arc.into()) +    } + +    #[inline] +    pub fn ellipse(&mut self, ellipse: Ellipse) { +        let arc = lyon::geom::Arc { +            center: lyon::math::Point::new(ellipse.center.x, ellipse.center.y), +            radii: lyon::math::Vector::new(ellipse.radii.x, ellipse.radii.y), +            x_rotation: lyon::math::Angle::radians(ellipse.rotation), +            start_angle: lyon::math::Angle::radians(ellipse.start_angle), +            sweep_angle: lyon::math::Angle::radians(ellipse.end_angle), +        }; + +        arc.for_each_quadratic_bezier(&mut |curve| { +            let _ = self.raw.quadratic_bezier_to(curve.ctrl, curve.to); +        }); +    } + +    #[inline] +    pub fn close(&mut self) { +        self.raw.close() +    } +} + +#[derive(Debug, Clone, Copy)] +pub struct Arc { +    pub center: Point, +    pub radius: f32, +    pub start_angle: f32, +    pub end_angle: f32, +} + +#[derive(Debug, Clone, Copy)] +pub struct Ellipse { +    pub center: Point, +    pub radii: Vector, +    pub rotation: f32, +    pub start_angle: f32, +    pub end_angle: f32, +} + +impl From<Arc> for Ellipse { +    fn from(arc: Arc) -> Ellipse { +        Ellipse { +            center: arc.center, +            radii: Vector::new(arc.radius, arc.radius), +            rotation: 0.0, +            start_angle: arc.start_angle, +            end_angle: arc.end_angle, +        } +    } +}  | 
