drawing_stuff/
drawables.rs

1use crate::canvas::{Canvas, Draw};
2use crate::color::RGBA;
3
4#[derive(Debug)]
5pub enum AnkerType {
6    CENTER,
7    CORNER, // top-left
8}
9
10#[derive(Debug)]
11pub struct Line {
12    pub end1: (isize, isize),
13    pub end2: (isize, isize),
14
15    pub width: u32,
16
17    pub color: RGBA,
18}
19
20impl Draw for Line {
21    fn draw(&self, canvas: &mut Canvas) {
22        if self.width == 0 {
23            return;
24        };
25
26        if self.width == 1 {
27            canvas.draw_line(
28                self.end1.0,
29                self.end1.1,
30                self.end2.0,
31                self.end2.1,
32                self.color,
33            );
34            return;
35        }
36
37        canvas.draw_polyline(
38            self.end1.0,
39            self.end1.1,
40            self.end2.0,
41            self.end2.1,
42            self.width,
43            self.color,
44        );
45    }
46}
47
48#[derive(Debug)]
49pub struct Circle {
50    pub center: (isize, isize),
51    pub radius: u32,
52
53    pub solid: bool,
54
55    pub color: RGBA,
56}
57
58impl Draw for Circle {
59    fn draw(&self, canvas: &mut Canvas) {
60        match self.solid {
61            true => canvas.draw_circle_solid(self.center.0, self.center.1, self.radius, self.color),
62            false => canvas.draw_circle(self.center.0, self.center.1, self.radius, self.color),
63        }
64    }
65}
66
67#[derive(Debug)]
68pub struct Square {
69    pub anker: (isize, isize),
70    pub length: u32,
71
72    pub anker_type: AnkerType,
73    pub solid: bool,
74
75    pub color: RGBA,
76}
77
78impl Draw for Square {
79    fn draw(&self, canvas: &mut Canvas) {
80        let vertices = match self.anker_type {
81            AnkerType::CENTER => vec![
82                (
83                    self.anker.0 - self.length as isize / 2,
84                    self.anker.1 - self.length as isize / 2,
85                ),
86                (
87                    self.anker.0 + self.length as isize / 2,
88                    self.anker.1 - self.length as isize / 2,
89                ),
90                (
91                    self.anker.0 + self.length as isize / 2,
92                    self.anker.1 + self.length as isize / 2,
93                ),
94                (
95                    self.anker.0 - self.length as isize / 2,
96                    self.anker.1 + self.length as isize / 2,
97                ),
98            ],
99            AnkerType::CORNER => vec![
100                self.anker,
101                (self.anker.0 + self.length as isize, self.anker.1),
102                (
103                    self.anker.0 + self.length as isize,
104                    self.anker.1 + self.length as isize,
105                ),
106                (self.anker.0, self.anker.1 + self.length as isize),
107            ],
108        };
109
110        match self.solid {
111            true => canvas.draw_polygon_solid(&vertices, true, self.color),
112            false => canvas.draw_polygon(&vertices, self.color),
113        }
114    }
115}
116
117#[derive(Debug)]
118pub struct Rectangle {
119    pub anker: (isize, isize),
120    pub width: u32,
121    pub height: u32,
122
123    pub anker_type: AnkerType,
124    pub solid: bool,
125
126    pub color: RGBA,
127}
128
129impl Draw for Rectangle {
130    fn draw(&self, canvas: &mut Canvas) {
131        let vertices = match self.anker_type {
132            AnkerType::CENTER => vec![
133                (
134                    self.anker.0 - self.width as isize / 2,
135                    self.anker.1 - self.height as isize / 2,
136                ),
137                (
138                    self.anker.0 + self.width as isize / 2,
139                    self.anker.1 - self.height as isize / 2,
140                ),
141                (
142                    self.anker.0 + self.width as isize / 2,
143                    self.anker.1 + self.height as isize / 2,
144                ),
145                (
146                    self.anker.0 - self.width as isize / 2,
147                    self.anker.1 + self.height as isize / 2,
148                ),
149            ],
150            AnkerType::CORNER => vec![
151                self.anker,
152                (self.anker.0 + self.width as isize, self.anker.1),
153                (
154                    self.anker.0 + self.width as isize,
155                    self.anker.1 + self.height as isize,
156                ),
157                (self.anker.0, self.anker.1 + self.height as isize),
158            ],
159        };
160
161        match self.solid {
162            true => canvas.draw_polygon_solid(&vertices, true, self.color),
163            false => canvas.draw_polygon(&vertices, self.color),
164        }
165    }
166}
167
168#[derive(Debug)]
169pub struct Polygon {
170    pub vertices: Vec<(isize, isize)>,
171
172    pub clockwise: bool,
173    pub solid: bool,
174
175    pub color: RGBA,
176}
177
178impl Draw for Polygon {
179    fn draw(&self, canvas: &mut Canvas) {
180        match self.solid {
181            true => canvas.draw_polygon_solid(&self.vertices, self.clockwise, self.color),
182            false => canvas.draw_polygon(&self.vertices, self.color),
183        }
184    }
185}