mupdf: support mupdf-1.2
[fbpdf.git] / mupdf.c
blob089b7882a94530271e4ec7a27970fcced178c325
1 #include <stdlib.h>
2 #include <string.h>
3 #include "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 int doc_draw(struct doc *doc, int p, int zoom, int rotate,
15 fbval_t *bitmap, int *rows, int *cols)
17 fz_matrix ctm; /* transform */
18 fz_rect rect; /* bounds */
19 fz_irect bbox; /* drawing bbox */
20 fz_pixmap *pix;
21 fz_device *dev;
22 fz_page *page;
23 int h, w;
24 int x, y;
26 if (!(page = fz_load_page(doc->pdf, p - 1)))
27 return 1;
28 fz_rotate(&ctm, rotate);
29 fz_pre_scale(&ctm, (float) zoom / 10, (float) zoom / 10);
30 fz_bound_page(doc->pdf, page, &rect);
31 fz_transform_rect(&rect, &ctm);
32 fz_round_rect(&bbox, &rect);
33 w = MIN_(*cols, rect.x1 - rect.x0);
34 h = MIN_(*rows, rect.y1 - rect.y0);
36 pix = fz_new_pixmap_with_bbox(doc->ctx, fz_device_rgb, &bbox);
37 fz_clear_pixmap_with_value(doc->ctx, pix, 0xff);
39 dev = fz_new_draw_device(doc->ctx, pix);
40 fz_run_page(doc->pdf, page, dev, &ctm, NULL);
41 fz_free_device(dev);
43 for (y = 0; y < h; y++) {
44 int xs = y * *cols + (*cols - w) / 2;
45 for (x = 0; x < w; x++) {
46 unsigned char *s = fz_pixmap_samples(doc->ctx, pix) +
47 y * fz_pixmap_width(doc->ctx, pix) * 4 + x * 4;
48 bitmap[xs + x] = FB_VAL(s[0], s[1], s[2]);
52 fz_drop_pixmap(doc->ctx, pix);
53 fz_free_page(doc->pdf, page);
54 *cols = w;
55 *rows = h;
56 return 0;
59 int doc_pages(struct doc *doc)
61 return fz_count_pages(doc->pdf);
64 struct doc *doc_open(char *path)
66 struct doc *doc = malloc(sizeof(*doc));
67 doc->ctx = fz_new_context(NULL, NULL, FZ_STORE_DEFAULT);
68 doc->pdf = fz_open_document(doc->ctx, path);
69 if (!doc->pdf || !fz_count_pages(doc->pdf)) {
70 free(doc);
71 return NULL;
73 return doc;
76 void doc_close(struct doc *doc)
78 fz_close_document(doc->pdf);
79 fz_free_context(doc->ctx);
80 free(doc);