use folio_cos::{ObjectId, PdfObject};
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum FitType {
XYZ { left: f64, top: f64, zoom: f64 },
Fit,
FitH { top: f64 },
FitV { left: f64 },
FitR {
left: f64,
bottom: f64,
right: f64,
top: f64,
},
FitB,
FitBH { top: f64 },
FitBV { left: f64 },
}
#[derive(Debug, Clone)]
pub struct Destination {
pub page_ref: Option<ObjectId>,
pub fit: FitType,
}
impl Destination {
pub fn from_object(obj: &PdfObject) -> Option<Self> {
let arr = obj.as_array()?;
if arr.is_empty() {
return None;
}
let page_ref = arr[0].as_reference();
let fit_name = arr.get(1).and_then(|o| o.as_name()).unwrap_or(b"Fit");
let f = |idx: usize| -> f64 { arr.get(idx).and_then(|o| o.as_f64()).unwrap_or(0.0) };
let fit = match fit_name {
b"XYZ" => FitType::XYZ {
left: f(2),
top: f(3),
zoom: f(4),
},
b"Fit" => FitType::Fit,
b"FitH" => FitType::FitH { top: f(2) },
b"FitV" => FitType::FitV { left: f(2) },
b"FitR" => FitType::FitR {
left: f(2),
bottom: f(3),
right: f(4),
top: f(5),
},
b"FitB" => FitType::FitB,
b"FitBH" => FitType::FitBH { top: f(2) },
b"FitBV" => FitType::FitBV { left: f(2) },
_ => FitType::Fit,
};
Some(Self { page_ref, fit })
}
}