summaryrefslogtreecommitdiff
path: root/apps/pdfdraw.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/pdfdraw.c')
-rw-r--r--apps/pdfdraw.c612
1 files changed, 306 insertions, 306 deletions
diff --git a/apps/pdfdraw.c b/apps/pdfdraw.c
index 22122e73..f6fdd6bd 100644
--- a/apps/pdfdraw.c
+++ b/apps/pdfdraw.c
@@ -18,12 +18,12 @@ enum { DRAWPNM, DRAWTXT, DRAWXML };
struct benchmark
{
- int pages;
- long min;
- int minpage;
- long avg;
- long max;
- int maxpage;
+ int pages;
+ long min;
+ int minpage;
+ long avg;
+ long max;
+ int maxpage;
};
static fz_renderer *drawgc = nil;
@@ -39,392 +39,392 @@ static int benchmark = 0;
static void local_cleanup(void)
{
- if (xref && xref->store)
- {
- pdf_dropstore(xref->store);
- xref->store = nil;
- }
-
- if (drawgc)
- {
- fz_droprenderer(drawgc);
- drawgc = nil;
- }
+ if (xref && xref->store)
+ {
+ pdf_dropstore(xref->store);
+ xref->store = nil;
+ }
+
+ if (drawgc)
+ {
+ fz_droprenderer(drawgc);
+ drawgc = nil;
+ }
}
static void drawusage(void)
{
- fprintf(stderr,
- "usage: pdfdraw [options] [file.pdf pages ... ]\n"
- " -b -\tdraw page in N bands\n"
- " -d -\tpassword for decryption\n"
- " -o -\tpattern (%%d for page number) for output file\n"
- " -r -\tresolution in dpi\n"
- " -t \tutf-8 text output instead of graphics\n"
- " -x \txml dump of display tree\n"
- " -m \tprint benchmark results\n"
- " example:\n"
- " pdfdraw -o output%%03d.pnm input.pdf 1-3,5,9-\n");
- exit(1);
+ fprintf(stderr,
+ "usage: pdfdraw [options] [file.pdf pages ... ]\n"
+ " -b -\tdraw page in N bands\n"
+ " -d -\tpassword for decryption\n"
+ " -o -\tpattern (%%d for page number) for output file\n"
+ " -r -\tresolution in dpi\n"
+ " -t \tutf-8 text output instead of graphics\n"
+ " -x \txml dump of display tree\n"
+ " -m \tprint benchmark results\n"
+ " example:\n"
+ " pdfdraw -o output%%03d.pnm input.pdf 1-3,5,9-\n");
+ exit(1);
}
static void gettime(long *time_)
{
- struct timeval tv;
+ struct timeval tv;
- if (gettimeofday(&tv, NULL) < 0)
- abort();
+ if (gettimeofday(&tv, NULL) < 0)
+ abort();
- *time_ = tv.tv_sec * 1000000 + tv.tv_usec;
+ *time_ = tv.tv_sec * 1000000 + tv.tv_usec;
}
static void drawloadpage(int pagenum, struct benchmark *loadtimes)
{
- fz_error error;
- fz_obj *pageobj;
- long start;
- long end;
- long elapsed;
-
- fprintf(stderr, "draw %s:%03d ", basename, pagenum);
- if (benchmark && loadtimes)
- {
- fflush(stderr);
- gettime(&start);
- }
-
- pageobj = pdf_getpageobject(xref, pagenum);
- error = pdf_loadpage(&drawpage, xref, pageobj);
- if (error)
- die(error);
-
- if (benchmark && loadtimes)
- {
- gettime(&end);
- elapsed = end - start;
-
- if (elapsed < loadtimes->min)
+ fz_error error;
+ fz_obj *pageobj;
+ long start;
+ long end;
+ long elapsed;
+
+ fprintf(stderr, "draw %s:%03d ", basename, pagenum);
+ if (benchmark && loadtimes)
{
- loadtimes->min = elapsed;
- loadtimes->minpage = pagenum;
+ fflush(stderr);
+ gettime(&start);
}
- if (elapsed > loadtimes->max)
+
+ pageobj = pdf_getpageobject(xref, pagenum);
+ error = pdf_loadpage(&drawpage, xref, pageobj);
+ if (error)
+ die(error);
+
+ if (benchmark && loadtimes)
{
- loadtimes->max = elapsed;
- loadtimes->maxpage = pagenum;
+ gettime(&end);
+ elapsed = end - start;
+
+ if (elapsed < loadtimes->min)
+ {
+ loadtimes->min = elapsed;
+ loadtimes->minpage = pagenum;
+ }
+ if (elapsed > loadtimes->max)
+ {
+ loadtimes->max = elapsed;
+ loadtimes->maxpage = pagenum;
+ }
+ loadtimes->avg += elapsed;
+ loadtimes->pages++;
}
- loadtimes->avg += elapsed;
- loadtimes->pages++;
- }
- if (benchmark)
- fflush(stderr);
+ if (benchmark)
+ fflush(stderr);
}
static void drawfreepage(void)
{
- pdf_droppage(drawpage);
- drawpage = nil;
-
- /* Flush resources between pages.
- * TODO: should check memory usage before deciding to do this.
- */
- if (xref && xref->store)
- {
- /* pdf_debugstore(xref->store); */
- pdf_agestoreditems(xref->store);
- pdf_evictageditems(xref->store);
- fflush(stderr);
- }
+ pdf_droppage(drawpage);
+ drawpage = nil;
+
+ /* Flush resources between pages.
+ * TODO: should check memory usage before deciding to do this.
+ */
+ if (xref && xref->store)
+ {
+ /* pdf_debugstore(xref->store); */
+ pdf_agestoreditems(xref->store);
+ pdf_evictageditems(xref->store);
+ fflush(stderr);
+ }
}
static void drawpnm(int pagenum, struct benchmark *loadtimes, struct benchmark *drawtimes)
{
- fz_error error;
- fz_matrix ctm;
- fz_irect bbox;
- fz_pixmap *pix;
- char name[256];
- char pnmhdr[256];
- int i, x, y, w, h, b, bh;
- int fd = -1;
- long start;
- long end;
- long elapsed;
-
- fz_md5 digest;
-
- fz_md5init(&digest);
-
- drawloadpage(pagenum, loadtimes);
-
- if (benchmark)
- gettime(&start);
-
- ctm = fz_identity();
- ctm = fz_concat(ctm, fz_translate(0, -drawpage->mediabox.y1));
- ctm = fz_concat(ctm, fz_scale(drawzoom, -drawzoom));
- ctm = fz_concat(ctm, fz_rotate(drawrotate + drawpage->rotate));
-
- bbox = fz_roundrect(fz_transformaabb(ctm, drawpage->mediabox));
- w = bbox.x1 - bbox.x0;
- h = bbox.y1 - bbox.y0;
- bh = h / drawbands;
-
- if (drawpattern)
- {
- sprintf(name, drawpattern, drawcount++);
- fd = open(name, O_BINARY|O_WRONLY|O_CREAT|O_TRUNC, 0666);
- if (fd < 0)
- die(fz_throw("ioerror: could not open file '%s'", name));
-
- sprintf(pnmhdr, "P6\n%d %d\n255\n", w, h);
- write(fd, pnmhdr, strlen(pnmhdr));
- }
-
- error = fz_newpixmap(&pix, bbox.x0, bbox.y0, w, bh, 4);
- if (error)
- die(error);
-
- memset(pix->samples, 0xff, pix->h * pix->w * pix->n);
-
- for (b = 0; b < drawbands; b++)
- {
- if (drawbands > 1)
- fprintf(stderr, "drawing band %d / %d\n", b + 1, drawbands);
-
- error = fz_rendertreeover(drawgc, pix, drawpage->tree, ctm);
- if (error)
- die(error);
+ fz_error error;
+ fz_matrix ctm;
+ fz_irect bbox;
+ fz_pixmap *pix;
+ char name[256];
+ char pnmhdr[256];
+ int i, x, y, w, h, b, bh;
+ int fd = -1;
+ long start;
+ long end;
+ long elapsed;
- if (drawpattern)
- {
- for (y = 0; y < pix->h; y++)
- {
- unsigned char *src = pix->samples + y * pix->w * 4;
- unsigned char *dst = src;
+ fz_md5 digest;
- for (x = 0; x < pix->w; x++)
- {
- dst[x * 3 + 0] = src[x * 4 + 1];
- dst[x * 3 + 1] = src[x * 4 + 2];
- dst[x * 3 + 2] = src[x * 4 + 3];
- }
+ fz_md5init(&digest);
+
+ drawloadpage(pagenum, loadtimes);
+
+ if (benchmark)
+ gettime(&start);
+
+ ctm = fz_identity();
+ ctm = fz_concat(ctm, fz_translate(0, -drawpage->mediabox.y1));
+ ctm = fz_concat(ctm, fz_scale(drawzoom, -drawzoom));
+ ctm = fz_concat(ctm, fz_rotate(drawrotate + drawpage->rotate));
- write(fd, dst, pix->w * 3);
+ bbox = fz_roundrect(fz_transformaabb(ctm, drawpage->mediabox));
+ w = bbox.x1 - bbox.x0;
+ h = bbox.y1 - bbox.y0;
+ bh = h / drawbands;
- memset(src, 0xff, pix->w * 4);
- }
+ if (drawpattern)
+ {
+ sprintf(name, drawpattern, drawcount++);
+ fd = open(name, O_BINARY|O_WRONLY|O_CREAT|O_TRUNC, 0666);
+ if (fd < 0)
+ die(fz_throw("ioerror: could not open file '%s'", name));
+
+ sprintf(pnmhdr, "P6\n%d %d\n255\n", w, h);
+ write(fd, pnmhdr, strlen(pnmhdr));
}
- fz_md5update(&digest, pix->samples, pix->h * pix->w * 4);
+ error = fz_newpixmap(&pix, bbox.x0, bbox.y0, w, bh, 4);
+ if (error)
+ die(error);
- pix->y += bh;
- if (pix->y + pix->h > bbox.y1)
- pix->h = bbox.y1 - pix->y;
- }
+ memset(pix->samples, 0xff, pix->h * pix->w * pix->n);
- fz_droppixmap(pix);
+ for (b = 0; b < drawbands; b++)
+ {
+ if (drawbands > 1)
+ fprintf(stderr, "drawing band %d / %d\n", b + 1, drawbands);
- {
- unsigned char buf[16];
- fz_md5final(&digest, buf);
- for (i = 0; i < 16; i++)
- fprintf(stderr, "%02x", buf[i]);
- }
+ error = fz_rendertreeover(drawgc, pix, drawpage->tree, ctm);
+ if (error)
+ die(error);
- if (drawpattern)
- close(fd);
+ if (drawpattern)
+ {
+ for (y = 0; y < pix->h; y++)
+ {
+ unsigned char *src = pix->samples + y * pix->w * 4;
+ unsigned char *dst = src;
+
+ for (x = 0; x < pix->w; x++)
+ {
+ dst[x * 3 + 0] = src[x * 4 + 1];
+ dst[x * 3 + 1] = src[x * 4 + 2];
+ dst[x * 3 + 2] = src[x * 4 + 3];
+ }
+
+ write(fd, dst, pix->w * 3);
+
+ memset(src, 0xff, pix->w * 4);
+ }
+ }
- drawfreepage();
+ fz_md5update(&digest, pix->samples, pix->h * pix->w * 4);
+
+ pix->y += bh;
+ if (pix->y + pix->h > bbox.y1)
+ pix->h = bbox.y1 - pix->y;
+ }
- if (benchmark)
- {
- gettime(&end);
- elapsed = end - start;
+ fz_droppixmap(pix);
- if (elapsed < drawtimes->min)
{
- drawtimes->min = elapsed;
- drawtimes->minpage = pagenum;
+ unsigned char buf[16];
+ fz_md5final(&digest, buf);
+ for (i = 0; i < 16; i++)
+ fprintf(stderr, "%02x", buf[i]);
}
- if (elapsed > drawtimes->max)
+
+ if (drawpattern)
+ close(fd);
+
+ drawfreepage();
+
+ if (benchmark)
{
- drawtimes->max = elapsed;
- drawtimes->maxpage = pagenum;
- }
- drawtimes->avg += elapsed;
- drawtimes->pages++;
+ gettime(&end);
+ elapsed = end - start;
+
+ if (elapsed < drawtimes->min)
+ {
+ drawtimes->min = elapsed;
+ drawtimes->minpage = pagenum;
+ }
+ if (elapsed > drawtimes->max)
+ {
+ drawtimes->max = elapsed;
+ drawtimes->maxpage = pagenum;
+ }
+ drawtimes->avg += elapsed;
+ drawtimes->pages++;
- fprintf(stderr, " time %.3fs",
- elapsed / 1000000.0);
- }
+ fprintf(stderr, " time %.3fs",
+ elapsed / 1000000.0);
+ }
- fprintf(stderr, "\n");
+ fprintf(stderr, "\n");
}
static void drawtxt(int pagenum)
{
- fz_error error;
- pdf_textline *line;
- fz_matrix ctm;
+ fz_error error;
+ pdf_textline *line;
+ fz_matrix ctm;
- drawloadpage(pagenum, NULL);
+ drawloadpage(pagenum, NULL);
- ctm = fz_concat(
- fz_translate(0, -drawpage->mediabox.y1),
- fz_scale(drawzoom, -drawzoom));
+ ctm = fz_concat(
+ fz_translate(0, -drawpage->mediabox.y1),
+ fz_scale(drawzoom, -drawzoom));
- error = pdf_loadtextfromtree(&line, drawpage->tree, ctm);
- if (error)
- die(error);
+ error = pdf_loadtextfromtree(&line, drawpage->tree, ctm);
+ if (error)
+ die(error);
- pdf_debugtextline(line);
- pdf_droptextline(line);
+ pdf_debugtextline(line);
+ pdf_droptextline(line);
- drawfreepage();
+ drawfreepage();
}
static void drawxml(int pagenum)
{
- drawloadpage(pagenum, NULL);
- fz_debugtree(drawpage->tree);
- drawfreepage();
+ drawloadpage(pagenum, NULL);
+ fz_debugtree(drawpage->tree);
+ drawfreepage();
}
static void drawpages(char *pagelist)
{
- int page, spage, epage;
- char *spec, *dash;
- struct benchmark loadtimes, drawtimes;
-
- if (!xref)
- drawusage();
-
- if (benchmark)
- {
- memset(&loadtimes, 0x00, sizeof (loadtimes));
- loadtimes.min = LONG_MAX;
- memset(&drawtimes, 0x00, sizeof (drawtimes));
- drawtimes.min = LONG_MAX;
- }
-
- spec = strsep(&pagelist, ",");
- while (spec)
- {
- dash = strchr(spec, '-');
-
- if (dash == spec)
- spage = epage = 1;
- else
- spage = epage = atoi(spec);
-
- if (dash)
- {
- if (strlen(dash) > 1)
- epage = atoi(dash + 1);
- else
- epage = pagecount;
- }
-
- if (spage > epage)
- page = spage, spage = epage, epage = page;
+ int page, spage, epage;
+ char *spec, *dash;
+ struct benchmark loadtimes, drawtimes;
- if (spage < 1)
- spage = 1;
- if (epage > pagecount)
- epage = pagecount;
+ if (!xref)
+ drawusage();
- printf("Drawing pages %d-%d...\n", spage, epage);
- for (page = spage; page <= epage; page++)
+ if (benchmark)
{
- switch (drawmode)
- {
- case DRAWPNM: drawpnm(page, &loadtimes, &drawtimes); break;
- case DRAWTXT: drawtxt(page); break;
- case DRAWXML: drawxml(page); break;
- }
+ memset(&loadtimes, 0x00, sizeof (loadtimes));
+ loadtimes.min = LONG_MAX;
+ memset(&drawtimes, 0x00, sizeof (drawtimes));
+ drawtimes.min = LONG_MAX;
}
spec = strsep(&pagelist, ",");
- }
+ while (spec)
+ {
+ dash = strchr(spec, '-');
+
+ if (dash == spec)
+ spage = epage = 1;
+ else
+ spage = epage = atoi(spec);
+
+ if (dash)
+ {
+ if (strlen(dash) > 1)
+ epage = atoi(dash + 1);
+ else
+ epage = pagecount;
+ }
+
+ if (spage > epage)
+ page = spage, spage = epage, epage = page;
+
+ if (spage < 1)
+ spage = 1;
+ if (epage > pagecount)
+ epage = pagecount;
- if (benchmark)
- {
- if (loadtimes.pages > 0)
+ printf("Drawing pages %d-%d...\n", spage, epage);
+ for (page = spage; page <= epage; page++)
+ {
+ switch (drawmode)
+ {
+ case DRAWPNM: drawpnm(page, &loadtimes, &drawtimes); break;
+ case DRAWTXT: drawtxt(page); break;
+ case DRAWXML: drawxml(page); break;
+ }
+ }
+
+ spec = strsep(&pagelist, ",");
+ }
+
+ if (benchmark)
{
- loadtimes.avg /= loadtimes.pages;
- drawtimes.avg /= drawtimes.pages;
-
- printf("benchmark[load]: min: %6.3fs (page % 4d), avg: %6.3fs, max: %6.3fs (page % 4d)\n",
- loadtimes.min / 1000000.0, loadtimes.minpage,
- loadtimes.avg / 1000000.0,
- loadtimes.max / 1000000.0, loadtimes.maxpage);
- printf("benchmark[draw]: min: %6.3fs (page % 4d), avg: %6.3fs, max: %6.3fs (page % 4d)\n",
- drawtimes.min / 1000000.0, drawtimes.minpage,
- drawtimes.avg / 1000000.0,
- drawtimes.max / 1000000.0, drawtimes.maxpage);
+ if (loadtimes.pages > 0)
+ {
+ loadtimes.avg /= loadtimes.pages;
+ drawtimes.avg /= drawtimes.pages;
+
+ printf("benchmark[load]: min: %6.3fs (page % 4d), avg: %6.3fs, max: %6.3fs (page % 4d)\n",
+ loadtimes.min / 1000000.0, loadtimes.minpage,
+ loadtimes.avg / 1000000.0,
+ loadtimes.max / 1000000.0, loadtimes.maxpage);
+ printf("benchmark[draw]: min: %6.3fs (page % 4d), avg: %6.3fs, max: %6.3fs (page % 4d)\n",
+ drawtimes.min / 1000000.0, drawtimes.minpage,
+ drawtimes.avg / 1000000.0,
+ drawtimes.max / 1000000.0, drawtimes.maxpage);
+ }
}
- }
}
int main(int argc, char **argv)
{
- fz_error error;
- char *password = "";
- int c;
- enum { NO_FILE_OPENED, NO_PAGES_DRAWN, DREW_PAGES } state;
-
- while ((c = fz_getopt(argc, argv, "b:d:o:r:txm")) != -1)
- {
- switch (c)
+ fz_error error;
+ char *password = "";
+ int c;
+ enum { NO_FILE_OPENED, NO_PAGES_DRAWN, DREW_PAGES } state;
+
+ while ((c = fz_getopt(argc, argv, "b:d:o:r:txm")) != -1)
{
- case 'b': drawbands = atoi(fz_optarg); break;
- case 'd': password = fz_optarg; break;
- case 'o': drawpattern = fz_optarg; break;
- case 'r': drawzoom = atof(fz_optarg) / 72.0; break;
- case 't': drawmode = DRAWTXT; break;
- case 'x': drawmode = DRAWXML; break;
- case 'm': benchmark = 1; break;
- default:
- drawusage();
- break;
+ switch (c)
+ {
+ case 'b': drawbands = atoi(fz_optarg); break;
+ case 'd': password = fz_optarg; break;
+ case 'o': drawpattern = fz_optarg; break;
+ case 'r': drawzoom = atof(fz_optarg) / 72.0; break;
+ case 't': drawmode = DRAWTXT; break;
+ case 'x': drawmode = DRAWXML; break;
+ case 'm': benchmark = 1; break;
+ default:
+ drawusage();
+ break;
+ }
}
- }
- if (fz_optind == argc)
- drawusage();
+ if (fz_optind == argc)
+ drawusage();
- setcleanup(local_cleanup);
+ setcleanup(local_cleanup);
- state = NO_FILE_OPENED;
- while (fz_optind < argc)
- {
- if (strstr(argv[fz_optind], ".pdf") || strstr(argv[fz_optind], ".PDF"))
+ state = NO_FILE_OPENED;
+ while (fz_optind < argc)
{
- if (state == NO_PAGES_DRAWN)
- drawpages("1-");
+ if (strstr(argv[fz_optind], ".pdf") || strstr(argv[fz_optind], ".PDF"))
+ {
+ if (state == NO_PAGES_DRAWN)
+ drawpages("1-");
- closexref();
+ closexref();
- error = fz_newrenderer(&drawgc, pdf_devicergb, 0, 1024 * 512);
- if (error)
- die(error);
+ error = fz_newrenderer(&drawgc, pdf_devicergb, 0, 1024 * 512);
+ if (error)
+ die(error);
- openxref(argv[fz_optind], password, 0);
- state = NO_PAGES_DRAWN;
- }
- else
- {
- drawpages(argv[fz_optind]);
- state = DREW_PAGES;
+ openxref(argv[fz_optind], password, 0);
+ state = NO_PAGES_DRAWN;
+ }
+ else
+ {
+ drawpages(argv[fz_optind]);
+ state = DREW_PAGES;
+ }
+ fz_optind++;
}
- fz_optind++;
- }
- if (state == NO_PAGES_DRAWN)
- drawpages("1-");
+ if (state == NO_PAGES_DRAWN)
+ drawpages("1-");
- closexref();
+ closexref();
}