use crate::{error::PdfResult, pdf_enum, stream::Stream, Resolve};
#[derive(Debug)]
pub struct SampledFunction {
size: Vec<u32>,
bits_per_sample: BitsPerSample,
order: InterpolationOrder,
encode: Vec<f32>,
decode: Option<Vec<f32>>,
stream: Stream,
}
impl SampledFunction {
pub fn from_stream(mut stream: Stream, resolver: &mut dyn Resolve) -> PdfResult<Self> {
let dict = &mut stream.dict.other;
let size = dict
.expect_arr("Size", resolver)?
.into_iter()
.map(|obj| resolver.assert_unsigned_integer(obj))
.collect::<PdfResult<Vec<u32>>>()?;
let bits_per_sample =
BitsPerSample::from_integer(dict.expect_integer("BitsPerSample", resolver)?)?;
let order = InterpolationOrder::from_integer(dict.expect_integer("Order", resolver)?)?;
let encode = dict
.get_arr("Encode", resolver)?
.map(|arr| {
arr.into_iter()
.map(|obj| resolver.assert_number(obj))
.collect::<PdfResult<Vec<f32>>>()
})
.transpose()?
.unwrap_or_else(|| {
size.iter()
.flat_map(|&i| vec![0.0, (i as f32) - 1.0])
.collect()
});
let decode = dict
.get_arr("Decode", resolver)?
.map(|arr| {
arr.into_iter()
.map(|obj| resolver.assert_number(obj))
.collect::<PdfResult<Vec<f32>>>()
})
.transpose()?;
Ok(Self {
size,
bits_per_sample,
order,
encode,
decode,
stream,
})
}
}
pdf_enum!(
int
#[derive(Debug)]
enum InterpolationOrder {
Linear = 1,
Cubic = 3,
}
);
impl Default for InterpolationOrder {
fn default() -> Self {
Self::Linear
}
}
pdf_enum!(
int
#[derive(Debug, Clone, Copy)]
enum BitsPerSample {
One = 1,
Two = 2,
Four = 4,
Eight = 8,
Twelve = 12,
Sixteen = 16,
TwentyFour = 24,
ThirtyTwo = 32,
}
);