chroma_rust/chroma/
chroma.rs1use crate::Color;
2
3pub struct Chroma;
4
5impl Chroma {
6 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}