use crate::color::PolarColor;
use crate::hsi::HsiOutOfGamutMode;
use crate::ycbcr::YCbCrOutOfGamutMode;
use angle;
use angle::{Angle, FromAngle};
use num_traits;
use num_traits::Float;
pub trait FromColor<From> {
fn from_color(from: &From) -> Self;
}
pub trait FromHsi<From> {
fn from_hsi(from: &From, out_of_gamut_mode: HsiOutOfGamutMode) -> Self;
}
pub trait FromYCbCr<From> {
fn from_ycbcr(from: &From, out_of_gamut_mode: YCbCrOutOfGamutMode) -> Self;
}
pub trait GetChroma {
type ChromaType;
fn get_chroma(&self) -> Self::ChromaType;
}
pub trait GetHue {
type InternalAngle: angle::Angle;
fn get_hue<U>(&self) -> U
where
U: Angle<Scalar = <Self::InternalAngle as Angle>::Scalar> + FromAngle<Self::InternalAngle>;
}
pub fn decompose_hue_segment<Color>(
color: &Color,
) -> (i32, <<Color as PolarColor>::Angular as Angle>::Scalar)
where
Color: PolarColor + GetHue<InternalAngle = <Color as PolarColor>::Angular>,
Color::Angular: Angle,
{
let scaled_hue = (color.get_hue::<angle::Turns<_>>() * num_traits::cast(6.0).unwrap()).scalar();
let hue_seg = scaled_hue.floor();
(num_traits::cast(hue_seg).unwrap(), scaled_hue - hue_seg)
}