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