move mupdf parts to doc.c
[fbpdf.git] / doc.c
blobb31a11cdf4e9ae403c5780aa7694b8e72510940a
1 #include <stdlib.h>
2 #include <string.h>
3 #include "fitz.h"
4 #include "mupdf.h"
5 #include "draw.h"
6 #include "doc.h"
8 struct doc {
9 fz_glyphcache *glyphcache;
10 pdf_xref *xref;
13 int doc_draw(struct doc *doc, fbval_t *bitmap, int p, int rows, int cols, int zoom)
15 fz_matrix ctm;
16 fz_bbox bbox;
17 fz_pixmap *pix;
18 fz_device *dev;
19 fz_obj *pageobj;
20 fz_displaylist *list;
21 pdf_page *page;
22 int x, y, w, h;
24 pageobj = pdf_getpageobject(doc->xref, p);
25 if (pdf_loadpage(&page, doc->xref, pageobj))
26 return 1;
27 list = fz_newdisplaylist();
28 dev = fz_newlistdevice(list);
29 if (pdf_runpage(doc->xref, page, dev, fz_identity))
30 return 1;
31 fz_freedevice(dev);
33 ctm = fz_translate(0, -page->mediabox.y1);
34 ctm = fz_concat(ctm, fz_scale((float) zoom / 10, (float) -zoom / 10));
35 bbox = fz_roundrect(fz_transformrect(ctm, page->mediabox));
36 w = bbox.x1 - bbox.x0;
37 h = bbox.y1 - bbox.y0;
39 pix = fz_newpixmapwithrect(fz_devicergb, bbox);
40 fz_clearpixmap(pix, 0xff);
42 dev = fz_newdrawdevice(doc->glyphcache, pix);
43 fz_executedisplaylist(list, dev, ctm);
44 fz_freedevice(dev);
46 for (y = 0; y < MIN(pix->h, rows); y++) {
47 for (x = 0; x < MIN(pix->w, cols); x++) {
48 unsigned char *s = pix->samples + y * pix->w * 4 + x * 4;
49 bitmap[y * cols + x] = fb_color(s[0], s[1], s[2]);
53 fz_droppixmap(pix);
54 fz_freedisplaylist(list);
55 pdf_freepage(page);
56 pdf_agestore(doc->xref->store, 3);
57 return 0;
60 int doc_pages(struct doc *doc)
62 return pdf_getpagecount(doc->xref);
65 struct doc *doc_open(char *path)
67 struct doc *doc = malloc(sizeof(*doc));
68 fz_accelerate();
69 doc->glyphcache = fz_newglyphcache();
70 if (pdf_openxref(&doc->xref, path, NULL)) {
71 free(doc);
72 return NULL;
74 if (pdf_loadpagetree(doc->xref)) {
75 free(doc);
76 return NULL;
78 return doc;
81 void doc_close(struct doc *doc)
83 pdf_freexref(doc->xref);
84 fz_freeglyphcache(doc->glyphcache);
85 free(doc);