1use crate::render::style::ColorPro;
7#[cfg(not(any(graphics_backend, mobile, wasm)))]
8use crossterm::style::Color as CColor;
9use serde::{Deserialize, Serialize};
10
11#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
12pub enum Color {
13 Reset,
14 Black,
15 Red,
16 Green,
17 Yellow,
18 Blue,
19 Magenta,
20 Cyan,
21 Gray,
22 DarkGray,
23 LightRed,
24 LightGreen,
25 LightYellow,
26 LightBlue,
27 LightMagenta,
28 LightCyan,
29 White,
30 Rgba(u8, u8, u8, u8),
31 Indexed(u8),
32}
33
34impl Color {
35 pub fn get_rgba(self) -> (u8, u8, u8, u8) {
36 let cidx: usize = match self {
37 Color::Reset => 8,
38 Color::Black => 0,
39 Color::Red => 1,
40 Color::Green => 2,
41 Color::Yellow => 3,
42 Color::Blue => 4,
43 Color::Magenta => 5,
44 Color::Cyan => 6,
45 Color::Gray => 7,
46 Color::DarkGray => 8,
47 Color::LightRed => 9,
48 Color::LightGreen => 10,
49 Color::LightYellow => 11,
50 Color::LightBlue => 12,
51 Color::LightMagenta => 13,
52 Color::LightCyan => 14,
53 Color::White => 15,
54 Color::Indexed(i) => i as usize,
55 Color::Rgba(r, g, b, a) => return (r, g, b, a),
56 };
57 (
58 ANSI_COLOR_RGB[cidx][0],
59 ANSI_COLOR_RGB[cidx][1],
60 ANSI_COLOR_RGB[cidx][2],
61 255,
62 )
63 }
64}
65
66#[cfg(not(any(graphics_backend, mobile, wasm)))]
67impl From<Color> for CColor {
68 fn from(color: Color) -> Self {
69 match color {
70 Color::Reset => CColor::Reset,
71 Color::Black => CColor::Black,
72 Color::Red => CColor::DarkRed,
73 Color::Green => CColor::DarkGreen,
74 Color::Yellow => CColor::DarkYellow,
75 Color::Blue => CColor::DarkBlue,
76 Color::Magenta => CColor::DarkMagenta,
77 Color::Cyan => CColor::DarkCyan,
78 Color::Gray => CColor::Grey,
79 Color::DarkGray => CColor::DarkGrey,
80 Color::LightRed => CColor::Red,
81 Color::LightGreen => CColor::Green,
82 Color::LightBlue => CColor::Blue,
83 Color::LightYellow => CColor::Yellow,
84 Color::LightMagenta => CColor::Magenta,
85 Color::LightCyan => CColor::Cyan,
86 Color::White => CColor::White,
87 Color::Indexed(i) => CColor::AnsiValue(i),
88 Color::Rgba(r, g, b, _a) => CColor::Rgb { r, g, b },
89 }
90 }
91}
92
93impl From<Color> for u8 {
94 fn from(color: Color) -> Self {
95 match color {
96 Color::Reset => 0,
97 Color::Black => 0,
98 Color::Red => 1,
99 Color::Green => 2,
100 Color::Yellow => 3,
101 Color::Blue => 4,
102 Color::Magenta => 5,
103 Color::Cyan => 6,
104 Color::Gray => 7,
105 Color::DarkGray => 8,
106 Color::LightRed => 9,
107 Color::LightGreen => 10,
108 Color::LightBlue => 11,
109 Color::LightYellow => 12,
110 Color::LightMagenta => 13,
111 Color::LightCyan => 14,
112 Color::White => 15,
113 Color::Indexed(i) => i,
114 Color::Rgba(r, g, b, _a) => get_u8_rgb(r, g, b),
115 }
116 }
117}
118
119impl From<ColorPro> for Color {
120 fn from(cpro: ColorPro) -> Self {
121 let (r, g, b, _a) = cpro.get_srgba_u8();
122 Color::Rgba(r, g, b, 255)
123 }
124}
125
126fn get_u8_rgb(r: u8, g: u8, b: u8) -> u8 {
127 let ret = 0;
128 for (i, item) in ANSI_COLOR_RGB.iter().enumerate() {
129 if item[0] == r && item[1] == g && item[2] == b {
130 return i as u8;
131 }
132 }
133 ret
134}
135
136pub const ANSI_COLOR_RGB: [[u8; 3]; 256] = [
137 [0, 0, 0],
138 [128, 0, 0],
139 [0, 128, 0],
140 [128, 128, 0],
141 [0, 0, 128],
142 [128, 0, 128],
143 [0, 128, 128],
144 [192, 192, 192],
145 [128, 128, 128],
146 [255, 0, 0],
147 [0, 255, 0],
148 [255, 255, 0],
149 [0, 0, 255],
150 [255, 0, 255],
151 [0, 255, 255],
152 [255, 255, 255],
153 [0, 0, 0],
154 [0, 0, 95],
155 [0, 0, 135],
156 [0, 0, 175],
157 [0, 0, 215],
158 [0, 0, 255],
159 [0, 95, 0],
160 [0, 95, 95],
161 [0, 95, 135],
162 [0, 95, 175],
163 [0, 95, 215],
164 [0, 95, 255],
165 [0, 135, 0],
166 [0, 135, 95],
167 [0, 135, 135],
168 [0, 135, 175],
169 [0, 135, 215],
170 [0, 135, 255],
171 [0, 175, 0],
172 [0, 175, 95],
173 [0, 175, 135],
174 [0, 175, 175],
175 [0, 175, 215],
176 [0, 175, 255],
177 [0, 215, 0],
178 [0, 215, 95],
179 [0, 215, 135],
180 [0, 215, 175],
181 [0, 215, 215],
182 [0, 215, 255],
183 [0, 255, 0],
184 [0, 255, 95],
185 [0, 255, 135],
186 [0, 255, 175],
187 [0, 255, 215],
188 [0, 255, 255],
189 [95, 0, 0],
190 [95, 0, 95],
191 [95, 0, 135],
192 [95, 0, 175],
193 [95, 0, 215],
194 [95, 0, 255],
195 [95, 95, 0],
196 [95, 95, 95],
197 [95, 95, 135],
198 [95, 95, 175],
199 [95, 95, 215],
200 [95, 95, 255],
201 [95, 135, 0],
202 [95, 135, 95],
203 [95, 135, 135],
204 [95, 135, 175],
205 [95, 135, 215],
206 [95, 135, 255],
207 [95, 175, 0],
208 [95, 175, 95],
209 [95, 175, 135],
210 [95, 175, 175],
211 [95, 175, 215],
212 [95, 175, 255],
213 [95, 215, 0],
214 [95, 215, 95],
215 [95, 215, 135],
216 [95, 215, 175],
217 [95, 215, 215],
218 [95, 215, 255],
219 [95, 255, 0],
220 [95, 255, 95],
221 [95, 255, 135],
222 [95, 255, 175],
223 [95, 255, 215],
224 [95, 255, 255],
225 [135, 0, 0],
226 [135, 0, 95],
227 [135, 0, 135],
228 [135, 0, 175],
229 [135, 0, 215],
230 [135, 0, 255],
231 [135, 95, 0],
232 [135, 95, 95],
233 [135, 95, 135],
234 [135, 95, 175],
235 [135, 95, 215],
236 [135, 95, 255],
237 [135, 135, 0],
238 [135, 135, 95],
239 [135, 135, 135],
240 [135, 135, 175],
241 [135, 135, 215],
242 [135, 135, 255],
243 [135, 175, 0],
244 [135, 175, 95],
245 [135, 175, 135],
246 [135, 175, 175],
247 [135, 175, 215],
248 [135, 175, 255],
249 [135, 215, 0],
250 [135, 215, 95],
251 [135, 215, 135],
252 [135, 215, 175],
253 [135, 215, 215],
254 [135, 215, 255],
255 [135, 255, 0],
256 [135, 255, 95],
257 [135, 255, 135],
258 [135, 255, 175],
259 [135, 255, 215],
260 [135, 255, 255],
261 [175, 0, 0],
262 [175, 0, 95],
263 [175, 0, 135],
264 [175, 0, 175],
265 [175, 0, 215],
266 [175, 0, 255],
267 [175, 95, 0],
268 [175, 95, 95],
269 [175, 95, 135],
270 [175, 95, 175],
271 [175, 95, 215],
272 [175, 95, 255],
273 [175, 135, 0],
274 [175, 135, 95],
275 [175, 135, 135],
276 [175, 135, 175],
277 [175, 135, 215],
278 [175, 135, 255],
279 [175, 175, 0],
280 [175, 175, 95],
281 [175, 175, 135],
282 [175, 175, 175],
283 [175, 175, 215],
284 [175, 175, 255],
285 [175, 215, 0],
286 [175, 215, 95],
287 [175, 215, 135],
288 [175, 215, 175],
289 [175, 215, 215],
290 [175, 215, 255],
291 [175, 255, 0],
292 [175, 255, 95],
293 [175, 255, 135],
294 [175, 255, 175],
295 [175, 255, 215],
296 [175, 255, 255],
297 [215, 0, 0],
298 [215, 0, 95],
299 [215, 0, 135],
300 [215, 0, 175],
301 [215, 0, 215],
302 [215, 0, 255],
303 [215, 95, 0],
304 [215, 95, 95],
305 [215, 95, 135],
306 [215, 95, 175],
307 [215, 95, 215],
308 [215, 95, 255],
309 [215, 135, 0],
310 [215, 135, 95],
311 [215, 135, 135],
312 [215, 135, 175],
313 [215, 135, 215],
314 [215, 135, 255],
315 [215, 175, 0],
316 [215, 175, 95],
317 [215, 175, 135],
318 [215, 175, 175],
319 [215, 175, 215],
320 [215, 175, 255],
321 [215, 215, 0],
322 [215, 215, 95],
323 [215, 215, 135],
324 [215, 215, 175],
325 [215, 215, 215],
326 [215, 215, 255],
327 [215, 255, 0],
328 [215, 255, 95],
329 [215, 255, 135],
330 [215, 255, 175],
331 [215, 255, 215],
332 [215, 255, 255],
333 [255, 0, 0],
334 [255, 0, 95],
335 [255, 0, 135],
336 [255, 0, 175],
337 [255, 0, 215],
338 [255, 0, 255],
339 [255, 95, 0],
340 [255, 95, 95],
341 [255, 95, 135],
342 [255, 95, 175],
343 [255, 95, 215],
344 [255, 95, 255],
345 [255, 135, 0],
346 [255, 135, 95],
347 [255, 135, 135],
348 [255, 135, 175],
349 [255, 135, 215],
350 [255, 135, 255],
351 [255, 175, 0],
352 [255, 175, 95],
353 [255, 175, 135],
354 [255, 175, 175],
355 [255, 175, 215],
356 [255, 175, 255],
357 [255, 215, 0],
358 [255, 215, 95],
359 [255, 215, 135],
360 [255, 215, 175],
361 [255, 215, 215],
362 [255, 215, 255],
363 [255, 255, 0],
364 [255, 255, 95],
365 [255, 255, 135],
366 [255, 255, 175],
367 [255, 255, 215],
368 [255, 255, 255],
369 [8, 8, 8],
370 [18, 18, 18],
371 [28, 28, 28],
372 [38, 38, 38],
373 [48, 48, 48],
374 [58, 58, 58],
375 [68, 68, 68],
376 [78, 78, 78],
377 [88, 88, 88],
378 [98, 98, 98],
379 [108, 108, 108],
380 [118, 118, 118],
381 [128, 128, 128],
382 [138, 138, 138],
383 [148, 148, 148],
384 [158, 158, 158],
385 [168, 168, 168],
386 [178, 178, 178],
387 [188, 188, 188],
388 [198, 198, 198],
389 [208, 208, 208],
390 [218, 218, 218],
391 [228, 228, 228],
392 [238, 238, 238],
393];