bubbles/colors/
gradient.rs

1use crossterm::style::Color;
2use fast_srgb8::f32_to_srgb8;
3use palette::{Gradient, LinSrgb, Shade};
4use std::str::FromStr;
5
6pub struct Gradients {}
7
8impl Gradients {
9    pub fn from_colors(colors: &[&str], resolution: usize) -> Vec<Color> {
10        let mut gradient_starts = Vec::new();
11        let mut gradient_ends = Vec::new();
12
13        let (starts, ends) = if colors.len() > 2 {
14            colors.split_at(colors.len() / 2)
15        } else {
16            (&colors[..1], &colors[1..])
17        };
18
19        for color in starts {
20            let c = LinSrgb::from_str(color).unwrap().into_format();
21
22            let mut gs = vec![
23                c.darken_fixed(0.3),
24                c.darken_fixed(0.3),
25                c.darken_fixed(0.2),
26            ];
27
28            gradient_starts.append(&mut gs);
29        }
30
31        for color in ends {
32            let c = LinSrgb::from_str(color).unwrap().into_format();
33
34            let mut gs = vec![
35                c.darken_fixed(0.2),
36                c.darken_fixed(0.3),
37                c.darken_fixed(0.4),
38            ];
39
40            gradient_ends.append(&mut gs);
41        }
42
43        let gradient = Gradient::new(vec![gradient_starts, gradient_ends].concat());
44
45        gradient
46            .take(resolution)
47            .map(|c| Color::Rgb {
48                r: f32_to_srgb8(c.red),
49                g: f32_to_srgb8(c.green),
50                b: f32_to_srgb8(c.blue),
51            })
52            .collect()
53    }
54}