Skip to main content

color_utils/
traits.rs

1use crate::*;
2
3pub trait Glsl {
4  fn glsl_rgb  (self) -> [f32; 3];
5  fn glsl_rgba (self) -> [f32; 4];
6}
7
8pub trait IntoArray <T, const N : usize> {
9  fn into_array (self) -> [T; N];
10}
11
12pub trait Normalize {
13  type Target;
14  fn normalize (self) -> Self::Target;
15}
16
17pub trait Quantize {
18  type Target;
19  fn quantize (self) -> Self::Target;
20}
21
22pub trait WithAlphaOpaque {
23  type Target;
24  /// Add an opaque alpha component
25  fn rgba (self) -> Self::Target;
26}
27
28impl Glsl for Rgb <u8> {
29  fn glsl_rgb (self) -> [f32; 3] {
30    self.normalize().into()
31  }
32  fn glsl_rgba (self) -> [f32; 4] {
33    self.normalize().rgba().into()
34  }
35}
36impl Glsl for Rgba <u8> {
37  fn glsl_rgb (self) -> [f32; 3] {
38    self.rgb().normalize().into()
39  }
40  fn glsl_rgba (self) -> [f32; 4] {
41    self.normalize().into()
42  }
43}
44
45impl IntoArray <u8, 3> for Rgb <u8> {
46  fn into_array (self) -> [u8; 3] {
47    self.into()
48  }
49}
50impl IntoArray <u8, 4> for Rgba <u8> {
51  fn into_array (self) -> [u8; 4] {
52    self.into()
53  }
54}
55impl IntoArray <f32, 3> for Rgb <f32> {
56  fn into_array (self) -> [f32; 3] {
57    self.into()
58  }
59}
60impl IntoArray <f32, 4> for Rgba <f32> {
61  fn into_array (self) -> [f32; 4] {
62    self.into()
63  }
64}
65
66impl Normalize for Rgb <u8> {
67  type Target = Rgb <f32>;
68  fn normalize (self) -> Self::Target {
69    normalize_rgb (self)
70  }
71}
72impl Normalize for Rgba <u8> {
73  type Target = Rgba <f32>;
74  fn normalize (self) -> Self::Target {
75    normalize_rgba (self)
76  }
77}
78
79impl Quantize for Rgb <f32> {
80  type Target = Rgb <u8>;
81  fn quantize (self) -> Self::Target {
82    quantize_rgb (self)
83  }
84}
85impl Quantize for Rgba <f32> {
86  type Target = Rgba <u8>;
87  fn quantize (self) -> Self::Target {
88    quantize_rgba (self)
89  }
90}
91
92impl WithAlphaOpaque for Rgb <u8> {
93  type Target = Rgba <u8>;
94  fn rgba (self) -> Self::Target {
95    self.with_alpha (255)
96  }
97}
98impl WithAlphaOpaque for Rgb <f32> {
99  type Target = Rgba <f32>;
100  fn rgba (self) -> Self::Target {
101    self.with_alpha (1.0)
102  }
103}