1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
// model.rs Color models
//
// Copyright (c) 2020 Douglas P Lau
//
//! Color models
use crate::el::{PixRgba, Pixel};
use std::any::Any;
use std::fmt::Debug;
use std::ops::Range;
/// Model for pixel colors.
///
/// Existing color models are [Rgb], [Bgr], [Cmy], [Gray], [Hsv], [Hsl], [Hwb],
/// [YCbCr] and [Matte].
///
/// [bgr]: bgr/struct.Bgr.html
/// [cmy]: cmy/struct.Cmy.html
/// [convert]: el/trait.Pixel.html#method.convert
/// [gray]: gray/struct.Gray.html
/// [hsl]: hsl/struct.Hsl.html
/// [hsv]: hsv/struct.Hsv.html
/// [hwb]: hwb/struct.Hwb.html
/// [matte]: matte/struct.Matte.html
/// [rgb]: rgb/struct.Rgb.html
/// [ycbcr]: ycc/struct.YCbCr.html
pub trait ColorModel: Clone + Copy + Debug + Default + PartialEq + Any {
/// Range of circular channel numbers
const CIRCULAR: Range<usize>;
/// Range of linear channel numbers
const LINEAR: Range<usize>;
/// Alpha channel number
const ALPHA: usize;
/// Convert into *red*, *green*, *blue* and *alpha* components
fn into_rgba<P>(p: P) -> PixRgba<P>
where
P: Pixel<Model = Self>;
/// Convert from *red*, *green*, *blue* and *alpha* components
fn from_rgba<P>(rgba: PixRgba<P>) -> P
where
P: Pixel<Model = Self>;
}