bubbles/colors/
gradient.rs1use 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}