use pdf_writer::writers::ExponentialFunction;
use pdf_writer::{Chunk, Finish, Name, Ref, Writer};
use crate::chunk_container::ChunkContainerFn;
use crate::color::separation::SeparationSpace;
use crate::color::{DEVICE_CMYK, DEVICE_GRAY, DEVICE_RGB};
use crate::resource::{self, Resource, Resourceable};
use crate::serialize::{Cacheable, MaybeDeviceColorSpace, SerializeContext};
use crate::util::Deferred;
#[derive(Debug, Eq, PartialEq, Hash, Clone)]
pub(crate) struct SeparationColorSpace {
space: SeparationSpace,
}
impl SeparationColorSpace {
pub fn new(space: SeparationSpace) -> Self {
Self { space }
}
}
impl Cacheable for SeparationColorSpace {
fn chunk_container(&self) -> ChunkContainerFn {
|cc| &mut cc.color_spaces
}
fn serialize(self, sc: &mut SerializeContext, root_ref: Ref) -> Deferred<Chunk> {
let fallback_cs = self.space.fallback.color_space(sc);
let fallback_cs_resource = sc.register_colorspace(fallback_cs.into());
let fallback_color = crate::color::Color::from(self.space.fallback).to_pdf_color();
let num_components = fallback_color.len();
let c0_value = if self.space.fallback.is_subtractive() {
0.0
} else {
1.0
};
if let Err(validation_error) = sc.validation_store().validate_separation(&self.space) {
sc.register_validation_error(validation_error);
}
Deferred::new(move || {
let mut chunk = Chunk::new();
let mut array = chunk.indirect(root_ref).array();
array.item(Name(b"Separation"));
array.item(self.space.colorant.to_pdf());
match fallback_cs_resource {
MaybeDeviceColorSpace::DeviceRgb => array.item(Name(DEVICE_RGB.as_bytes())),
MaybeDeviceColorSpace::DeviceGray => array.item(Name(DEVICE_GRAY.as_bytes())),
MaybeDeviceColorSpace::DeviceCMYK => array.item(Name(DEVICE_CMYK.as_bytes())),
MaybeDeviceColorSpace::ColorSpace(cs) => {
array.item(cs.get_ref())
}
};
ExponentialFunction::start(array.push())
.domain([0.0, 1.0])
.range([0.0, 1.0].repeat(num_components))
.c0(vec![c0_value; num_components])
.c1(fallback_color)
.n(1.0);
array.finish();
chunk
})
}
}
impl Resourceable for SeparationColorSpace {
type Resource = resource::ColorSpace;
}