1#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default)]
3pub struct RGB {
4 pub r: u8,
6 pub g: u8,
8 pub b: u8,
10}
11
12impl RGB {
13 #[must_use]
15 pub const fn new(r: u8, g: u8, b: u8) -> Self {
16 Self { r, g, b }
17 }
18}
19
20#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
22pub struct Style {
23 pub fill_color: Color,
25
26 pub stroke_color: Color,
28
29 pub stroke_width: i32,
33}
34
35impl Default for Style {
36 fn default() -> Self {
37 Self {
38 fill_color: Color::None,
39 stroke_color: Color::None,
40 stroke_width: 1,
41 }
42 }
43}
44
45impl Style {
46 #[must_use]
48 pub const fn solid(c: Color) -> Self {
49 Self {
50 fill_color: c,
51 stroke_color: Color::None,
52 stroke_width: 0,
53 }
54 }
55
56 #[must_use]
58 pub const fn outlined(c: Color, w: i32) -> Self {
59 Self {
60 fill_color: Color::None,
61 stroke_color: c,
62 stroke_width: w,
63 }
64 }
65
66 #[must_use]
70 pub const fn as_line_style(&self) -> LineStyle {
71 LineStyle {
72 color: self.stroke_color,
73 width: self.stroke_width,
74 }
75 }
76}
77
78impl From<LineStyle> for Style {
79 fn from(value: LineStyle) -> Self {
80 Self {
81 fill_color: Color::None,
82 stroke_color: value.color,
83 stroke_width: value.width,
84 }
85 }
86}
87
88#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default)]
90pub struct LineStyle {
91 pub color: Color,
93 pub width: i32,
95}
96
97impl LineStyle {
98 #[must_use]
100 pub const fn new(c: Color, w: i32) -> Self {
101 Self { color: c, width: w }
102 }
103}
104
105impl From<Style> for LineStyle {
106 fn from(value: Style) -> Self {
107 Self {
108 color: value.stroke_color,
109 width: value.stroke_width,
110 }
111 }
112}
113
114#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default)]
116pub enum Color {
117 #[default]
119 None,
120 Black,
122 Purple,
124 Red,
126 Orange,
128 Yellow,
130 LightGreen,
132 Green,
134 DarkGreen,
136 DarkBlue,
138 Blue,
140 LightBlue,
142 Cyan,
144 White,
146 LightGray,
148 Gray,
150 DarkGray,
152}
153
154impl Color {
155 #[must_use]
159 pub const fn new(v: u8) -> Self {
160 match v {
161 1 => Color::Black,
162 2 => Color::Purple,
163 3 => Color::Red,
164 4 => Color::Orange,
165 5 => Color::Yellow,
166 6 => Color::LightGreen,
167 7 => Color::Green,
168 8 => Color::DarkGreen,
169 9 => Color::DarkBlue,
170 10 => Color::Blue,
171 11 => Color::LightBlue,
172 12 => Color::Cyan,
173 13 => Color::White,
174 14 => Color::LightGray,
175 15 => Color::Gray,
176 16 => Color::DarkGray,
177 _ => Color::None,
178 }
179 }
180}
181
182impl From<u8> for Color {
183 fn from(value: u8) -> Self {
184 Self::new(value)
185 }
186}
187
188impl From<Color> for i32 {
189 fn from(value: Color) -> Self {
190 i32::from(u8::from(value))
191 }
192}
193
194impl From<Color> for usize {
195 fn from(value: Color) -> Self {
196 usize::from(u8::from(value))
197 }
198}
199
200impl From<Color> for u8 {
201 fn from(value: Color) -> Self {
202 match value {
203 Color::None => 0,
204 Color::Black => 1,
205 Color::Purple => 2,
206 Color::Red => 3,
207 Color::Orange => 4,
208 Color::Yellow => 5,
209 Color::LightGreen => 6,
210 Color::Green => 7,
211 Color::DarkGreen => 8,
212 Color::DarkBlue => 9,
213 Color::Blue => 10,
214 Color::LightBlue => 11,
215 Color::Cyan => 12,
216 Color::White => 13,
217 Color::LightGray => 14,
218 Color::Gray => 15,
219 Color::DarkGray => 16,
220 }
221 }
222}
223
224impl From<Option<Color>> for Color {
225 fn from(value: Option<Color>) -> Self {
226 value.unwrap_or(Color::None)
227 }
228}