draw: draw.c is now independent of framebuffer depth
[fbpdf.git] / doc.c
blobfecbe77703d20b941dee984d4c81c4dcbdadce98
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, int rotate)
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 if (rotate)
36 ctm = fz_concat(ctm, fz_rotate(rotate));
37 bbox = fz_roundrect(fz_transformrect(ctm, page->mediabox));
38 w = bbox.x1 - bbox.x0;
39 h = bbox.y1 - bbox.y0;
41 pix = fz_newpixmapwithrect(fz_devicergb, bbox);
42 fz_clearpixmapwithcolor(pix, 0xff);
44 dev = fz_newdrawdevice(doc->glyphcache, pix);
45 fz_executedisplaylist(list, dev, ctm);
46 fz_freedevice(dev);
48 for (y = 0; y < MIN(pix->h, rows); y++) {
49 for (x = 0; x < MIN(pix->w, cols); x++) {
50 unsigned char *s = pix->samples + y * pix->w * 4 + x * 4;
51 bitmap[y * cols + x] = fb_val(s[0], s[1], s[2]);
55 fz_droppixmap(pix);
56 fz_freedisplaylist(list);
57 pdf_freepage(page);
58 pdf_agestore(doc->xref->store, 3);
59 return 0;
62 int doc_pages(struct doc *doc)
64 return pdf_getpagecount(doc->xref);
67 struct doc *doc_open(char *path)
69 struct doc *doc = malloc(sizeof(*doc));
70 fz_accelerate();
71 doc->glyphcache = fz_newglyphcache();
72 if (pdf_openxref(&doc->xref, path, NULL)) {
73 free(doc);
74 return NULL;
76 if (pdf_loadpagetree(doc->xref)) {
77 free(doc);
78 return NULL;
80 return doc;
83 void doc_close(struct doc *doc)
85 pdf_freexref(doc->xref);
86 fz_freeglyphcache(doc->glyphcache);
87 free(doc);