fbpdf: remove the use of STD*_FILENO aliases
[fbpdf.git] / poppler.c
blob5be4ed13926c600592a21c50abca714daca92883
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 "doc.h"
12 struct doc {
13 poppler::document *doc;
16 static poppler::rotation_enum rotation(int times)
18 if (times == 1)
19 return poppler::rotate_90;
20 if (times == 2)
21 return poppler::rotate_180;
22 if (times == 3)
23 return poppler::rotate_270;
24 return poppler::rotate_0;
27 int doc_draw(struct doc *doc, int p, int zoom, int rotate,
28 fbval_t *bitmap, int *rows, int *cols)
30 poppler::page *page = doc->doc->create_page(p - 1);
31 poppler::page_renderer pr;
32 int x, y;
33 int h, w;
34 unsigned char *dat;
35 pr.set_render_hint(poppler::page_renderer::antialiasing, true);
36 pr.set_render_hint(poppler::page_renderer::text_antialiasing, true);
37 poppler::image img = pr.render_page(page, 72 * zoom / 10, 72 * zoom / 10,
38 -1, -1, -1, -1, rotation((rotate + 89) / 90));
39 h = img.height();
40 w = img.width();
41 dat = (unsigned char *) img.data();
42 for (y = 0; y < h; y++) {
43 int xs = y * *cols + (*cols - w) / 2;
44 for (x = 0; x < w; x++) {
45 unsigned char *s = dat + img.bytes_per_row() * y + x * 4;
46 bitmap[xs + x] = FB_VAL(s[2], s[1], s[0]);
49 *rows = h;
50 *cols = w;
51 delete page;
52 return 0;
55 int doc_pages(struct doc *doc)
57 return doc->doc->pages();
60 struct doc *doc_open(char *path)
62 struct doc *doc = (struct doc *) malloc(sizeof(*doc));
63 doc->doc = poppler::document::load_from_file(path);
64 if (!doc->doc) {
65 doc_close(doc);
66 return NULL;
68 return doc;
71 void doc_close(struct doc *doc)
73 delete doc->doc;
74 free(doc);