node_engine/
color.rs

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}