diff options
Diffstat (limited to 'apps/pdfdraw.c')
-rw-r--r-- | apps/pdfdraw.c | 47 |
1 files changed, 39 insertions, 8 deletions
diff --git a/apps/pdfdraw.c b/apps/pdfdraw.c index f7bd35be..e4ceebb2 100644 --- a/apps/pdfdraw.c +++ b/apps/pdfdraw.c @@ -8,6 +8,8 @@ #include "pdftool.h" +#define MAXBANDSIZE (3 * 1024 * 1024) + #ifdef _MSC_VER #include <winsock2.h> #else @@ -154,6 +156,9 @@ static void drawpnm(int pagenum, struct benchmark *loadtimes, struct benchmark * long end; long elapsed; fz_md5 digest; + int numbands = drawbands; + fz_displaylist *list = nil; + fz_device *dev; if (checksum) fz_md5init(&digest); @@ -171,7 +176,13 @@ static void drawpnm(int pagenum, struct benchmark *loadtimes, struct benchmark * bbox = fz_roundrect(fz_transformrect(ctm, drawpage->mediabox)); w = bbox.x1 - bbox.x0; h = bbox.y1 - bbox.y0; - bh = h / drawbands; + + if (w * h > MAXBANDSIZE) + numbands = (w * h) / MAXBANDSIZE; + if (numbands < 1) + numbands = 1; + + bh = h / numbands; if (drawpattern) { @@ -199,17 +210,34 @@ static void drawpnm(int pagenum, struct benchmark *loadtimes, struct benchmark * memset(pix->samples, 0xff, pix->h * pix->w * pix->n); - for (b = 0; b < drawbands; b++) + if (numbands > 1) { - fz_device *dev; + fprintf(stdout, "creating display list for banded rendering\n"); + list = fz_newdisplaylist(); + dev = fz_newlistdevice(list); + error = pdf_runcontentstream(dev, fz_identity(), xref, drawpage->resources, drawpage->contents); + if (error) + die(fz_rethrow(error, "cannot draw page %d in PDF file '%s'", pagenum, basename)); + fz_freedevice(dev); + } - if (drawbands > 1) - fprintf(stdout, "drawing band %d / %d\n", b + 1, drawbands); + for (b = 0; b < numbands; b++) + { dev = fz_newdrawdevice(drawcache, pix); - error = pdf_runcontentstream(dev, ctm, xref, drawpage->resources, drawpage->contents); - if (error) - die(fz_rethrow(error, "cannot draw page %d in PDF file '%s'", pagenum, basename)); + + if (numbands > 1) + { + fprintf(stdout, "drawing band %d / %d\n", b + 1, numbands); + fz_executedisplaylist(list, dev, ctm); + } + else + { + error = pdf_runcontentstream(dev, ctm, xref, drawpage->resources, drawpage->contents); + if (error) + die(fz_rethrow(error, "cannot draw page %d in PDF file '%s'", pagenum, basename)); + } + fz_freedevice(dev); if (checksum) @@ -258,6 +286,9 @@ static void drawpnm(int pagenum, struct benchmark *loadtimes, struct benchmark * pix->h = bbox.y1 - pix->y; } + if (list) + fz_freedisplaylist(list); + fz_droppixmap(pix); if (checksum) |