use egui::Color32;
pub const fn rgb(r: u8, g: u8, b: u8) -> Color32 {
Color32::from_rgb(r, g, b)
}
pub const fn rgba(r: u8, g: u8, b: u8, a: u8) -> Color32 {
Color32::from_rgba_premultiplied(r, g, b, a)
}
pub trait ColorExt {
fn with_alpha(self, alpha: u8) -> Color32;
fn lerp(self, other: Color32, t: f32) -> Color32;
fn lighten(self, factor: f32) -> Color32;
fn darken(self, factor: f32) -> Color32;
}
impl ColorExt for Color32 {
fn with_alpha(self, alpha: u8) -> Color32 {
let [r, g, b, _] = self.to_array();
Color32::from_rgba_unmultiplied(r, g, b, alpha)
}
fn lerp(self, other: Color32, t: f32) -> Color32 {
let t = t.clamp(0.0, 1.0);
let [r1, g1, b1, a1] = self.to_array();
let [r2, g2, b2, a2] = other.to_array();
let mix = |a: u8, b: u8| -> u8 { (a as f32 + (b as f32 - a as f32) * t).round() as u8 };
Color32::from_rgba_unmultiplied(mix(r1, r2), mix(g1, g2), mix(b1, b2), mix(a1, a2))
}
fn lighten(self, factor: f32) -> Color32 {
self.lerp(Color32::WHITE, factor)
}
fn darken(self, factor: f32) -> Color32 {
self.lerp(Color32::BLACK, factor)
}
}