summaryrefslogtreecommitdiffstats
path: root/src/config/colors.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/config/colors.rs')
-rw-r--r--src/config/colors.rs70
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())
+ }
+}