9 fz_glyphcache
*glyphcache
;
13 int doc_draw(struct doc
*doc
, fbval_t
*bitmap
, int p
, int rows
, int cols
, int zoom
, int rotate
)
24 pageobj
= pdf_getpageobject(doc
->xref
, p
);
25 if (pdf_loadpage(&page
, doc
->xref
, pageobj
))
27 list
= fz_newdisplaylist();
28 dev
= fz_newlistdevice(list
);
29 if (pdf_runpage(doc
->xref
, page
, dev
, fz_identity
))
33 ctm
= fz_translate(0, -page
->mediabox
.y1
);
34 ctm
= fz_concat(ctm
, fz_scale((float) zoom
/ 10, (float) -zoom
/ 10));
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
);
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]);
56 fz_freedisplaylist(list
);
58 pdf_agestore(doc
->xref
->store
, 3);
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
));
71 doc
->glyphcache
= fz_newglyphcache();
72 if (pdf_openxref(&doc
->xref
, path
, NULL
)) {
76 if (pdf_loadpagetree(doc
->xref
)) {
83 void doc_close(struct doc
*doc
)
85 pdf_freexref(doc
->xref
);
86 fz_freeglyphcache(doc
->glyphcache
);