1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
use std::io; use std::collections::HashMap; use crate as pdf; use crate::object::{Object, Resolve}; use crate::primitive::Primitive; use crate::error::{Result}; #[derive(Debug, Clone)] pub struct Encoding { pub base: BaseEncoding, pub differences: HashMap<u32, String>, } #[derive(Object, Debug, Clone, Eq, PartialEq)] pub enum BaseEncoding { StandardEncoding, SymbolEncoding, MacRomanEncoding, WinAnsiEncoding, MacExpertEncoding, #[pdf(name="Identity-H")] IdentityH, None } impl Object for Encoding { fn serialize<W: io::Write>(&self, _out: &mut W) -> Result<()> {unimplemented!()} fn from_primitive(p: Primitive, resolve: &impl Resolve) -> Result<Self> { match p { name @ Primitive::Name(_) => { Ok(Encoding { base: BaseEncoding::from_primitive(name, resolve)?, differences: HashMap::new(), }) } Primitive::Dictionary(mut dict) => { let base = match dict.remove("BaseEncoding") { Some(p) => BaseEncoding::from_primitive(p, resolve)?, None => BaseEncoding::None }; let mut gid = 0; let mut differences = HashMap::new(); if let Some(p) = dict.remove("Differences") { for part in p.into_array(resolve)? { match part { Primitive::Integer(code) => { gid = code as u32; } Primitive::Name(name) => { differences.insert(gid, name); gid += 1; }, _ => panic!() } } } Ok(Encoding { base, differences }) } Primitive::Reference(r) => Self::from_primitive(resolve.resolve(r)?, resolve), _ => panic!() } } } impl Encoding { pub fn standard() -> Encoding { Encoding { base: BaseEncoding::StandardEncoding, differences: HashMap::new() } } }