summaryrefslogtreecommitdiffstats
path: root/wgpu/src/widget/canvas/path.rs
blob: 2732b1bd013b317c92eefe8454b8d2948d1c8ac1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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,
        }
    }
}