1pub fn decode_color(color: Option<&str>) -> Option<ecolor::Color32> {
2 use ecolor::Color32;
3 match color {
4 None => None,
5 Some("RED") => Some(Color32::RED),
6 Some("GREEN") => Some(Color32::GREEN),
7 Some("BLUE") => Some(Color32::BLUE),
8 Some("YELLOW") => Some(Color32::YELLOW),
9 Some("LIGHT_RED") => Some(Color32::LIGHT_RED),
10 Some("LIGHT_GREEN") => Some(Color32::LIGHT_GREEN),
11 Some("LIGHT_BLUE") => Some(Color32::LIGHT_BLUE),
12 Some("LIGHT_YELLOW") => Some(Color32::LIGHT_YELLOW),
13 Some("DARK_RED") => Some(Color32::DARK_RED),
14 Some("DARK_GREEN") => Some(Color32::DARK_GREEN),
15 Some("DARK_BLUE") => Some(Color32::DARK_BLUE),
16 Some("WHITE") => Some(Color32::WHITE),
17 Some("BLACK") => Some(Color32::BLACK),
18 Some(val) => {
19 let off = if val.starts_with("#") {
20 1
21 } else if val.starts_with("0x") {
22 2
23 } else {
24 0
25 };
26 match hex::decode(&val[off..]) {
27 Ok(val) if val.len() > 4 => {
28 log::error!("Failed to decode color, hex value too long: {val:?}");
29 None
30 }
31 Ok(val) => {
32 let r = *val.get(0).unwrap_or(&0);
33 let g = *val.get(1).unwrap_or(&0);
34 let b = *val.get(2).unwrap_or(&0);
35 if let Some(a) = val.get(3) {
36 Some(Color32::from_rgba_premultiplied(r, g, b, *a))
37 } else {
38 Some(Color32::from_rgb(r, g, b))
39 }
40 }
41 Err(err) => {
42 log::error!("Failed to decode color: {val:?}: {err:?}");
43 None
44 }
45 }
46 }
47 }
48}
49
50pub const fn u32_to_color(c: u32) -> ecolor::Color32 {
51 let a = c.to_be_bytes();
52 ecolor::Color32::from_rgb(a[0], a[1], a[2])
53}
54
55pub const fn color_rgb_to_u32(a: [u8; 3]) -> u32 {
56 u32::from_be_bytes([0, a[0], a[1], a[2]])
57}
58
59#[macro_export]
60macro_rules! const_color {
61 (RED) => {
62 0xFF0000
63 };
64 (GREEN) => {
65 0x00FF00
66 };
67 (BLUE) => {
68 0x0000FF
69 };
70 (WHITE) => {
71 0xFFFFFF
72 };
73 ($c:literal) => {
74 $c
75 };
76}