[go: up one dir, main page]

ecolor/
cint_impl.rs

1use super::{Color32, Hsva, HsvaGamma, Rgba, linear_f32_from_linear_u8, linear_u8_from_linear_f32};
2use cint::{Alpha, ColorInterop, EncodedSrgb, Hsv, LinearSrgb, PremultipliedAlpha};
3
4// ---- Color32 ----
5
6impl From<Alpha<EncodedSrgb<u8>>> for Color32 {
7    fn from(srgba: Alpha<EncodedSrgb<u8>>) -> Self {
8        let Alpha {
9            color: EncodedSrgb { r, g, b },
10            alpha: a,
11        } = srgba;
12
13        Self::from_rgba_unmultiplied(r, g, b, a)
14    }
15}
16
17// No From<Color32> for Alpha<_> because Color32 is premultiplied
18
19impl From<PremultipliedAlpha<EncodedSrgb<u8>>> for Color32 {
20    fn from(srgba: PremultipliedAlpha<EncodedSrgb<u8>>) -> Self {
21        let PremultipliedAlpha {
22            color: EncodedSrgb { r, g, b },
23            alpha: a,
24        } = srgba;
25
26        Self::from_rgba_premultiplied(r, g, b, a)
27    }
28}
29
30impl From<Color32> for PremultipliedAlpha<EncodedSrgb<u8>> {
31    fn from(col: Color32) -> Self {
32        let (r, g, b, a) = col.to_tuple();
33
34        Self {
35            color: EncodedSrgb { r, g, b },
36            alpha: a,
37        }
38    }
39}
40
41impl From<PremultipliedAlpha<EncodedSrgb<f32>>> for Color32 {
42    fn from(srgba: PremultipliedAlpha<EncodedSrgb<f32>>) -> Self {
43        let PremultipliedAlpha {
44            color: EncodedSrgb { r, g, b },
45            alpha: a,
46        } = srgba;
47
48        // This is a bit of an abuse of the function name but it does what we want.
49        let r = linear_u8_from_linear_f32(r);
50        let g = linear_u8_from_linear_f32(g);
51        let b = linear_u8_from_linear_f32(b);
52        let a = linear_u8_from_linear_f32(a);
53
54        Self::from_rgba_premultiplied(r, g, b, a)
55    }
56}
57
58impl From<Color32> for PremultipliedAlpha<EncodedSrgb<f32>> {
59    fn from(col: Color32) -> Self {
60        let (r, g, b, a) = col.to_tuple();
61
62        // This is a bit of an abuse of the function name but it does what we want.
63        let r = linear_f32_from_linear_u8(r);
64        let g = linear_f32_from_linear_u8(g);
65        let b = linear_f32_from_linear_u8(b);
66        let a = linear_f32_from_linear_u8(a);
67
68        Self {
69            color: EncodedSrgb { r, g, b },
70            alpha: a,
71        }
72    }
73}
74
75impl ColorInterop for Color32 {
76    type CintTy = PremultipliedAlpha<EncodedSrgb<u8>>;
77}
78
79// ---- Rgba ----
80
81impl From<PremultipliedAlpha<LinearSrgb<f32>>> for Rgba {
82    fn from(srgba: PremultipliedAlpha<LinearSrgb<f32>>) -> Self {
83        let PremultipliedAlpha {
84            color: LinearSrgb { r, g, b },
85            alpha: a,
86        } = srgba;
87
88        Self([r, g, b, a])
89    }
90}
91
92impl From<Rgba> for PremultipliedAlpha<LinearSrgb<f32>> {
93    fn from(col: Rgba) -> Self {
94        let (r, g, b, a) = col.to_tuple();
95
96        Self {
97            color: LinearSrgb { r, g, b },
98            alpha: a,
99        }
100    }
101}
102
103impl ColorInterop for Rgba {
104    type CintTy = PremultipliedAlpha<LinearSrgb<f32>>;
105}
106
107// ---- Hsva ----
108
109impl From<Alpha<Hsv<f32>>> for Hsva {
110    fn from(srgba: Alpha<Hsv<f32>>) -> Self {
111        let Alpha {
112            color: Hsv { h, s, v },
113            alpha: a,
114        } = srgba;
115
116        Self::new(h, s, v, a)
117    }
118}
119
120impl From<Hsva> for Alpha<Hsv<f32>> {
121    fn from(col: Hsva) -> Self {
122        let Hsva { h, s, v, a } = col;
123
124        Self {
125            color: Hsv { h, s, v },
126            alpha: a,
127        }
128    }
129}
130
131impl ColorInterop for Hsva {
132    type CintTy = Alpha<Hsv<f32>>;
133}
134
135// ---- HsvaGamma ----
136
137impl ColorInterop for HsvaGamma {
138    type CintTy = Alpha<Hsv<f32>>;
139}
140
141impl From<Alpha<Hsv<f32>>> for HsvaGamma {
142    fn from(srgba: Alpha<Hsv<f32>>) -> Self {
143        let Alpha {
144            color: Hsv { h, s, v },
145            alpha: a,
146        } = srgba;
147
148        Hsva::new(h, s, v, a).into()
149    }
150}
151
152impl From<HsvaGamma> for Alpha<Hsv<f32>> {
153    fn from(col: HsvaGamma) -> Self {
154        let Hsva { h, s, v, a } = col.into();
155
156        Self {
157            color: Hsv { h, s, v },
158            alpha: a,
159        }
160    }
161}