3 #include <cairo/cairo.h>
4 #include <glib/poppler.h>
11 int doc_draw(struct doc
*doc
, fbval_t
*bitmap
, int p
,
12 int rows
, int cols
, int zoom
, int rotate
)
15 cairo_surface_t
*surface
;
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);
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
));
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
);
39 cairo_surface_destroy(surface
);
40 g_object_unref(G_OBJECT(page
));
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
);
57 doc
->doc
= poppler_document_new_from_file(uri
, NULL
, NULL
);
61 void doc_close(struct doc
*doc
)
63 g_object_unref(G_OBJECT(doc
->doc
));