use std::collections::HashMap;
use crate::{
data_structures::{Matrix, Rectangle},
error::PdfResult,
objects::Dictionary,
resources::Resources,
stream::Stream,
Resolve,
};
use super::{encoding::FontEncoding, BaseFontDict};
#[derive(Debug)]
pub struct Type3Font {
base: BaseFontDict,
font_bounding_box: Rectangle,
font_matrix: Matrix,
char_procs: HashMap<String, Stream>,
encoding: FontEncoding,
resources: Option<Resources>,
to_unicode: Option<Stream>,
}
impl Type3Font {
pub fn from_dict(mut dict: Dictionary, resolver: &mut dyn Resolve) -> PdfResult<Self> {
let base = BaseFontDict::from_dict(&mut dict, resolver)?;
let font_bounding_box = dict.expect_rectangle("FontBBox", resolver)?;
let font_matrix = dict.expect_matrix("Matrix", resolver)?;
let char_procs = dict
.expect_dict("CharProcs", resolver)?
.entries()
.map(|(key, obj)| Ok((key, resolver.assert_stream(obj)?)))
.collect::<PdfResult<_>>()?;
let encoding = FontEncoding::from_obj(dict.expect_object("Encoding", resolver)?, resolver)?;
let resources = dict
.get_dict("Resources", resolver)?
.map(|dict| Resources::from_dict(dict, resolver))
.transpose()?;
let to_unicode = dict.get_stream("ToUnicode", resolver)?;
assert!(to_unicode.is_none(), "cmap?");
Ok(Self {
base,
font_bounding_box,
font_matrix,
char_procs,
encoding,
resources,
to_unicode,
})
}
}