use super::*;
pub struct Lab;
pub type Spec = palette::Lab;
pub const DARKEST: f32 = 4.5;
pub const LIGHTEST: f32 = 95.5;
impl ColorTrait for Spec {}
impl Difference for Spec {
fn col_diff(&self, a: &Self, threshold: u8) -> bool {
use palette::color_difference::ImprovedCiede2000;
self.improved_difference(*a) <= threshold.into()
}
}
impl BuildHisto<Spec> for Lab {
fn filter_cols(histo: Vec<Spec>) -> Vec<Spec> {
let lights = histo.iter().map(|c| c.l).collect::<Vec<_>>();
let darkest = lights.iter().fold(f32::INFINITY, |a, &b| a.min(b)).max(DARKEST);
let lightest = lights.iter().fold(f32::INFINITY, |a, &b| a.max(b)).min(LIGHTEST);
let filt = |x: Spec| x.l >= darkest && x.l <= lightest;
histo.into_iter().filter(|&c| filt(c)).collect()
}
fn sort_col(histo: Vec<Histo<Spec>>, cs: &ColorOrder) -> Vec<Histo<Spec>> {
let mut histo = histo;
histo.sort_by(|a, b| match cs {
ColorOrder::LightFirst => b.color.l.partial_cmp(&a.color.l).unwrap_or(std::cmp::Ordering::Equal),
ColorOrder::DarkFirst => a.color.l.partial_cmp(&b.color.l).unwrap_or(std::cmp::Ordering::Equal),
});
histo
}
fn sort_by_key_fn(a: Histo<Spec>) -> impl Ord {
(a.color.l as u32, a.color.a as i32, a.color.b as i32)
}
}