add reload command with e
[fbpdf.git] / poppler.c
blob361511605d3778663057a0e18dcc78cf24ef98a6
1 #include <stdlib.h>
2 #include <string.h>
3 #include <cairo/cairo.h>
4 #include <glib/poppler.h>
5 #include "doc.h"
7 struct doc {
8 PopplerDocument *doc;
9 };
11 int doc_draw(struct doc *doc, fbval_t *bitmap, int p,
12 int rows, int cols, int zoom, int rotate)
14 cairo_t *cairo;
15 cairo_surface_t *surface;
16 PopplerPage *page;
17 unsigned char *img;
18 int i, j;
19 int h, w;
20 int iw;
21 surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, cols, rows);
22 cairo = cairo_create(surface);
23 cairo_scale(cairo, (float) zoom / 10, (float) zoom / 10);
24 cairo_set_source_rgb(cairo, 1.0, 1.0, 1.0);
25 cairo_paint(cairo);
26 img = cairo_image_surface_get_data(surface);
27 page = poppler_document_get_page(doc->doc, p - 1);
28 poppler_page_render(page, cairo);
29 iw = cairo_image_surface_get_width(surface);
30 h = MIN(rows, cairo_image_surface_get_height(surface));
31 w = MIN(cols, iw);
32 for (i = 0; i < h; i++) {
33 for (j = 0; j < w; j++) {
34 unsigned char *s = img + (i * iw + j) * 4;
35 bitmap[i * cols + j] = FB_VAL(*(s + 2), *(s + 1), *s);
38 cairo_destroy(cairo);
39 cairo_surface_destroy(surface);
40 g_object_unref(G_OBJECT(page));
41 return 0;
44 int doc_pages(struct doc *doc)
46 return poppler_document_get_n_pages(doc->doc);
49 struct doc *doc_open(char *path)
51 struct doc *doc = malloc(sizeof(*doc));
52 char abspath[PATH_MAX];
53 char uri[PATH_MAX + 16];
54 realpath(path, abspath);
55 snprintf(uri, sizeof(uri), "file://%s", abspath);
56 g_type_init();
57 doc->doc = poppler_document_new_from_file(uri, NULL, NULL);
58 return doc;
61 void doc_close(struct doc *doc)
63 g_object_unref(G_OBJECT(doc->doc));
64 free(doc);