pdfium_render/pdf/document/page/annotation/
variable_text.rs

1use crate::error::{PdfiumError, PdfiumInternalError};
2use crate::pdf::document::form::PdfForm;
3use crate::pdf::document::page::annotation::private::internal::PdfPageAnnotationPrivate;
4use crate::pdf::points::PdfPoints;
5use std::ffi::c_float;
6
7#[cfg(any(
8    feature = "pdfium_future",
9    feature = "pdfium_7215",
10    feature = "pdfium_7123",
11    feature = "pdfium_6996",
12    feature = "pdfium_6721",
13    feature = "pdfium_6666",
14    feature = "pdfium_6611",
15    feature = "pdfium_6569",
16    feature = "pdfium_6555",
17))]
18use {crate::pdf::color::PdfColor, std::ffi::c_uint};
19
20#[cfg(doc)]
21use crate::pdf::document::page::annotation::PdfPageAnnotation;
22
23/// Text-handling functions common to all [PdfPageAnnotation] types that
24/// support custom text.
25pub trait PdfPageAnnotationVariableText<'a> {
26    /// Returns the size of the text in this annotation. A value of [PdfPoints::ZERO]
27    /// indicates that the font size is determined automatically from the annotation height.
28    /// See also the [PdfPageAnnotationVariableText::is_font_auto_sized()] function.
29    fn get_font_size(&self, form: &PdfForm) -> Result<PdfPoints, PdfiumError>;
30
31    /// Returns `true` if the font size for this annotation is determined automatically
32    /// from the annotation height.
33    fn is_font_auto_sized(&self, form: &PdfForm) -> bool;
34
35    #[cfg(any(
36        feature = "pdfium_future",
37        feature = "pdfium_7215",
38        feature = "pdfium_7123",
39        feature = "pdfium_6996",
40        feature = "pdfium_6721",
41        feature = "pdfium_6666",
42        feature = "pdfium_6611",
43        feature = "pdfium_6569",
44        feature = "pdfium_6555",
45    ))]
46    /// Returns the color of the text in this annotation.
47    fn get_font_color(&self, form: &PdfForm) -> Result<PdfColor, PdfiumError>;
48
49    #[cfg(feature = "pdfium_future")]
50    /// Sets the color of the text in this annotation.
51    fn set_font_color(&mut self, form: &PdfForm, color: PdfColor) -> Result<(), PdfiumError>;
52}
53
54impl<'a, T> PdfPageAnnotationVariableText<'a> for T
55where
56    T: PdfPageAnnotationPrivate<'a>,
57{
58    fn get_font_size(&self, form: &PdfForm) -> Result<PdfPoints, PdfiumError> {
59        let mut value: c_float = 0.0;
60
61        if self
62            .bindings()
63            .is_true(self.bindings().FPDFAnnot_GetFontSize(
64                form.handle(),
65                self.handle(),
66                &mut value,
67            ))
68        {
69            Ok(PdfPoints::new(value))
70        } else {
71            Err(PdfiumError::PdfiumLibraryInternalError(
72                PdfiumInternalError::Unknown,
73            ))
74        }
75    }
76
77    fn is_font_auto_sized(&self, form: &PdfForm) -> bool {
78        match self.get_font_size(form) {
79            Ok(size) => size.value == 0.0,
80            _ => false,
81        }
82    }
83
84    #[cfg(any(
85        feature = "pdfium_future",
86        feature = "pdfium_7215",
87        feature = "pdfium_7123",
88        feature = "pdfium_6996",
89        feature = "pdfium_6721",
90        feature = "pdfium_6666",
91        feature = "pdfium_6611",
92        feature = "pdfium_6569",
93        feature = "pdfium_6555",
94    ))]
95    fn get_font_color(&self, form: &PdfForm) -> Result<PdfColor, PdfiumError> {
96        let mut red: c_uint = 0;
97        let mut green: c_uint = 0;
98        let mut blue: c_uint = 0;
99
100        if self
101            .bindings()
102            .is_true(self.bindings().FPDFAnnot_GetFontColor(
103                form.handle(),
104                self.handle(),
105                &mut red,
106                &mut green,
107                &mut blue,
108            ))
109        {
110            Ok(PdfColor::new(red as u8, green as u8, blue as u8, 255))
111        } else {
112            Err(PdfiumError::PdfiumLibraryInternalError(
113                PdfiumInternalError::Unknown,
114            ))
115        }
116    }
117
118    #[cfg(feature = "pdfium_future")]
119    fn set_font_color(&mut self, form: &PdfForm, color: PdfColor) -> Result<(), PdfiumError> {
120        if self
121            .bindings()
122            .is_true(self.bindings().FPDFAnnot_SetFontColor(
123                form.handle(),
124                self.handle(),
125                color.red() as c_uint,
126                color.green() as c_uint,
127                color.blue() as c_uint,
128            ))
129        {
130            Ok(())
131        } else {
132            Err(PdfiumError::PdfiumLibraryInternalError(
133                PdfiumInternalError::Unknown,
134            ))
135        }
136    }
137}