1use crate::canvas::{Canvas, Draw};
2use crate::color::RGBA;
3
4#[derive(Debug)]
5pub enum AnkerType {
6 CENTER,
7 CORNER, }
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}