use crate::error::{ColorError, ColorResult};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ColorSpace {
Rgb,
Cmyk,
Lab,
Xyz,
Gray,
}
impl ColorSpace {
pub const fn channel_count(self) -> usize {
match self {
ColorSpace::Rgb => 3,
ColorSpace::Cmyk => 4,
ColorSpace::Lab => 3,
ColorSpace::Xyz => 3,
ColorSpace::Gray => 1,
}
}
pub fn to_moxcms_layout(self) -> moxcms::Layout {
match self {
ColorSpace::Rgb => moxcms::Layout::Rgb,
ColorSpace::Cmyk => moxcms::Layout::Rgba,
ColorSpace::Lab => moxcms::Layout::Rgb,
ColorSpace::Xyz => moxcms::Layout::Rgb,
ColorSpace::Gray => moxcms::Layout::Gray,
}
}
pub fn from_moxcms(dcs: moxcms::DataColorSpace) -> ColorResult<Self> {
match dcs {
moxcms::DataColorSpace::Rgb => Ok(ColorSpace::Rgb),
moxcms::DataColorSpace::Cmyk => Ok(ColorSpace::Cmyk),
moxcms::DataColorSpace::Lab => Ok(ColorSpace::Lab),
moxcms::DataColorSpace::Xyz => Ok(ColorSpace::Xyz),
moxcms::DataColorSpace::Gray => Ok(ColorSpace::Gray),
other => Err(ColorError::UnsupportedColorSpace(
alloc::format!("{:?}", other),
)),
}
}
}
impl core::fmt::Display for ColorSpace {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
ColorSpace::Rgb => write!(f, "RGB"),
ColorSpace::Cmyk => write!(f, "CMYK"),
ColorSpace::Lab => write!(f, "Lab"),
ColorSpace::Xyz => write!(f, "XYZ"),
ColorSpace::Gray => write!(f, "Gray"),
}
}
}
extern crate alloc;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn channel_counts() {
assert_eq!(ColorSpace::Rgb.channel_count(), 3);
assert_eq!(ColorSpace::Cmyk.channel_count(), 4);
assert_eq!(ColorSpace::Lab.channel_count(), 3);
assert_eq!(ColorSpace::Xyz.channel_count(), 3);
assert_eq!(ColorSpace::Gray.channel_count(), 1);
}
#[test]
fn display_formatting() {
assert_eq!(ColorSpace::Rgb.to_string(), "RGB");
assert_eq!(ColorSpace::Cmyk.to_string(), "CMYK");
}
#[test]
fn from_moxcms_supported() {
assert_eq!(
ColorSpace::from_moxcms(moxcms::DataColorSpace::Rgb).unwrap(),
ColorSpace::Rgb
);
assert_eq!(
ColorSpace::from_moxcms(moxcms::DataColorSpace::Cmyk).unwrap(),
ColorSpace::Cmyk
);
}
#[test]
fn from_moxcms_unsupported() {
let result = ColorSpace::from_moxcms(moxcms::DataColorSpace::Hls);
assert!(matches!(result, Err(ColorError::UnsupportedColorSpace(_))));
}
}