2ab78f420cb775be4252d5eb235a3baa50bc0697
3 #include <cairo/cairo.h>
4 #include <glib/poppler.h>
11 int doc_draw(struct doc
*doc
, int p
, int zoom
, int rotate
,
12 fbval_t
*bitmap
, int *rows
, int *cols
)
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
));
46 int doc_pages(struct doc
*doc
)
48 return poppler_document_get_n_pages(doc
->doc
);
51 struct doc
*doc_open(char *path
)
53 struct doc
*doc
= malloc(sizeof(*doc
));
54 char abspath
[PATH_MAX
];
55 char uri
[PATH_MAX
+ 16];
56 realpath(path
, abspath
);
57 snprintf(uri
, sizeof(uri
), "file://%s", abspath
);
59 doc
->doc
= poppler_document_new_from_file(uri
, NULL
, NULL
);
63 void doc_close(struct doc
*doc
)
65 g_object_unref(G_OBJECT(doc
->doc
));