chroma_rust/chroma/
chroma.rs

1use crate::Color;
2
3pub struct Chroma;
4
5impl Chroma {
6    /// mix two colors together using the given ratio (0.0 - 1.0)
7    fn _mix(color1: &Color, color2: &Color, mode: Option<&str>, ratio: Option<f64>) -> Color {
8        let mode = mode.unwrap_or("rgba");
9        let ratio = ratio.unwrap_or(0.5);
10        let v1 = color1.mode(mode);
11        let v2 = color2.mode(mode);
12        let mut v3 = Vec::new();
13        for i in 0..v1.len() {
14            v3.push(v1[i] + (v2[i] - v1[i]) * ratio);
15        }
16        Color::vec_mode2color(v3, mode)
17    }
18
19    pub fn mix(color1: &Color, color2: &Color) -> Color {
20        Chroma::_mix(color1, color2, None, None)
21    }
22
23    pub fn mix_mode(color1: &Color, color2: &Color, mode: &str) -> Color {
24        Chroma::_mix(color1, color2, Some(mode), None)
25    }
26
27    pub fn mix_ratio(color1: &Color, color2: &Color, ratio: f64) -> Color {
28        Self::_mix(color1, color2, None, Some(ratio))
29    }
30
31    pub fn mix_mode_and_ratio(color1: &Color, color2: &Color, mode: &str, ratio: f64) -> Color {
32        Self::_mix(color1, color2, Some(mode), Some(ratio))
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use super::*;
39
40    #[test]
41    fn test_mix() {
42        let color1 = Color::from("rgb(255, 0, 0)");
43        let color2 = Color::from("rgb(0, 0, 255)");
44        let color3 = Chroma::mix(&color1, &color2);
45        assert_eq!(color3.hex(), "#800080");
46
47        let color1 = Color::from("rgb(255, 0, 0)");
48        let color2 = Color::from("rgb(0, 0, 255)");
49        let color3 = Chroma::mix_mode(&color1, &color2, "lab");
50        assert_eq!(color3.hex(), "#ca0088");
51
52        let color1 = Color::from("red");
53        let color2 = Color::from("green");
54        let color3 = Chroma::mix_mode(&color1, &color2, "hsl");
55        assert_eq!(color3.hex(), "#c0c000");
56
57        let color1 = Color::from("red");
58        let color2 = Color::from("green");
59        let color3 = Chroma::mix(&color1, &color2);
60        assert_eq!(color3.hex(), "#804000");
61
62        let color1 = Color::from("red");
63        let color2 = Color::from("green");
64        let color3 = Chroma::mix_mode(&color1, &color2, "lab");
65        assert_eq!(color3.hex(), "#a16b00");
66    }
67}