extern crate alloc;
use alloc::boxed::Box;
use alloc::vec;
use crate::error::{ColorError, ColorResult};
use crate::proofing_builder::ProofingConfigBuilder;
use crate::rendering_intent::RenderingIntent;
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum GamutWarning {
None,
Replace(crate::color_value::RgbColor),
}
impl Default for GamutWarning {
fn default() -> Self {
GamutWarning::None
}
}
pub struct ProofingConfig {
sim_executor: Box<moxcms::TransformF32BitExecutor>,
disp_executor: Box<moxcms::TransformF32BitExecutor>,
gamut_warning: GamutWarning,
sim_channels: usize,
src_channels: usize,
dst_channels: usize,
}
impl ProofingConfig {
pub fn builder() -> ProofingConfigBuilder {
ProofingConfigBuilder {
source: None,
simulation: None,
display: None,
simulation_intent: RenderingIntent::Perceptual,
display_intent: RenderingIntent::RelativeColorimetric,
gamut_warning: GamutWarning::None,
}
}
pub(crate) fn new(
sim_executor: Box<moxcms::TransformF32BitExecutor>,
disp_executor: Box<moxcms::TransformF32BitExecutor>,
gamut_warning: GamutWarning,
sim_channels: usize,
src_channels: usize,
dst_channels: usize,
) -> ColorResult<Self> {
Ok(Self {
sim_executor,
disp_executor,
gamut_warning,
sim_channels,
src_channels,
dst_channels,
})
}
pub fn proof(&self, src: &[f32], dst: &mut [f32]) -> ColorResult<()> {
let mut intermediate = vec![0.0_f32; self.sim_channels];
self.sim_executor
.transform(src, &mut intermediate)
.map_err(|e| {
ColorError::TransformExecution(alloc::format!("{:?}", e))
})?;
self.disp_executor
.transform(&intermediate, dst)
.map_err(|e| {
ColorError::TransformExecution(alloc::format!("{:?}", e))
})?;
Ok(())
}
pub fn gamut_warning(&self) -> GamutWarning {
self.gamut_warning
}
pub fn source_channels(&self) -> usize {
self.src_channels
}
pub fn destination_channels(&self) -> usize {
self.dst_channels
}
}