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
4impl 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
17impl 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 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 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
79impl 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
107impl 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
135impl 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}