Skip to main content

pdfkit/
border.rs

1use std::ptr;
2
3use crate::error::Result;
4use crate::ffi;
5use crate::handle::ObjectHandle;
6use crate::types::{PdfBorderInfo, PdfBorderStyle};
7use crate::util::parse_json;
8
9/// Wraps `PDFBorder`.
10#[derive(Debug, Clone)]
11pub struct PdfBorder {
12    handle: ObjectHandle,
13}
14
15impl PdfBorder {
16    pub(crate) fn from_handle(handle: ObjectHandle) -> Self {
17        Self { handle }
18    }
19
20    /// Wraps the corresponding `PDFBorder` API.
21    pub fn new() -> Result<Self> {
22        let mut out_border = ptr::null_mut();
23        let mut out_error = ptr::null_mut();
24        let status = unsafe { ffi::pdf_border_new(&mut out_border, &mut out_error) };
25        crate::util::status_result(status, out_error)?;
26        Ok(Self::from_handle(crate::util::required_handle(
27            out_border,
28            "PDFBorder",
29        )?))
30    }
31
32    /// Wraps the corresponding `PDFBorder` API.
33    pub fn info(&self) -> Result<PdfBorderInfo> {
34        parse_json(
35            unsafe { ffi::pdf_border_info_json(self.handle.as_ptr()) },
36            "PDFBorder",
37        )
38    }
39
40    /// Wraps the corresponding `PDFBorder` API.
41    pub fn set_style(&self, style: PdfBorderStyle) -> Result<()> {
42        let mut out_error = ptr::null_mut();
43        let status = unsafe {
44            ffi::pdf_border_set_style(self.handle.as_ptr(), style as i32, &mut out_error)
45        };
46        crate::util::status_result(status, out_error)
47    }
48
49    /// Wraps the corresponding `PDFBorder` API.
50    pub fn set_line_width(&self, width: f64) {
51        unsafe { ffi::pdf_border_set_line_width(self.handle.as_ptr(), width) };
52    }
53
54    /// Wraps the corresponding `PDFBorder` API.
55    pub fn set_dash_pattern(&self, dash_pattern: Option<&[f64]>) -> Result<()> {
56        let mut out_error = ptr::null_mut();
57        let (values, len) = dash_pattern.map_or((ptr::null(), 0_u64), |values| {
58            (values.as_ptr(), values.len() as u64)
59        });
60        let status = unsafe {
61            ffi::pdf_border_set_dash_pattern(self.handle.as_ptr(), values, len, &mut out_error)
62        };
63        crate::util::status_result(status, out_error)
64    }
65
66    pub(crate) fn as_handle_ptr(&self) -> *mut core::ffi::c_void {
67        self.handle.as_ptr()
68    }
69}