mupdf: support mupdf-1.10
[fbpdf.git] / poppler.c
blobfdd646ac5569f2cbe40e4eebc25fb17bfab57ae1
1 #include <stdlib.h>
2 #include <string.h>
3 #include <poppler/cpp/poppler-document.h>
4 #include <poppler/cpp/poppler-image.h>
5 #include <poppler/cpp/poppler-page.h>
6 #include <poppler/cpp/poppler-page-renderer.h>
8 #define MIN(a, b) ((a) < (b) ? (a) : (b))
10 extern "C" {
11 #include "draw.h"
12 #include "doc.h"
15 struct doc {
16 poppler::document *doc;
19 static poppler::rotation_enum rotation(int times)
21 if (times == 1)
22 return poppler::rotate_90;
23 if (times == 2)
24 return poppler::rotate_180;
25 if (times == 3)
26 return poppler::rotate_270;
27 return poppler::rotate_0;
30 void *doc_draw(struct doc *doc, int p, int zoom, int rotate, int *rows, int *cols)
32 poppler::page *page = doc->doc->create_page(p - 1);
33 poppler::page_renderer pr;
34 int x, y;
35 int h, w;
36 fbval_t *pbuf;
37 unsigned char *dat;
38 pr.set_render_hint(poppler::page_renderer::antialiasing, true);
39 pr.set_render_hint(poppler::page_renderer::text_antialiasing, true);
40 poppler::image img = pr.render_page(page, 72 * zoom / 10, 72 * zoom / 10,
41 -1, -1, -1, -1, rotation((rotate + 89) / 90));
42 h = img.height();
43 w = img.width();
44 dat = (unsigned char *) img.data();
45 if (!(pbuf = (fbval_t *) malloc(h * w * sizeof(pbuf[0])))) {
46 delete page;
47 return NULL;
49 for (y = 0; y < h; y++) {
50 unsigned char *s = dat + img.bytes_per_row() * y;
51 for (x = 0; x < w; x++)
52 pbuf[y * w + x] = FB_VAL(s[x * 4 + 2],
53 s[x * 4 + 1], s[x * 4 + 0]);
55 *rows = h;
56 *cols = w;
57 delete page;
58 return pbuf;
61 int doc_pages(struct doc *doc)
63 return doc->doc->pages();
66 struct doc *doc_open(char *path)
68 struct doc *doc = (struct doc *) malloc(sizeof(*doc));
69 doc->doc = poppler::document::load_from_file(path);
70 if (!doc->doc) {
71 doc_close(doc);
72 return NULL;
74 return doc;
77 void doc_close(struct doc *doc)
79 delete doc->doc;
80 free(doc);