diff options
author | Tor Andersson <tor@ghostscript.com> | 2010-06-23 16:34:10 +0200 |
---|---|---|
committer | Tor Andersson <tor@ghostscript.com> | 2010-06-23 16:34:10 +0200 |
commit | 36ebeab4e529ee3b3c56fe81f6d02ebf6d7476f4 (patch) | |
tree | 0897eb2ef07857968ac5cbfa85f82b9eef2b330a /apps | |
parent | 3bc38ed4ce6bc193a492f2521a1723d851213f55 (diff) | |
download | mupdf-36ebeab4e529ee3b3c56fe81f6d02ebf6d7476f4.tar.xz |
Automatically switch to using bands if the resulting image size is too large in pdfdraw.
Diffstat (limited to 'apps')
-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) |