diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/man/mupdfdraw.1 | 78 | ||||
-rw-r--r-- | apps/mubusy.c | 19 | ||||
-rw-r--r-- | apps/mubusy_draw.c (renamed from apps/mubusy_pdfdraw.c) | 2 | ||||
-rw-r--r-- | apps/mubusy_xpsdraw.c | 2 | ||||
-rw-r--r-- | apps/mupdfdraw.c | 489 | ||||
-rw-r--r-- | apps/muxpsdraw.c | 374 |
6 files changed, 8 insertions, 956 deletions
diff --git a/apps/man/mupdfdraw.1 b/apps/man/mupdfdraw.1 deleted file mode 100644 index ea58d570..00000000 --- a/apps/man/mupdfdraw.1 +++ /dev/null @@ -1,78 +0,0 @@ -.TH PDFDRAW 1 "January 27, 2012" -.\" Please adjust this date whenever revising the manpage. -.SH NAME -mupdfdraw \- render PDF documents -.SH SYNOPSIS -.B mupdfdraw -.RI [ options ] -.RI input.pdf -.RI [ pages] -.SH DESCRIPTION -.B mupdfdraw -will render a PDF document to image files. -The supported image formats are: pgm, ppm, pam and png. -Select the pages to be rendered by specifying a comma -separated list of ranges and individual page numbers (for example: 1,5,10-15). -In no pages are specified all the pages will be rendered. -.SH OPTIONS -.TP -.B \-o output -The image format is deduced from the output file name. -Embed %d in the name to indicate the page number (for example: "page%d.png"). -.TP -.B \-p password -Use the specified password if the file is encrypted. -.TP -.B \-r resolution -Render the page at the specified resolution. -The default resolution is 72 dpi. -.TP -.B \-R angle -Rotate clockwise by given number of degrees. -.TP -.B \-a -Save the alpha channel. -The default behavior is to render each page with a white background. -With this option, the page background is transparent. -Only supported for pam and png output formats. -.TP -.B \-g -Render in grayscale. -The default is to render a full color RGB image. -If the output format is pgm or ppm this option is ignored. -.TP -.B \-m -Show timing information. -Take the time it takes for each page to render and print -a summary at the end. -.TP -.B \-5 -Print an MD5 checksum of the rendered image data for each page. -.TP -.B \-t -Print the text contents of each page in UTF-8 encoding. -Give the option twice to print detailed information -about the location of each character in XML format. -.TP -.B \-x -Print the display list used to render each page. -.TP -.B \-A -Disable the use of accelerated functions. -.TP -.B \-G gamma -Gamma correct the output image. -Some typical values are 0.7 or 1.4 to thin or darken text rendering. -.TP -.B \-I -Invert the output image colors. -.TP -.B pages -Comma separated list of ranges to render. -.SH SEE ALSO -.BR mupdf (1), -.BR mupdfclean (1). -.BR mupdfshow (1). -.SH AUTHOR -MuPDF was written by Tor Andersson <tor@ghostscript.com>. -MuPDF is Copyright 2006-2012 Artifex Software, Inc. diff --git a/apps/mubusy.c b/apps/mubusy.c index 0e12d53c..a9df26fa 100644 --- a/apps/mubusy.c +++ b/apps/mubusy.c @@ -7,11 +7,10 @@ #include <string.h> int pdfclean_main(int argc, char *argv[]); -int pdfdraw_main(int argc, char *argv[]); +int draw_main(int argc, char *argv[]); int pdfextract_main(int argc, char *argv[]); int pdfinfo_main(int argc, char *argv[]); int pdfshow_main(int argc, char *argv[]); -int xpsdraw_main(int argc, char *argv[]); static int namematch(const char *end, const char *start, const char *match, int len) @@ -33,8 +32,8 @@ int main(int argc, char **argv) end++; if ((end-4 >= start) && (end[-4] == '.') && (end[-3] == 'e') && (end[-2] == 'x') && (end[-1] == 'e')) end = end-4; - if (namematch(end, start, "mupdfdraw", 9)) - return pdfdraw_main(argc, argv); + if (namematch(end, start, "mupdfdraw", 9) || namematch(end, start, "muxpsdraw", 9) || namematch(end, start, "mudraw", 6)) + return draw_main(argc, argv); if (namematch(end, start, "mupdfclean", 10)) return pdfclean_main(argc, argv); if (namematch(end, start, "mupdfextract", 12)) @@ -43,11 +42,9 @@ int main(int argc, char **argv) return pdfshow_main(argc, argv); if (namematch(end, start, "mupdfinfo", 9)) return pdfinfo_main(argc, argv); - if (namematch(end, start, "muxpsdraw", 9)) - return xpsdraw_main(argc, argv); /* And include old names for backward compatibility */ - if (namematch(end, start, "pdfdraw", 7)) - return pdfdraw_main(argc, argv); + if (namematch(end, start, "pdfdraw", 7) || namematch(end, start, "xpsdraw", 7)) + return draw_main(argc, argv); if (namematch(end, start, "pdfclean", 8)) return pdfclean_main(argc, argv); if (namematch(end, start, "pdfextract", 10)) @@ -56,12 +53,10 @@ int main(int argc, char **argv) return pdfshow_main(argc, argv); if (namematch(end, start, "pdfinfo", 7)) return pdfinfo_main(argc, argv); - if (namematch(end, start, "xpsdraw", 7)) - return xpsdraw_main(argc, argv); - fprintf(stderr, "mubusy: Combined build of mupdf/muxps tools.\n\n"); + fprintf(stderr, "mubusy: Combined build of mupdf/mudraw tools.\n\n"); fprintf(stderr, "Invoke as one of the following:\n"); - fprintf(stderr, "\tpdfclean, pdfdraw, pdfextract, pdfinfo, pdfshow, xpsdraw.\n"); + fprintf(stderr, "\tmupdfclean, mudraw, mupdfextract, mupdfinfo, mupdfshow.\n"); return 0; } diff --git a/apps/mubusy_pdfdraw.c b/apps/mubusy_draw.c index aadde1c9..26b9bd6d 100644 --- a/apps/mubusy_pdfdraw.c +++ b/apps/mubusy_draw.c @@ -1,2 +1,2 @@ #define MUPDF_COMBINED_EXE -#include "mupdfdraw.c" +#include "mudraw.c" diff --git a/apps/mubusy_xpsdraw.c b/apps/mubusy_xpsdraw.c deleted file mode 100644 index 9e2f8b87..00000000 --- a/apps/mubusy_xpsdraw.c +++ /dev/null @@ -1,2 +0,0 @@ -#define MUPDF_COMBINED_EXE -#include "muxpsdraw.c" diff --git a/apps/mupdfdraw.c b/apps/mupdfdraw.c deleted file mode 100644 index 7100f5c1..00000000 --- a/apps/mupdfdraw.c +++ /dev/null @@ -1,489 +0,0 @@ -/* - * pdfdraw -- command line tool for drawing pdf documents - */ - -#include "fitz.h" -#include "mupdf.h" - -#ifdef _MSC_VER -#include <winsock2.h> -#else -#include <sys/time.h> -#endif - -static char *output = NULL; -static float resolution = 72; -static float rotation = 0; - -static int showxml = 0; -static int showtext = 0; -static int showtime = 0; -static int showmd5 = 0; -static int showoutline = 0; -static int savealpha = 0; -static int uselist = 1; -static int alphabits = 8; -static float gamma_value = 1; -static int invert = 0; - -static fz_colorspace *colorspace; -static char *filename; - -static struct { - int count, total; - int min, max; - int minpage, maxpage; -} timing; - -static void usage(void) -{ - fprintf(stderr, - "usage: pdfdraw [options] input.pdf [pages]\n" - "\t-o -\toutput filename (%%d for page number)\n" - "\t\tsupported formats: pgm, ppm, pam, png, pbm\n" - "\t-p -\tpassword\n" - "\t-r -\tresolution in dpi (default: 72)\n" - "\t-a\tsave alpha channel (only pam and png)\n" - "\t-b -\tnumber of bits of antialiasing (0 to 8)\n" - "\t-g\trender in grayscale\n" - "\t-m\tshow timing information\n" - "\t-t\tshow text (-tt for xml)\n" - "\t-x\tshow display list\n" - "\t-d\tdisable use of display list\n" - "\t-5\tshow md5 checksums\n" - "\t-R -\trotate clockwise by given number of degrees\n" - "\t-G gamma\tgamma correct output\n" - "\t-I\tinvert output\n" - "\t-l\tprint outline\n" - "\tpages\tcomma separated list of ranges\n"); - exit(1); -} - -static int gettime(void) -{ - static struct timeval first; - static int once = 1; - struct timeval now; - if (once) - { - gettimeofday(&first, NULL); - once = 0; - } - gettimeofday(&now, NULL); - return (now.tv_sec - first.tv_sec) * 1000 + (now.tv_usec - first.tv_usec) / 1000; -} - -static int isrange(char *s) -{ - while (*s) - { - if ((*s < '0' || *s > '9') && *s != '-' && *s != ',') - return 0; - s++; - } - return 1; -} - -static void drawpage(pdf_document *doc, int pagenum) -{ - pdf_page *page; - fz_display_list *list = NULL; - fz_device *dev = NULL; - int start; - fz_context *ctx = doc->ctx; - - fz_var(list); - fz_var(dev); - - if (showtime) - { - start = gettime(); - } - - fz_try(ctx) - { - page = pdf_load_page(doc, pagenum - 1); - } - fz_catch(ctx) - { - fz_throw(ctx, "cannot load page %d in file '%s'", pagenum, filename); - } - - if (uselist) - { - fz_try(ctx) - { - list = fz_new_display_list(ctx); - dev = fz_new_list_device(ctx, list); - pdf_run_page(doc, page, dev, fz_identity, NULL); - } - fz_catch(ctx) - { - fz_free_device(dev); - fz_free_display_list(ctx, list); - pdf_free_page(doc, page); - fz_throw(ctx, "cannot draw page %d in file '%s'", pagenum, filename); - } - fz_free_device(dev); - dev = NULL; - } - - if (showxml) - { - fz_try(ctx) - { - dev = fz_new_trace_device(ctx); - printf("<page number=\"%d\">\n", pagenum); - if (list) - fz_run_display_list(list, dev, fz_identity, fz_infinite_bbox, NULL); - else - pdf_run_page(doc, page, dev, fz_identity, NULL); - printf("</page>\n"); - } - fz_catch(ctx) - { - fz_free_device(dev); - fz_free_display_list(ctx, list); - pdf_free_page(doc, page); - fz_rethrow(ctx); - } - fz_free_device(dev); - dev = NULL; - } - - if (showtext) - { - fz_text_span *text = NULL; - - fz_var(text); - - fz_try(ctx) - { - text = fz_new_text_span(ctx); - dev = fz_new_text_device(ctx, text); - if (list) - fz_run_display_list(list, dev, fz_identity, fz_infinite_bbox, NULL); - else - pdf_run_page(doc, page, dev, fz_identity, NULL); - fz_free_device(dev); - dev = NULL; - printf("[Page %d]\n", pagenum); - if (showtext > 1) - fz_debug_text_span_xml(text); - else - fz_debug_text_span(text); - printf("\n"); - } - fz_catch(ctx) - { - fz_free_device(dev); - fz_free_text_span(ctx, text); - fz_free_display_list(ctx, list); - pdf_free_page(doc, page); - fz_rethrow(ctx); - } - fz_free_text_span(ctx, text); - } - - if (showmd5 || showtime) - printf("page %s %d", filename, pagenum); - - if (output || showmd5 || showtime) - { - float zoom; - fz_matrix ctm; - fz_rect bounds; - fz_bbox bbox; - fz_pixmap *pix = NULL; - - fz_var(pix); - - bounds = pdf_bound_page(doc, page); - zoom = resolution / 72; - ctm = fz_scale(zoom, zoom); - ctm = fz_concat(ctm, fz_rotate(rotation)); - bbox = fz_round_rect(fz_transform_rect(ctm, bounds)); - - /* TODO: banded rendering and multi-page ppm */ - - fz_try(ctx) - { - pix = fz_new_pixmap_with_rect(ctx, colorspace, bbox); - - if (savealpha) - fz_clear_pixmap(ctx, pix); - else - fz_clear_pixmap_with_value(ctx, pix, 255); - - dev = fz_new_draw_device(ctx, pix); - if (list) - fz_run_display_list(list, dev, ctm, bbox, NULL); - else - pdf_run_page(doc, page, dev, ctm, NULL); - fz_free_device(dev); - dev = NULL; - - if (invert) - fz_invert_pixmap(ctx, pix); - if (gamma_value != 1) - fz_gamma_pixmap(ctx, pix, gamma_value); - - if (savealpha) - fz_unmultiply_pixmap(ctx, pix); - - if (output) - { - char buf[512]; - sprintf(buf, output, pagenum); - if (strstr(output, ".pgm") || strstr(output, ".ppm") || strstr(output, ".pnm")) - fz_write_pnm(ctx, pix, buf); - else if (strstr(output, ".pam")) - fz_write_pam(ctx, pix, buf, savealpha); - else if (strstr(output, ".png")) - fz_write_png(ctx, pix, buf, savealpha); - else if (strstr(output, ".pbm")) { - fz_halftone *ht = fz_get_default_halftone(ctx, 1); - fz_bitmap *bit = fz_halftone_pixmap(ctx, pix, ht); - fz_write_pbm(ctx, bit, buf); - fz_drop_bitmap(ctx, bit); - fz_drop_halftone(ctx, ht); - } - } - - if (showmd5) - { - fz_md5 md5; - unsigned char digest[16]; - int i; - - fz_md5_init(&md5); - fz_md5_update(&md5, pix->samples, pix->w * pix->h * pix->n); - fz_md5_final(&md5, digest); - - printf(" "); - for (i = 0; i < 16; i++) - printf("%02x", digest[i]); - } - - fz_drop_pixmap(ctx, pix); - } - fz_catch(ctx) - { - fz_free_device(dev); - fz_drop_pixmap(ctx, pix); - fz_free_display_list(ctx, list); - pdf_free_page(doc, page); - fz_rethrow(ctx); - } - } - - if (list) - fz_free_display_list(ctx, list); - - pdf_free_page(doc, page); - - if (showtime) - { - int end = gettime(); - int diff = end - start; - - if (diff < timing.min) - { - timing.min = diff; - timing.minpage = pagenum; - } - if (diff > timing.max) - { - timing.max = diff; - timing.maxpage = pagenum; - } - timing.total += diff; - timing.count ++; - - printf(" %dms", diff); - } - - if (showmd5 || showtime) - printf("\n"); - - fz_flush_warnings(ctx); -} - -static void drawrange(pdf_document *doc, char *range) -{ - int page, spage, epage; - char *spec, *dash; - - spec = fz_strsep(&range, ","); - while (spec) - { - dash = strchr(spec, '-'); - - if (dash == spec) - spage = epage = pdf_count_pages(doc); - else - spage = epage = atoi(spec); - - if (dash) - { - if (strlen(dash) > 1) - epage = atoi(dash + 1); - else - epage = pdf_count_pages(doc); - } - - spage = CLAMP(spage, 1, pdf_count_pages(doc)); - epage = CLAMP(epage, 1, pdf_count_pages(doc)); - - if (spage < epage) - for (page = spage; page <= epage; page++) - drawpage(doc, page); - else - for (page = spage; page >= epage; page--) - drawpage(doc, page); - - spec = fz_strsep(&range, ","); - } -} - -static void drawoutline(pdf_document *doc) -{ - fz_outline *outline = pdf_load_outline(doc); - if (showoutline > 1) - fz_debug_outline_xml(doc->ctx, outline, 0); - else - fz_debug_outline(doc->ctx, outline, 0); - fz_free_outline(doc->ctx, outline); -} - -#ifdef MUPDF_COMBINED_EXE -int pdfdraw_main(int argc, char **argv) -#else -int main(int argc, char **argv) -#endif -{ - char *password = ""; - int grayscale = 0; - pdf_document *doc = NULL; - int c; - fz_context *ctx; - - fz_var(doc); - - while ((c = fz_getopt(argc, argv, "lo:p:r:R:ab:dgmtx5G:I")) != -1) - { - switch (c) - { - case 'o': output = fz_optarg; break; - case 'p': password = fz_optarg; break; - case 'r': resolution = atof(fz_optarg); break; - case 'R': rotation = atof(fz_optarg); break; - case 'a': savealpha = 1; break; - case 'b': alphabits = atoi(fz_optarg); break; - case 'l': showoutline++; break; - case 'm': showtime++; break; - case 't': showtext++; break; - case 'x': showxml++; break; - case '5': showmd5++; break; - case 'g': grayscale++; break; - case 'd': uselist = 0; break; - case 'G': gamma_value = atof(fz_optarg); break; - case 'I': invert++; break; - default: usage(); break; - } - } - - if (fz_optind == argc) - usage(); - - if (!showtext && !showxml && !showtime && !showmd5 && !showoutline && !output) - { - printf("nothing to do\n"); - exit(0); - } - - ctx = fz_new_context(NULL, NULL, FZ_STORE_DEFAULT); - if (!ctx) - { - fprintf(stderr, "cannot initialise context\n"); - exit(1); - } - - fz_set_aa_level(ctx, alphabits); - - colorspace = fz_device_rgb; - if (grayscale) - colorspace = fz_device_gray; - if (output && strstr(output, ".pgm")) - colorspace = fz_device_gray; - if (output && strstr(output, ".ppm")) - colorspace = fz_device_rgb; - if (output && strstr(output, ".pbm")) - colorspace = fz_device_gray; - - timing.count = 0; - timing.total = 0; - timing.min = 1 << 30; - timing.max = 0; - timing.minpage = 0; - timing.maxpage = 0; - - if (showxml) - printf("<?xml version=\"1.0\"?>\n"); - - fz_try(ctx) - { - while (fz_optind < argc) - { - filename = argv[fz_optind++]; - - fz_try(ctx) - { - doc = pdf_open_document(ctx, filename); - } - fz_catch(ctx) - { - fz_throw(ctx, "cannot open document: %s", filename); - } - - if (pdf_needs_password(doc)) - if (!pdf_authenticate_password(doc, password)) - fz_throw(ctx, "cannot authenticate password: %s", filename); - - if (showxml) - printf("<document name=\"%s\">\n", filename); - - if (showoutline) - drawoutline(doc); - - if (showtext || showxml || showtime || showmd5 || output) - { - if (fz_optind == argc || !isrange(argv[fz_optind])) - drawrange(doc, "1-"); - if (fz_optind < argc && isrange(argv[fz_optind])) - drawrange(doc, argv[fz_optind++]); - } - - if (showxml) - printf("</document>\n"); - - pdf_close_document(doc); - doc = NULL; - } - } - fz_catch(ctx) - { - pdf_close_document(doc); - } - - if (showtime) - { - printf("total %dms / %d pages for an average of %dms\n", - timing.total, timing.count, timing.total / timing.count); - printf("fastest page %d: %dms\n", timing.minpage, timing.min); - printf("slowest page %d: %dms\n", timing.maxpage, timing.max); - } - - fz_free_context(ctx); - return 0; -} diff --git a/apps/muxpsdraw.c b/apps/muxpsdraw.c deleted file mode 100644 index 74220da6..00000000 --- a/apps/muxpsdraw.c +++ /dev/null @@ -1,374 +0,0 @@ -#include "fitz.h" -#include "muxps.h" - -#ifdef _MSC_VER -#include <winsock2.h> -#else -#include <sys/time.h> -#endif - -char *output = NULL; -float resolution = 72; - -int showxml = 0; -int showtext = 0; -int showtime = 0; -int showmd5 = 0; -int showoutline = 0; -int savealpha = 0; -int uselist = 1; - -fz_colorspace *colorspace; -char *filename; -fz_context *ctx; - -struct { - int count, total; - int min, max; - int minpage, maxpage; -} timing; - -static void usage(void) -{ - fprintf(stderr, - "usage: xpsdraw [options] input.xps [pages]\n" - "\t-o -\toutput filename (%%d for page number)\n" - "\t\tsupported formats: pgm, ppm, pam, png\n" - "\t-r -\tresolution in dpi (default: 72)\n" - "\t-a\tsave alpha channel (only pam and png)\n" - "\t-g\trender in grayscale\n" - "\t-m\tshow timing information\n" - "\t-t\tshow text (-tt for xml)\n" - "\t-x\tshow display list\n" - "\t-d\tdisable use of display list\n" - "\t-5\tshow md5 checksums\n" - "\t-l\tprint outline\n" - "\tpages\tcomma separated list of ranges\n"); - exit(1); -} - -static int gettime(void) -{ - static struct timeval first; - static int once = 1; - struct timeval now; - if (once) - { - gettimeofday(&first, NULL); - once = 0; - } - gettimeofday(&now, NULL); - return (now.tv_sec - first.tv_sec) * 1000 + (now.tv_usec - first.tv_usec) / 1000; -} - -static int isrange(char *s) -{ - while (*s) - { - if ((*s < '0' || *s > '9') && *s != '-' && *s != ',') - return 0; - s++; - } - return 1; -} - -static void drawpage(xps_document *doc, int pagenum) -{ - xps_page *page; - fz_display_list *list; - fz_device *dev; - int start; - - if (showtime) - { - start = gettime(); - } - - page = xps_load_page(doc, pagenum - 1); - - list = NULL; - - if (uselist) - { - list = fz_new_display_list(doc->ctx); - dev = fz_new_list_device(doc->ctx, list); - xps_run_page(doc, page, dev, fz_identity, NULL); - fz_free_device(dev); - } - - if (showxml) - { - dev = fz_new_trace_device(doc->ctx); - printf("<page number=\"%d\">\n", pagenum); - if (list) - fz_run_display_list(list, dev, fz_identity, fz_infinite_bbox, NULL); - else - xps_run_page(doc, page, dev, fz_identity, NULL); - printf("</page>\n"); - fz_free_device(dev); - } - - if (showtext) - { - fz_text_span *text = fz_new_text_span(doc->ctx); - dev = fz_new_text_device(doc->ctx, text); - if (list) - fz_run_display_list(list, dev, fz_identity, fz_infinite_bbox, NULL); - else - xps_run_page(doc, page, dev, fz_identity, NULL); - fz_free_device(dev); - printf("[Page %d]\n", pagenum); - if (showtext > 1) - fz_debug_text_span_xml(text); - else - fz_debug_text_span(text); - printf("\n"); - fz_free_text_span(doc->ctx, text); - } - - if (showmd5 || showtime) - printf("page %s %d", filename, pagenum); - - if (output || showmd5 || showtime) - { - float zoom; - fz_matrix ctm; - fz_rect rect; - fz_bbox bbox; - fz_pixmap *pix; - - rect = xps_bound_page(doc, page); - zoom = resolution / 72; - ctm = fz_scale(zoom, zoom); - bbox = fz_round_rect(fz_transform_rect(ctm, rect)); - - /* TODO: banded rendering and multi-page ppm */ - - pix = fz_new_pixmap_with_rect(doc->ctx, colorspace, bbox); - - if (savealpha) - fz_clear_pixmap(doc->ctx, pix); - else - fz_clear_pixmap_with_value(doc->ctx, pix, 255); - - dev = fz_new_draw_device(doc->ctx, pix); - if (list) - fz_run_display_list(list, dev, ctm, bbox, NULL); - else - xps_run_page(doc, page, dev, ctm, NULL); - fz_free_device(dev); - - if (output) - { - char buf[512]; - sprintf(buf, output, pagenum); - if (strstr(output, ".pgm") || strstr(output, ".ppm") || strstr(output, ".pnm")) - fz_write_pnm(doc->ctx, pix, buf); - else if (strstr(output, ".pam")) - fz_write_pam(doc->ctx, pix, buf, savealpha); - else if (strstr(output, ".png")) - fz_write_png(doc->ctx, pix, buf, savealpha); - } - - if (showmd5) - { - fz_md5 md5; - unsigned char digest[16]; - int i; - - fz_md5_init(&md5); - fz_md5_update(&md5, pix->samples, pix->w * pix->h * pix->n); - fz_md5_final(&md5, digest); - - printf(" "); - for (i = 0; i < 16; i++) - printf("%02x", digest[i]); - } - - fz_drop_pixmap(doc->ctx, pix); - } - - if (list) - fz_free_display_list(doc->ctx, list); - - if (showtime) - { - int end = gettime(); - int diff = end - start; - - if (diff < timing.min) - { - timing.min = diff; - timing.minpage = pagenum; - } - if (diff > timing.max) - { - timing.max = diff; - timing.maxpage = pagenum; - } - timing.total += diff; - timing.count ++; - - printf(" %dms", diff); - } - - if (showmd5 || showtime) - printf("\n"); -} - -static void drawrange(xps_document *doc, char *range) -{ - int page, spage, epage; - char *spec, *dash; - - spec = fz_strsep(&range, ","); - while (spec) - { - dash = strchr(spec, '-'); - - if (dash == spec) - spage = epage = xps_count_pages(doc); - else - spage = epage = atoi(spec); - - if (dash) - { - if (strlen(dash) > 1) - epage = atoi(dash + 1); - else - epage = xps_count_pages(doc); - } - - spage = CLAMP(spage, 1, xps_count_pages(doc)); - epage = CLAMP(epage, 1, xps_count_pages(doc)); - - if (spage < epage) - for (page = spage; page <= epage; page++) - drawpage(doc, page); - else - for (page = spage; page >= epage; page--) - drawpage(doc, page); - - spec = fz_strsep(&range, ","); - } -} - -static void drawoutline(xps_document *doc) -{ - fz_outline *outline = xps_load_outline(doc); - if (showoutline > 1) - fz_debug_outline_xml(doc->ctx, outline, 0); - else - fz_debug_outline(doc->ctx, outline, 0); - fz_free_outline(doc->ctx, outline); -} - -#ifdef MUPDF_COMBINED_EXE -int xpsdraw_main(int argc, char **argv) -#else -int main(int argc, char **argv) -#endif -{ - int grayscale = 0; - xps_document *doc = NULL; - int c; - - fz_var(doc); - - while ((c = fz_getopt(argc, argv, "o:p:r:adglmtx5")) != -1) - { - switch (c) - { - case 'o': output = fz_optarg; break; - case 'r': resolution = atof(fz_optarg); break; - case 'a': savealpha = 1; break; - case 'l': showoutline++; break; - case 'm': showtime++; break; - case 't': showtext++; break; - case 'x': showxml++; break; - case '5': showmd5++; break; - case 'g': grayscale++; break; - case 'd': uselist = 0; break; - default: usage(); break; - } - } - - if (fz_optind == argc) - usage(); - - if (!showtext && !showxml && !showtime && !showmd5 && !showoutline && !output) - { - printf("nothing to do\n"); - exit(0); - } - - ctx = fz_new_context(NULL, NULL, FZ_STORE_DEFAULT); - if (!ctx) - { - fprintf(stderr, "cannot initialise context\n"); - exit(1); - } - - colorspace = fz_device_rgb; - if (grayscale) - colorspace = fz_device_gray; - if (output && strstr(output, ".pgm")) - colorspace = fz_device_gray; - if (output && strstr(output, ".ppm")) - colorspace = fz_device_rgb; - - timing.count = 0; - timing.total = 0; - timing.min = 1 << 30; - timing.max = 0; - timing.minpage = 0; - timing.maxpage = 0; - - if (showxml) - printf("<?xml version=\"1.0\"?>\n"); - - while (fz_optind < argc) - { - filename = argv[fz_optind++]; - - fz_try(ctx) - { - doc = xps_open_document(ctx, filename); - - if (showxml) - printf("<document name=\"%s\">\n", filename); - - if (showoutline) - drawoutline(doc); - - if (showtext || showxml || showtime || showmd5 || output) - { - if (fz_optind == argc || !isrange(argv[fz_optind])) - drawrange(doc, "1-"); - if (fz_optind < argc && isrange(argv[fz_optind])) - drawrange(doc, argv[fz_optind++]); - } - - if (showxml) - printf("</document>\n"); - - xps_close_document(doc); - } - fz_catch(ctx) - { - xps_close_document(doc); - } - } - - if (showtime) - { - printf("total %dms / %d pages for an average of %dms\n", - timing.total, timing.count, timing.total / timing.count); - printf("fastest page %d: %dms\n", timing.minpage, timing.min); - printf("slowest page %d: %dms\n", timing.maxpage, timing.max); - } - - fz_free_context(ctx); - - return 0; -} |