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)]
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 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 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 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 pub fn set_line_width(&self, width: f64) {
51 unsafe { ffi::pdf_border_set_line_width(self.handle.as_ptr(), width) };
52 }
53
54 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}