use crate::convert::convert;
use crate::spaces::{Hsv, ProphotoRgb, Rec2020, Rgb, A98, P3};
use crate::Color;
pub fn in_gamut(color: &Color, mode: &str) -> bool {
match mode {
"rgb" | "hsl" | "hsv" | "hwb" | "hsi" | "okhsl" | "okhsv" | "hsluv" | "hpluv"
| "prismatic" => {
let rgb = color_to_rgb(*color);
inrange_rgb_channels(rgb.r, rgb.g, rgb.b)
}
"lrgb" => {
let v = match *color {
Color::LinearRgb(x) => x,
other => crate::convert::convert::<crate::spaces::Xyz65, crate::spaces::LinearRgb>(
super::clamp::to_xyz65(other),
),
};
inrange_rgb_channels(v.r, v.g, v.b)
}
"p3" => {
let v: P3 = color_to_p3(*color);
inrange_rgb_channels(v.r, v.g, v.b)
}
"rec2020" => {
let v: Rec2020 = color_to_rec2020(*color);
inrange_rgb_channels(v.r, v.g, v.b)
}
"a98" => {
let v: A98 = color_to_a98(*color);
inrange_rgb_channels(v.r, v.g, v.b)
}
"prophoto" => {
let v: ProphotoRgb = color_to_prophoto(*color);
inrange_rgb_channels(v.r, v.g, v.b)
}
"lab" | "lab65" | "lch" | "lch65" | "oklab" | "oklch" | "xyz50" | "xyz65" | "jab"
| "jch" | "dlab" | "dlch" | "itp" | "xyb" | "luv" | "lchuv" | "cubehelix" | "yiq" => true,
_ => {
let rgb = color_to_rgb(*color);
inrange_rgb_channels(rgb.r, rgb.g, rgb.b)
}
}
}
pub(crate) fn color_to_p3(c: Color) -> P3 {
match c {
Color::P3(x) => x,
other => convert::<crate::spaces::Xyz65, P3>(super::clamp::to_xyz65(other)),
}
}
pub(crate) fn color_to_rec2020(c: Color) -> Rec2020 {
match c {
Color::Rec2020(x) => x,
other => convert::<crate::spaces::Xyz65, Rec2020>(super::clamp::to_xyz65(other)),
}
}
pub(crate) fn color_to_a98(c: Color) -> A98 {
match c {
Color::A98(x) => x,
other => convert::<crate::spaces::Xyz65, A98>(super::clamp::to_xyz65(other)),
}
}
pub(crate) fn color_to_prophoto(c: Color) -> ProphotoRgb {
match c {
Color::ProphotoRgb(x) => x,
other => convert::<crate::spaces::Xyz65, ProphotoRgb>(super::clamp::to_xyz65(other)),
}
}
fn inrange_rgb_channels(r: f64, g: f64, b: f64) -> bool {
in_range(r) && in_range(g) && in_range(b)
}
fn in_range(v: f64) -> bool {
v.is_nan() || (0.0..=1.0).contains(&v)
}
pub(crate) fn color_to_rgb(c: Color) -> Rgb {
match c {
Color::Rgb(x) => x,
Color::LinearRgb(x) => x.into(),
Color::Hsl(x) => x.into(),
Color::Hsv(x) => x.into(),
Color::Hwb(x) => Rgb::from(Hsv::from(x)),
Color::Lab(x) => crate::convert::<crate::spaces::Lab, Rgb>(x),
Color::Lab65(x) => crate::convert::<crate::spaces::Lab65, Rgb>(x),
Color::Lch(x) => crate::convert::<crate::spaces::Lch, Rgb>(x),
Color::Lch65(x) => crate::convert::<crate::spaces::Lch65, Rgb>(x),
Color::Oklab(x) => crate::convert::<crate::spaces::Oklab, Rgb>(x),
Color::Oklch(x) => crate::convert::<crate::spaces::Oklch, Rgb>(x),
Color::Xyz50(x) => crate::convert::<crate::spaces::Xyz50, Rgb>(x),
Color::Xyz65(x) => crate::convert::<crate::spaces::Xyz65, Rgb>(x),
Color::P3(x) => crate::convert::<crate::spaces::P3, Rgb>(x),
Color::Rec2020(x) => crate::convert::<crate::spaces::Rec2020, Rgb>(x),
Color::A98(x) => crate::convert::<crate::spaces::A98, Rgb>(x),
Color::ProphotoRgb(x) => crate::convert::<crate::spaces::ProphotoRgb, Rgb>(x),
Color::Cubehelix(x) => Rgb::from(x),
Color::Dlab(x) => crate::convert::<crate::spaces::Dlab, Rgb>(x),
Color::Dlch(x) => crate::convert::<crate::spaces::Dlch, Rgb>(x),
Color::Jab(x) => crate::convert::<crate::spaces::Jab, Rgb>(x),
Color::Jch(x) => crate::convert::<crate::spaces::Jch, Rgb>(x),
Color::Yiq(x) => Rgb::from(x),
Color::Hsi(x) => Rgb::from(x),
Color::Hsluv(x) => Rgb::from(x),
Color::Hpluv(x) => Rgb::from(x),
Color::Okhsl(x) => crate::convert::<crate::spaces::Okhsl, Rgb>(x),
Color::Okhsv(x) => crate::convert::<crate::spaces::Okhsv, Rgb>(x),
Color::Itp(x) => crate::convert::<crate::spaces::Itp, Rgb>(x),
Color::Xyb(x) => Rgb::from(x),
Color::Luv(x) => crate::convert::<crate::spaces::Luv, Rgb>(x),
Color::Lchuv(x) => crate::convert::<crate::spaces::Lchuv, Rgb>(x),
Color::Prismatic(x) => Rgb::from(x),
}
}