use crate::{
error::PdfResult, filter::flate::BitsPerComponent, function::Function, objects::Dictionary,
pdf_enum, Resolve,
};
#[derive(Debug)]
pub struct FreeformShading {
bits_per_coordinate: BitsPerCoordinate,
bits_per_component: BitsPerComponent,
bits_per_flag: BitsPerFlag,
decode: Vec<f32>,
function: Option<Function>,
}
impl FreeformShading {
pub fn from_dict(dict: &mut Dictionary, resolver: &mut dyn Resolve) -> PdfResult<Self> {
let bits_per_coordinate =
BitsPerCoordinate::from_integer(dict.expect_integer("BitsPerCoordinate", resolver)?)?;
let bits_per_component =
BitsPerComponent::from_integer(dict.expect_integer("BitsPerComponent", resolver)?)?;
let bits_per_flag =
BitsPerFlag::from_integer(dict.expect_integer("BitsPerFlag", resolver)?)?;
let decode = dict
.expect_arr("Decode", resolver)?
.into_iter()
.map(|obj| resolver.assert_number(obj))
.collect::<PdfResult<Vec<f32>>>()?;
let function = dict.get_function("Function", resolver)?;
Ok(Self {
bits_per_coordinate,
bits_per_component,
bits_per_flag,
decode,
function,
})
}
}
pdf_enum!(
int
#[derive(Debug, Clone, Copy)]
pub enum BitsPerCoordinate {
One = 1,
Two = 2,
Four = 4,
Eight = 8,
Sixteen = 16,
ThirtyTwo = 32,
}
);
pdf_enum!(
int
#[derive(Debug, Clone, Copy)]
pub enum BitsPerFlag {
Two = 2,
Four = 4,
Eight = 8,
}
);