rust_pixel/render/style/
color.rs

1// RustPixel
2// copyright zipxing@hotmail.com 2022~2025
3
4//! Defines styles color
5
6use 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];