use crate::objects::{Dictionary, Object};
#[derive(Debug, Clone, PartialEq)]
#[non_exhaustive]
pub enum PageColorSpace {
DeviceAlias(DeviceColorSpace),
Parameterised {
family: ParameterisedFamily,
params: Dictionary,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum DeviceColorSpace {
Gray,
Rgb,
Cmyk,
Pattern,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum ParameterisedFamily {
CalGray,
CalRgb,
Lab,
IccBased,
}
impl DeviceColorSpace {
pub const fn pdf_name(self) -> &'static str {
match self {
DeviceColorSpace::Gray => "DeviceGray",
DeviceColorSpace::Rgb => "DeviceRGB",
DeviceColorSpace::Cmyk => "DeviceCMYK",
DeviceColorSpace::Pattern => "Pattern",
}
}
}
impl ParameterisedFamily {
pub const fn pdf_name(self) -> &'static str {
match self {
ParameterisedFamily::CalGray => "CalGray",
ParameterisedFamily::CalRgb => "CalRGB",
ParameterisedFamily::Lab => "Lab",
ParameterisedFamily::IccBased => "ICCBased",
}
}
}
impl PageColorSpace {
pub(crate) fn to_object(&self) -> Object {
match self {
PageColorSpace::DeviceAlias(device) => Object::Name(device.pdf_name().to_string()),
PageColorSpace::Parameterised { family, params } => Object::Array(vec![
Object::Name(family.pdf_name().to_string()),
Object::Dictionary(params.clone()),
]),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn device_alias_to_object_is_name() {
let obj = PageColorSpace::DeviceAlias(DeviceColorSpace::Cmyk).to_object();
match obj {
Object::Name(n) => assert_eq!(n, "DeviceCMYK"),
other => panic!("expected Name(DeviceCMYK), got {other:?}"),
}
}
#[test]
fn parameterised_to_object_is_two_element_array() {
let mut params = Dictionary::new();
params.set("Gamma", Object::Real(2.2));
let obj = PageColorSpace::Parameterised {
family: ParameterisedFamily::CalGray,
params,
}
.to_object();
match obj {
Object::Array(a) => {
assert_eq!(a.len(), 2);
assert!(matches!(&a[0], Object::Name(n) if n == "CalGray"));
assert!(matches!(&a[1], Object::Dictionary(_)));
}
other => panic!("expected two-element array, got {other:?}"),
}
}
#[test]
fn device_pdf_name_covers_all_variants() {
assert_eq!(DeviceColorSpace::Gray.pdf_name(), "DeviceGray");
assert_eq!(DeviceColorSpace::Rgb.pdf_name(), "DeviceRGB");
assert_eq!(DeviceColorSpace::Cmyk.pdf_name(), "DeviceCMYK");
assert_eq!(DeviceColorSpace::Pattern.pdf_name(), "Pattern");
}
#[test]
fn parameterised_pdf_name_covers_all_variants() {
assert_eq!(ParameterisedFamily::CalGray.pdf_name(), "CalGray");
assert_eq!(ParameterisedFamily::CalRgb.pdf_name(), "CalRGB");
assert_eq!(ParameterisedFamily::Lab.pdf_name(), "Lab");
assert_eq!(ParameterisedFamily::IccBased.pdf_name(), "ICCBased");
}
}