1 #include "PopplerGlibPage.h"
2 
3 
PopplerGlibPage(PopplerPage * page)4 PopplerGlibPage::PopplerGlibPage(PopplerPage* page): page(page) {
5     if (page != nullptr) {
6         g_object_ref(page);
7     }
8 }
9 
PopplerGlibPage(const PopplerGlibPage & other)10 PopplerGlibPage::PopplerGlibPage(const PopplerGlibPage& other): page(other.page) {
11     if (page != nullptr) {
12         g_object_ref(page);
13     }
14 }
15 
~PopplerGlibPage()16 PopplerGlibPage::~PopplerGlibPage() {
17     if (page) {
18         g_object_unref(page);
19         page = nullptr;
20     }
21 }
22 
operator =(const PopplerGlibPage & other)23 PopplerGlibPage& PopplerGlibPage::operator=(const PopplerGlibPage& other) {
24     if (&other == this) {
25         return *this;
26     }
27     if (page) {
28         g_object_unref(page);
29         page = nullptr;
30     }
31 
32     page = other.page;
33     if (page != nullptr) {
34         g_object_ref(page);
35     }
36     return *this;
37 }
38 
getWidth()39 auto PopplerGlibPage::getWidth() -> double {
40     double width = 0;
41     poppler_page_get_size(page, &width, nullptr);
42 
43     return width;
44 }
45 
getHeight()46 auto PopplerGlibPage::getHeight() -> double {
47     double height = 0;
48     poppler_page_get_size(page, nullptr, &height);
49 
50     return height;
51 }
52 
render(cairo_t * cr,bool forPrinting)53 void PopplerGlibPage::render(cairo_t* cr, bool forPrinting)  // NOLINT(google-default-arguments)
54 {
55     if (forPrinting) {
56         poppler_page_render_for_printing(page, cr);
57     } else {
58         poppler_page_render(page, cr);
59     }
60 }
61 
getPageId()62 auto PopplerGlibPage::getPageId() -> int { return poppler_page_get_index(page); }
63 
findText(string & text)64 auto PopplerGlibPage::findText(string& text) -> vector<XojPdfRectangle> {
65     vector<XojPdfRectangle> findings;
66 
67     double height = getHeight();
68     GList* matches = poppler_page_find_text(page, text.c_str());
69 
70     for (GList* l = matches; l && l->data; l = g_list_next(l)) {
71         auto* rect = static_cast<PopplerRectangle*>(l->data);
72 
73         findings.emplace_back(rect->x1, height - rect->y1, rect->x2, height - rect->y2);
74 
75         poppler_rectangle_free(rect);
76     }
77     g_list_free(matches);
78 
79     return findings;
80 }
81