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