diff options
Diffstat (limited to 'src/config/colors.rs')
-rw-r--r-- | src/config/colors.rs | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/config/colors.rs b/src/config/colors.rs index 7f56e85..9bc012d 100644 --- a/src/config/colors.rs +++ b/src/config/colors.rs @@ -43,3 +43,73 @@ pub fn extension_color(extension: &str) -> Color { hasher.write(extension.as_bytes()); COLORER(hasher.finish() as usize) } + +#[derive(Debug, Clone, Copy)] +pub struct ColorG { + r: u8, + g: u8, + b: u8, +} + +impl Default for ColorG { + fn default() -> Self { + Self { + r: 255, + g: 255, + b: 0, + } + } +} + +impl ColorG { + /// Parse a tuikit color into it's rgb values. + /// Non parsable colors returns None. + pub fn from_tuikit(color: Color) -> Option<Self> { + match color { + Color::Rgb(r, g, b) => Some(Self { r, g, b }), + _ => None, + } + } + + fn as_tuikit(&self) -> Color { + Color::Rgb(self.r, self.g, self.b) + } +} + +#[derive(Debug, Clone, Copy)] +pub struct Gradient { + start: ColorG, + end: ColorG, + step_ratio: f32, + len: usize, +} + +impl Gradient { + pub fn new(start: ColorG, end: ColorG, len: usize) -> Self { + let step_ratio = 1_f32 / len as f32; + Self { + start, + end, + step_ratio, + len, + } + } + + fn gradient_step(&self, step: usize) -> ColorG { + let position = self.step_ratio * step as f32; + + let r = self.start.r as f32 + (self.end.r as f32 - self.start.r as f32) * position; + let g = self.start.g as f32 + (self.end.g as f32 - self.start.g as f32) * position; + let b = self.start.b as f32 + (self.end.b as f32 - self.start.b as f32) * position; + + ColorG { + r: r.round() as u8, + g: g.round() as u8, + b: b.round() as u8, + } + } + + pub fn gradient(&self) -> impl Iterator<Item = Color> + '_ { + (0..self.len).map(move |step| self.gradient_step(step).as_tuikit()) + } +} |