3 #include "mupdf/fitz.h"
7 #define MIN_(a, b) ((a) < (b) ? (a) : (b))
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 */
26 if (!(page
= fz_load_page(doc
->pdf
, p
- 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(doc
->ctx
), &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
);
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
);
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 fz_register_document_handlers(doc
->ctx
);
70 doc
->pdf
= fz_open_document(doc
->ctx
, path
);
71 } fz_catch (doc
->ctx
) {
72 fz_free_context(doc
->ctx
);
79 void doc_close(struct doc
*doc
)
81 fz_close_document(doc
->pdf
);
82 fz_free_context(doc
->ctx
);