1 /* SPDX-License-Identifier: Zlib */
2
3 #include "plugin.h"
4
5 zathura_error_t
pdf_page_init(zathura_page_t * page)6 pdf_page_init(zathura_page_t* page)
7 {
8 if (page == NULL) {
9 return ZATHURA_ERROR_INVALID_ARGUMENTS;
10 }
11
12 zathura_document_t* document = zathura_page_get_document(page);
13 mupdf_document_t* mupdf_document = zathura_document_get_data(document);
14 mupdf_page_t* mupdf_page = calloc(1, sizeof(mupdf_page_t));
15 unsigned int index = zathura_page_get_index(page);
16
17 if (mupdf_page == NULL) {
18 return ZATHURA_ERROR_OUT_OF_MEMORY;
19 }
20
21 mupdf_page->ctx = mupdf_document->ctx;
22 if (mupdf_page->ctx == NULL) {
23 goto error_free;
24 }
25
26 /* load page */
27 fz_try (mupdf_page->ctx) {
28 mupdf_page->page = fz_load_page(mupdf_document->ctx, mupdf_document->document, index);
29 } fz_catch (mupdf_page->ctx) {
30 goto error_free;
31 }
32
33 mupdf_page->bbox = fz_bound_page(mupdf_document->ctx, (fz_page*) mupdf_page->page);
34
35 /* setup text */
36 mupdf_page->extracted_text = false;
37
38 mupdf_page->text = fz_new_stext_page(mupdf_page->ctx, mupdf_page->bbox);
39 if (mupdf_page->text == NULL) {
40 goto error_free;
41 }
42
43 zathura_page_set_data(page, mupdf_page);
44
45 /* get page dimensions */
46 zathura_page_set_width(page, mupdf_page->bbox.x1 - mupdf_page->bbox.x0);
47 zathura_page_set_height(page, mupdf_page->bbox.y1 - mupdf_page->bbox.y0);
48
49 return ZATHURA_ERROR_OK;
50
51 error_free:
52
53 pdf_page_clear(page, mupdf_page);
54
55 return ZATHURA_ERROR_UNKNOWN;
56 }
57
58 zathura_error_t
pdf_page_clear(zathura_page_t * page,void * data)59 pdf_page_clear(zathura_page_t* page, void* data)
60 {
61 if (page == NULL) {
62 return ZATHURA_ERROR_INVALID_ARGUMENTS;
63 }
64
65 mupdf_page_t* mupdf_page = data;
66 zathura_document_t* document = zathura_page_get_document(page);
67 mupdf_document_t* mupdf_document = zathura_document_get_data(document);
68
69 if (mupdf_page != NULL) {
70 if (mupdf_page->text != NULL) {
71 fz_drop_stext_page(mupdf_page->ctx, mupdf_page->text);
72 }
73
74 if (mupdf_page->page != NULL) {
75 fz_drop_page(mupdf_document->ctx, mupdf_page->page);
76 }
77
78 free(mupdf_page);
79 }
80
81 return ZATHURA_ERROR_UNKNOWN;
82 }
83
84