1 | use crate::Color; |
2 | |
3 | const U8_TO_STR: [[u8; 3]; 256] = [ |
4 | [48, 48, 48], |
5 | [48, 48, 49], |
6 | [48, 48, 50], |
7 | [48, 48, 51], |
8 | [48, 48, 52], |
9 | [48, 48, 53], |
10 | [48, 48, 54], |
11 | [48, 48, 55], |
12 | [48, 48, 56], |
13 | [48, 48, 57], |
14 | [48, 49, 48], |
15 | [48, 49, 49], |
16 | [48, 49, 50], |
17 | [48, 49, 51], |
18 | [48, 49, 52], |
19 | [48, 49, 53], |
20 | [48, 49, 54], |
21 | [48, 49, 55], |
22 | [48, 49, 56], |
23 | [48, 49, 57], |
24 | [48, 50, 48], |
25 | [48, 50, 49], |
26 | [48, 50, 50], |
27 | [48, 50, 51], |
28 | [48, 50, 52], |
29 | [48, 50, 53], |
30 | [48, 50, 54], |
31 | [48, 50, 55], |
32 | [48, 50, 56], |
33 | [48, 50, 57], |
34 | [48, 51, 48], |
35 | [48, 51, 49], |
36 | [48, 51, 50], |
37 | [48, 51, 51], |
38 | [48, 51, 52], |
39 | [48, 51, 53], |
40 | [48, 51, 54], |
41 | [48, 51, 55], |
42 | [48, 51, 56], |
43 | [48, 51, 57], |
44 | [48, 52, 48], |
45 | [48, 52, 49], |
46 | [48, 52, 50], |
47 | [48, 52, 51], |
48 | [48, 52, 52], |
49 | [48, 52, 53], |
50 | [48, 52, 54], |
51 | [48, 52, 55], |
52 | [48, 52, 56], |
53 | [48, 52, 57], |
54 | [48, 53, 48], |
55 | [48, 53, 49], |
56 | [48, 53, 50], |
57 | [48, 53, 51], |
58 | [48, 53, 52], |
59 | [48, 53, 53], |
60 | [48, 53, 54], |
61 | [48, 53, 55], |
62 | [48, 53, 56], |
63 | [48, 53, 57], |
64 | [48, 54, 48], |
65 | [48, 54, 49], |
66 | [48, 54, 50], |
67 | [48, 54, 51], |
68 | [48, 54, 52], |
69 | [48, 54, 53], |
70 | [48, 54, 54], |
71 | [48, 54, 55], |
72 | [48, 54, 56], |
73 | [48, 54, 57], |
74 | [48, 55, 48], |
75 | [48, 55, 49], |
76 | [48, 55, 50], |
77 | [48, 55, 51], |
78 | [48, 55, 52], |
79 | [48, 55, 53], |
80 | [48, 55, 54], |
81 | [48, 55, 55], |
82 | [48, 55, 56], |
83 | [48, 55, 57], |
84 | [48, 56, 48], |
85 | [48, 56, 49], |
86 | [48, 56, 50], |
87 | [48, 56, 51], |
88 | [48, 56, 52], |
89 | [48, 56, 53], |
90 | [48, 56, 54], |
91 | [48, 56, 55], |
92 | [48, 56, 56], |
93 | [48, 56, 57], |
94 | [48, 57, 48], |
95 | [48, 57, 49], |
96 | [48, 57, 50], |
97 | [48, 57, 51], |
98 | [48, 57, 52], |
99 | [48, 57, 53], |
100 | [48, 57, 54], |
101 | [48, 57, 55], |
102 | [48, 57, 56], |
103 | [48, 57, 57], |
104 | [49, 48, 48], |
105 | [49, 48, 49], |
106 | [49, 48, 50], |
107 | [49, 48, 51], |
108 | [49, 48, 52], |
109 | [49, 48, 53], |
110 | [49, 48, 54], |
111 | [49, 48, 55], |
112 | [49, 48, 56], |
113 | [49, 48, 57], |
114 | [49, 49, 48], |
115 | [49, 49, 49], |
116 | [49, 49, 50], |
117 | [49, 49, 51], |
118 | [49, 49, 52], |
119 | [49, 49, 53], |
120 | [49, 49, 54], |
121 | [49, 49, 55], |
122 | [49, 49, 56], |
123 | [49, 49, 57], |
124 | [49, 50, 48], |
125 | [49, 50, 49], |
126 | [49, 50, 50], |
127 | [49, 50, 51], |
128 | [49, 50, 52], |
129 | [49, 50, 53], |
130 | [49, 50, 54], |
131 | [49, 50, 55], |
132 | [49, 50, 56], |
133 | [49, 50, 57], |
134 | [49, 51, 48], |
135 | [49, 51, 49], |
136 | [49, 51, 50], |
137 | [49, 51, 51], |
138 | [49, 51, 52], |
139 | [49, 51, 53], |
140 | [49, 51, 54], |
141 | [49, 51, 55], |
142 | [49, 51, 56], |
143 | [49, 51, 57], |
144 | [49, 52, 48], |
145 | [49, 52, 49], |
146 | [49, 52, 50], |
147 | [49, 52, 51], |
148 | [49, 52, 52], |
149 | [49, 52, 53], |
150 | [49, 52, 54], |
151 | [49, 52, 55], |
152 | [49, 52, 56], |
153 | [49, 52, 57], |
154 | [49, 53, 48], |
155 | [49, 53, 49], |
156 | [49, 53, 50], |
157 | [49, 53, 51], |
158 | [49, 53, 52], |
159 | [49, 53, 53], |
160 | [49, 53, 54], |
161 | [49, 53, 55], |
162 | [49, 53, 56], |
163 | [49, 53, 57], |
164 | [49, 54, 48], |
165 | [49, 54, 49], |
166 | [49, 54, 50], |
167 | [49, 54, 51], |
168 | [49, 54, 52], |
169 | [49, 54, 53], |
170 | [49, 54, 54], |
171 | [49, 54, 55], |
172 | [49, 54, 56], |
173 | [49, 54, 57], |
174 | [49, 55, 48], |
175 | [49, 55, 49], |
176 | [49, 55, 50], |
177 | [49, 55, 51], |
178 | [49, 55, 52], |
179 | [49, 55, 53], |
180 | [49, 55, 54], |
181 | [49, 55, 55], |
182 | [49, 55, 56], |
183 | [49, 55, 57], |
184 | [49, 56, 48], |
185 | [49, 56, 49], |
186 | [49, 56, 50], |
187 | [49, 56, 51], |
188 | [49, 56, 52], |
189 | [49, 56, 53], |
190 | [49, 56, 54], |
191 | [49, 56, 55], |
192 | [49, 56, 56], |
193 | [49, 56, 57], |
194 | [49, 57, 48], |
195 | [49, 57, 49], |
196 | [49, 57, 50], |
197 | [49, 57, 51], |
198 | [49, 57, 52], |
199 | [49, 57, 53], |
200 | [49, 57, 54], |
201 | [49, 57, 55], |
202 | [49, 57, 56], |
203 | [49, 57, 57], |
204 | [50, 48, 48], |
205 | [50, 48, 49], |
206 | [50, 48, 50], |
207 | [50, 48, 51], |
208 | [50, 48, 52], |
209 | [50, 48, 53], |
210 | [50, 48, 54], |
211 | [50, 48, 55], |
212 | [50, 48, 56], |
213 | [50, 48, 57], |
214 | [50, 49, 48], |
215 | [50, 49, 49], |
216 | [50, 49, 50], |
217 | [50, 49, 51], |
218 | [50, 49, 52], |
219 | [50, 49, 53], |
220 | [50, 49, 54], |
221 | [50, 49, 55], |
222 | [50, 49, 56], |
223 | [50, 49, 57], |
224 | [50, 50, 48], |
225 | [50, 50, 49], |
226 | [50, 50, 50], |
227 | [50, 50, 51], |
228 | [50, 50, 52], |
229 | [50, 50, 53], |
230 | [50, 50, 54], |
231 | [50, 50, 55], |
232 | [50, 50, 56], |
233 | [50, 50, 57], |
234 | [50, 51, 48], |
235 | [50, 51, 49], |
236 | [50, 51, 50], |
237 | [50, 51, 51], |
238 | [50, 51, 52], |
239 | [50, 51, 53], |
240 | [50, 51, 54], |
241 | [50, 51, 55], |
242 | [50, 51, 56], |
243 | [50, 51, 57], |
244 | [50, 52, 48], |
245 | [50, 52, 49], |
246 | [50, 52, 50], |
247 | [50, 52, 51], |
248 | [50, 52, 52], |
249 | [50, 52, 53], |
250 | [50, 52, 54], |
251 | [50, 52, 55], |
252 | [50, 52, 56], |
253 | [50, 52, 57], |
254 | [50, 53, 48], |
255 | [50, 53, 49], |
256 | [50, 53, 50], |
257 | [50, 53, 51], |
258 | [50, 53, 52], |
259 | [50, 53, 53], |
260 | ]; |
261 | |
262 | const fn rgb_to_ansi(r: u8, g: u8, b: u8, is_fg: bool) -> [u8; 19] { |
263 | let mut buf = if is_fg { |
264 | *b" \x1b[38;2;rrr;ggg;bbbm" |
265 | } else { |
266 | *b" \x1b[48;2;rrr;ggg;bbbm" |
267 | }; |
268 | |
269 | let r = U8_TO_STR[r as usize]; |
270 | let g = U8_TO_STR[g as usize]; |
271 | let b = U8_TO_STR[b as usize]; |
272 | |
273 | // r 7 |
274 | buf[7] = r[0]; |
275 | buf[8] = r[1]; |
276 | buf[9] = r[2]; |
277 | |
278 | // g 11 |
279 | buf[11] = g[0]; |
280 | buf[12] = g[1]; |
281 | buf[13] = g[2]; |
282 | |
283 | // b 15 |
284 | buf[15] = b[0]; |
285 | buf[16] = b[1]; |
286 | buf[17] = b[2]; |
287 | |
288 | buf |
289 | } |
290 | |
291 | const fn rgb_to_ansi_color(r: u8, g: u8, b: u8, is_fg: bool) -> [u8; 16] { |
292 | let mut buf = if is_fg { |
293 | *b"38;2;rrr;ggg;bbb" |
294 | } else { |
295 | *b"48;2;rrr;ggg;bbb" |
296 | }; |
297 | |
298 | let r = U8_TO_STR[r as usize]; |
299 | let g = U8_TO_STR[g as usize]; |
300 | let b = U8_TO_STR[b as usize]; |
301 | |
302 | // r 5 |
303 | buf[5] = r[0]; |
304 | buf[6] = r[1]; |
305 | buf[7] = r[2]; |
306 | |
307 | // g 9 |
308 | buf[9] = g[0]; |
309 | buf[10] = g[1]; |
310 | buf[11] = g[2]; |
311 | |
312 | // b 13 |
313 | buf[13] = b[0]; |
314 | buf[14] = b[1]; |
315 | buf[15] = b[2]; |
316 | |
317 | buf |
318 | } |
319 | |
320 | /// A custom RGB color, determined at compile time |
321 | pub struct CustomColor<const R: u8, const G: u8, const B: u8>; |
322 | |
323 | #[allow (clippy::transmute_bytes_to_str)] |
324 | impl<const R: u8, const G: u8, const B: u8> Color for CustomColor<R, G, B> { |
325 | const ANSI_FG: &'static str = |
326 | unsafe { core::mem::transmute(&rgb_to_ansi(R, G, B, is_fg:true) as &[u8]) }; |
327 | const ANSI_BG: &'static str = |
328 | unsafe { core::mem::transmute(&rgb_to_ansi(R, G, B, is_fg:false) as &[u8]) }; |
329 | |
330 | const RAW_ANSI_FG: &'static str = |
331 | unsafe { core::mem::transmute(&rgb_to_ansi_color(R, G, B, is_fg:true) as &[u8]) }; |
332 | const RAW_ANSI_BG: &'static str = |
333 | unsafe { core::mem::transmute(&rgb_to_ansi_color(R, G, B, is_fg:false) as &[u8]) }; |
334 | |
335 | #[doc (hidden)] |
336 | type DynEquivelant = crate::Rgb; |
337 | |
338 | #[doc (hidden)] |
339 | const DYN_EQUIVELANT: Self::DynEquivelant = crate::Rgb(R, G, B); |
340 | |
341 | #[doc (hidden)] |
342 | fn into_dyncolors() -> crate::DynColors { |
343 | crate::DynColors::Rgb(R, G, B) |
344 | } |
345 | } |
346 | |