fbpdf: show a message and exit if redrawing fails
[fbpdf.git] / poppler.c
blobab9c1c7820f7c95ef394f396b4bbbc8ca6fbe8fd
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 extern "C" {
9 #include "draw.h"
10 #include "doc.h"
13 struct doc {
14 poppler::document *doc;
17 static poppler::rotation_enum rotation(int times)
19 if (times == 1)
20 return poppler::rotate_90;
21 if (times == 2)
22 return poppler::rotate_180;
23 if (times == 3)
24 return poppler::rotate_270;
25 return poppler::rotate_0;
28 int doc_draw(struct doc *doc, int p, int zoom, int rotate,
29 fbval_t *bitmap, int *rows, int *cols)
31 poppler::page *page = doc->doc->create_page(p - 1);
32 poppler::page_renderer pr;
33 int x, y;
34 int h, w;
35 unsigned char *dat;
36 pr.set_render_hint(poppler::page_renderer::antialiasing, true);
37 pr.set_render_hint(poppler::page_renderer::text_antialiasing, true);
38 poppler::image img = pr.render_page(page, 72 * zoom / 10, 72 * zoom / 10,
39 -1, -1, -1, -1, rotation((rotate + 89) / 90));
40 h = img.height();
41 w = img.width();
42 dat = (unsigned char *) img.data();
43 for (y = 0; y < h; y++) {
44 int xs = y * *cols + (*cols - w) / 2;
45 for (x = 0; x < w; x++) {
46 unsigned char *s = dat + img.bytes_per_row() * y + x * 4;
47 bitmap[xs + x] = FB_VAL(s[2], s[1], s[0]);
50 *rows = h;
51 *cols = w;
52 delete page;
53 return 0;
56 int doc_pages(struct doc *doc)
58 return doc->doc->pages();
61 struct doc *doc_open(char *path)
63 struct doc *doc = (struct doc *) malloc(sizeof(*doc));
64 doc->doc = poppler::document::load_from_file(path);
65 if (!doc->doc) {
66 doc_close(doc);
67 return NULL;
69 return doc;
72 void doc_close(struct doc *doc)
74 delete doc->doc;
75 free(doc);