mupdf: support mupdf-1.10
[fbpdf.git] / mupdf.c
blobfa1b78bdabff424a2f1d4128f1357f92b8267da3
1 #include <stdlib.h>
2 #include <string.h>
3 #include "mupdf/fitz.h"
4 #include "draw.h"
5 #include "doc.h"
7 #define MIN_(a, b) ((a) < (b) ? (a) : (b))
9 struct doc {
10 fz_context *ctx;
11 fz_document *pdf;
14 void *doc_draw(struct doc *doc, int p, int zoom, int rotate, int *rows, int *cols)
16 fz_matrix ctm;
17 fz_pixmap *pix;
18 fbval_t *pbuf;
19 int x, y;
20 fz_scale(&ctm, (float) zoom / 10, (float) zoom / 10);
21 fz_pre_rotate(&ctm, rotate);
22 pix = fz_new_pixmap_from_page_number(doc->ctx, doc->pdf, p - 1, &ctm, fz_device_rgb(doc->ctx), 0);
23 if (!pix)
24 return NULL;
25 if (!(pbuf = malloc(pix->w * pix->h * sizeof(pbuf[0])))) {
26 fz_drop_pixmap(doc->ctx, pix);
27 return NULL;
29 for (y = 0; y < pix->h; y++) {
30 unsigned char *s = &pix->samples[y * pix->stride];
31 for (x = 0; x < pix->w; x++)
32 pbuf[y * pix->w + x] = FB_VAL(s[x * pix->n + 0],
33 s[x * pix->n + 1], s[x * pix->n + 2]);
35 fz_drop_pixmap(doc->ctx, pix);
36 *cols = pix->w;
37 *rows = pix->h;
38 return pbuf;
41 int doc_pages(struct doc *doc)
43 return fz_count_pages(doc->ctx, doc->pdf);
46 struct doc *doc_open(char *path)
48 struct doc *doc = malloc(sizeof(*doc));
49 doc->ctx = fz_new_context(NULL, NULL, FZ_STORE_DEFAULT);
50 fz_register_document_handlers(doc->ctx);
51 fz_try (doc->ctx) {
52 doc->pdf = fz_open_document(doc->ctx, path);
53 } fz_catch (doc->ctx) {
54 fz_drop_context(doc->ctx);
55 free(doc);
56 return NULL;
58 return doc;
61 void doc_close(struct doc *doc)
63 fz_drop_document(doc->ctx, doc->pdf);
64 fz_drop_context(doc->ctx);
65 free(doc);