primitives/foundation/colorspace/
convert.rs

1use super::*;
2
3/// Defines from-color converion functionality
4pub trait FromColor<Fr> {
5    /// Convert from color
6    fn from_color(color: Fr) -> Self;
7}
8
9/// Defines into-color converion functionality
10pub trait IntoColor<To> {
11    /// Convert into color
12    fn into_color(self) -> To;
13}
14
15impl<Fr, To> FromColor<Fr> for To
16where
17    To: From<Color>,
18    Fr: Into<Color>,
19{
20    fn from_color(from_color: Fr) -> To {
21        To::from(from_color.into())
22    }
23}
24
25impl<Fr, To> IntoColor<To> for Fr
26where
27    To: FromColor<Fr>,
28{
29    fn into_color(self) -> To {
30        To::from_color(self)
31    }
32}
33
34// RGB -> ALL
35impl From<RgbColor> for RgbaColor {
36    fn from(c: RgbColor) -> Self {
37        RgbaColor {
38            red: c.red,
39            green: c.green,
40            blue: c.blue,
41            alpha: 255,
42        }
43    }
44}
45impl From<RgbColor> for HslColor {
46    fn from(c: RgbColor) -> Self {
47        Self::from_color(c)
48    }
49}
50impl From<RgbColor> for HsvColor {
51    fn from(c: RgbColor) -> Self {
52        Self::from_color(c)
53    }
54}
55impl From<RgbColor> for CmykColor {
56    fn from(c: RgbColor) -> Self {
57        Self::from_color(c)
58    }
59}
60impl From<RgbColor> for CmyColor {
61    fn from(c: RgbColor) -> Self {
62        Self::from_color(c)
63    }
64}
65#[cfg(feature = "experimental")]
66impl From<RgbColor> for LabColor {
67    fn from(c: RgbColor) -> Self {
68        Self::from_color(c)
69    }
70}
71#[cfg(feature = "experimental")]
72impl From<RgbColor> for XyzColor {
73    fn from(c: RgbColor) -> Self {
74        Self::from_color(c)
75    }
76}
77
78// RGBA -> ALL
79impl From<RgbaColor> for RgbColor {
80    fn from(c: RgbaColor) -> Self {
81        RgbColor {
82            red: c.red,
83            green: c.green,
84            blue: c.blue,
85        }
86    }
87}
88impl From<RgbaColor> for HslColor {
89    fn from(c: RgbaColor) -> Self {
90        Self::from_color(c)
91    }
92}
93impl From<RgbaColor> for HsvColor {
94    fn from(c: RgbaColor) -> Self {
95        Self::from_color(c)
96    }
97}
98impl From<RgbaColor> for CmykColor {
99    fn from(c: RgbaColor) -> Self {
100        Self::from_color(c)
101    }
102}
103impl From<RgbaColor> for CmyColor {
104    fn from(c: RgbaColor) -> Self {
105        Self::from_color(c)
106    }
107}
108#[cfg(feature = "experimental")]
109impl From<RgbaColor> for LabColor {
110    fn from(c: RgbaColor) -> Self {
111        Self::from_color(c)
112    }
113}
114#[cfg(feature = "experimental")]
115impl From<RgbaColor> for XyzColor {
116    fn from(c: RgbaColor) -> Self {
117        Self::from_color(c)
118    }
119}
120
121// HSL -> ALL
122impl From<HslColor> for RgbColor {
123    fn from(c: HslColor) -> Self {
124        Self::from_color(c)
125    }
126}
127impl From<HslColor> for RgbaColor {
128    fn from(c: HslColor) -> Self {
129        Self::from_color(c)
130    }
131}
132impl From<HslColor> for HsvColor {
133    fn from(c: HslColor) -> Self {
134        Self::from_color(c)
135    }
136}
137impl From<HslColor> for CmykColor {
138    fn from(c: HslColor) -> Self {
139        Self::from_color(c)
140    }
141}
142impl From<HslColor> for CmyColor {
143    fn from(c: HslColor) -> Self {
144        Self::from_color(c)
145    }
146}
147#[cfg(feature = "experimental")]
148impl From<HslColor> for LabColor {
149    fn from(c: HslColor) -> Self {
150        Self::from_color(c)
151    }
152}
153#[cfg(feature = "experimental")]
154impl From<HslColor> for XyzColor {
155    fn from(c: HslColor) -> Self {
156        Self::from_color(c)
157    }
158}
159
160// HSV -> ALL
161impl From<HsvColor> for RgbColor {
162    fn from(c: HsvColor) -> Self {
163        Self::from_color(c)
164    }
165}
166impl From<HsvColor> for RgbaColor {
167    fn from(c: HsvColor) -> Self {
168        Self::from_color(c)
169    }
170}
171impl From<HsvColor> for HslColor {
172    fn from(c: HsvColor) -> Self {
173        Self::from_color(c)
174    }
175}
176impl From<HsvColor> for CmykColor {
177    fn from(c: HsvColor) -> Self {
178        Self::from_color(c)
179    }
180}
181impl From<HsvColor> for CmyColor {
182    fn from(c: HsvColor) -> Self {
183        Self::from_color(c)
184    }
185}
186#[cfg(feature = "experimental")]
187impl From<HsvColor> for LabColor {
188    fn from(c: HsvColor) -> Self {
189        Self::from_color(c)
190    }
191}
192#[cfg(feature = "experimental")]
193impl From<HsvColor> for XyzColor {
194    fn from(c: HsvColor) -> Self {
195        Self::from_color(c)
196    }
197}
198
199// CMYK -> ALL
200impl From<CmykColor> for RgbColor {
201    fn from(c: CmykColor) -> Self {
202        Self::from_color(c)
203    }
204}
205impl From<CmykColor> for RgbaColor {
206    fn from(c: CmykColor) -> Self {
207        Self::from_color(c)
208    }
209}
210impl From<CmykColor> for HslColor {
211    fn from(c: CmykColor) -> Self {
212        Self::from_color(c)
213    }
214}
215impl From<CmykColor> for HsvColor {
216    fn from(c: CmykColor) -> Self {
217        Self::from_color(c)
218    }
219}
220impl From<CmykColor> for CmyColor {
221    fn from(c: CmykColor) -> Self {
222        Self::from_color(c)
223    }
224}
225#[cfg(feature = "experimental")]
226impl From<CmykColor> for LabColor {
227    fn from(c: CmykColor) -> Self {
228        Self::from_color(c)
229    }
230}
231#[cfg(feature = "experimental")]
232impl From<CmykColor> for XyzColor {
233    fn from(c: CmykColor) -> Self {
234        Self::from_color(c)
235    }
236}
237
238// CMY -> ALL
239impl From<CmyColor> for RgbColor {
240    fn from(c: CmyColor) -> Self {
241        Self::from_color(c)
242    }
243}
244impl From<CmyColor> for RgbaColor {
245    fn from(c: CmyColor) -> Self {
246        Self::from_color(c)
247    }
248}
249impl From<CmyColor> for HslColor {
250    fn from(c: CmyColor) -> Self {
251        Self::from_color(c)
252    }
253}
254impl From<CmyColor> for HsvColor {
255    fn from(c: CmyColor) -> Self {
256        Self::from_color(c)
257    }
258}
259impl From<CmyColor> for CmykColor {
260    fn from(c: CmyColor) -> Self {
261        Self::from_color(c)
262    }
263}
264#[cfg(feature = "experimental")]
265impl From<CmyColor> for LabColor {
266    fn from(c: CmyColor) -> Self {
267        Self::from_color(c)
268    }
269}
270#[cfg(feature = "experimental")]
271impl From<CmyColor> for XyzColor {
272    fn from(c: CmyColor) -> Self {
273        Self::from_color(c)
274    }
275}
276
277#[cfg(test)]
278mod test {
279    use super::super::prelude::*;
280
281    use super::super::*;
282
283    #[test]
284    fn into_color_self() {
285        let rgb1 = Color::new(200., 200., 200., 1.);
286        let rgb2: Color = rgb1.into_color();
287        assert_eq!(rgb1.red, rgb2.red);
288        assert_eq!(rgb1.green, rgb2.green);
289        assert_eq!(rgb1.blue, rgb2.blue);
290        assert_eq!(rgb1.get_hue(), rgb2.get_hue());
291        assert_eq!(rgb1.get_hsl_saturation(), rgb2.get_hsl_saturation());
292    }
293}