backport to mupdf-0.7
[fbpdf.git] / poppler.c
blobea81b29ff3e424507e4beaf411a5ce9accbbefce
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 int doc_draw(struct doc *doc, int p, int zoom, int rotate,
31 fbval_t *bitmap, int *rows, int *cols)
33 poppler::page *page = doc->doc->create_page(p - 1);
34 poppler::page_renderer pr;
35 int x, y;
36 int h, w;
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 = MIN(*rows, img.height());
43 w = MIN(*cols, img.width());
44 dat = (unsigned char *) img.data();
45 for (y = 0; y < h; y++) {
46 int xs = y * *cols + (*cols - w) / 2;
47 for (x = 0; x < w; x++) {
48 unsigned char *s = dat + img.bytes_per_row() * y + x * 4;
49 bitmap[xs + x] = FB_VAL(s[2], s[1], s[0]);
52 *rows = h;
53 *cols = w;
54 delete page;
55 return 0;
58 int doc_pages(struct doc *doc)
60 return doc->doc->pages();
63 struct doc *doc_open(char *path)
65 struct doc *doc = (struct doc *) malloc(sizeof(*doc));
66 doc->doc = poppler::document::load_from_file(path);
67 if (!doc->doc) {
68 doc_close(doc);
69 return NULL;
71 return doc;
74 void doc_close(struct doc *doc)
76 delete doc->doc;
77 free(doc);