use crate::{
document::PdfiumDocument,
error::{PdfiumError, PdfiumResult},
lib,
pdfium_types::{DestinationHandle, FPDF_DEST, Handle},
};
#[derive(Debug, Clone)]
pub struct PdfiumDestination {
handle: DestinationHandle,
}
#[derive(Copy, Clone, Debug, PartialEq, Default)]
pub enum PdfiumDestinationView {
#[default]
Unknown,
#[allow(clippy::upper_case_acronyms)] XYZ(f32, f32, f32),
Fit,
FitH(f32),
FitV(f32),
FitR(f32, f32, f32, f32),
FitB,
FitBH(f32),
FitBV(f32),
}
impl PdfiumDestination {
pub(crate) fn new_from_handle(handle: FPDF_DEST) -> PdfiumResult<Self> {
if handle.is_null() {
Err(PdfiumError::NullHandle)
} else {
Ok(Self {
handle: Handle::new(handle, None), })
}
}
pub fn index(&self, document: &PdfiumDocument) -> Option<i32> {
let val = lib().FPDFDest_GetDestPageIndex(document, self);
if val >= 0 { Some(val) } else { None }
}
pub fn view(&self) -> PdfiumDestinationView {
let mut n_params: std::os::raw::c_ulong = 0; let mut params = [0f32; 4]; let mode: std::os::raw::c_ulong =
lib().FPDFDest_GetView(self, &mut n_params, &mut params[0]);
match mode {
0 => PdfiumDestinationView::Unknown,
1 => PdfiumDestinationView::XYZ(params[0], params[1], params[2]),
2 => PdfiumDestinationView::Fit,
3 => PdfiumDestinationView::FitH(params[0]),
4 => PdfiumDestinationView::FitV(params[0]),
5 => PdfiumDestinationView::FitR(params[0], params[1], params[2], params[3]),
6 => PdfiumDestinationView::FitB,
7 => PdfiumDestinationView::FitBH(params[0]),
8 => PdfiumDestinationView::FitBV(params[0]),
_ => unreachable!("Unknown destination view mode {}", mode),
}
}
}
impl From<&PdfiumDestination> for FPDF_DEST {
fn from(destination: &PdfiumDestination) -> Self {
destination.handle.handle()
}
}