OLD | NEW |
1 /* | 1 /* |
2 * djpeg.c | 2 * djpeg.c |
3 * | 3 * |
4 * Copyright (C) 1991-1997, Thomas G. Lane. | 4 * Copyright (C) 1991-1997, Thomas G. Lane. |
| 5 * Copyright (C) 2010-2011, D. R. Commander. |
5 * This file is part of the Independent JPEG Group's software. | 6 * This file is part of the Independent JPEG Group's software. |
6 * For conditions of distribution and use, see the accompanying README file. | 7 * For conditions of distribution and use, see the accompanying README file. |
7 * | 8 * |
8 * This file contains a command-line user interface for the JPEG decompressor. | 9 * This file contains a command-line user interface for the JPEG decompressor. |
9 * It should work on any system with Unix- or MS-DOS-style command lines. | 10 * It should work on any system with Unix- or MS-DOS-style command lines. |
10 * | 11 * |
11 * Two different command line styles are permitted, depending on the | 12 * Two different command line styles are permitted, depending on the |
12 * compile-time switch TWO_FILE_COMMANDLINE: | 13 * compile-time switch TWO_FILE_COMMANDLINE: |
13 * djpeg [options] inputfile outputfile | 14 * djpeg [options] inputfile outputfile |
14 * djpeg [options] [inputfile] | 15 * djpeg [options] [inputfile] |
15 * In the second style, output is always to standard output, which you'd | 16 * In the second style, output is always to standard output, which you'd |
16 * normally redirect to a file or pipe to some other program. Input is | 17 * normally redirect to a file or pipe to some other program. Input is |
17 * either from a named file or from standard input (typically redirected). | 18 * either from a named file or from standard input (typically redirected). |
18 * The second style is convenient on Unix but is unhelpful on systems that | 19 * The second style is convenient on Unix but is unhelpful on systems that |
19 * don't support pipes. Also, you MUST use the first style if your system | 20 * don't support pipes. Also, you MUST use the first style if your system |
20 * doesn't do binary I/O to stdin/stdout. | 21 * doesn't do binary I/O to stdin/stdout. |
21 * To simplify script writing, the "-outfile" switch is provided. The syntax | 22 * To simplify script writing, the "-outfile" switch is provided. The syntax |
22 * djpeg [options] -outfile outputfile inputfile | 23 * djpeg [options] -outfile outputfile inputfile |
23 * works regardless of which command line style is used. | 24 * works regardless of which command line style is used. |
24 */ | 25 */ |
25 | 26 |
26 #include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ | 27 #include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ |
27 #include "jversion.h" /* for version message */ | 28 #include "jversion.h" /* for version message */ |
| 29 #include "config.h" |
28 | 30 |
29 #include <ctype.h> /* to declare isprint() */ | 31 #include <ctype.h> /* to declare isprint() */ |
30 | 32 |
31 #ifdef USE_CCOMMAND /* command-line reader for Macintosh */ | 33 #ifdef USE_CCOMMAND /* command-line reader for Macintosh */ |
32 #ifdef __MWERKS__ | 34 #ifdef __MWERKS__ |
33 #include <SIOUX.h> /* Metrowerks needs this */ | 35 #include <SIOUX.h> /* Metrowerks needs this */ |
34 #include <console.h> /* ... and this */ | 36 #include <console.h> /* ... and this */ |
35 #endif | 37 #endif |
36 #ifdef THINK_C | 38 #ifdef THINK_C |
37 #include <console.h> /* Think declares it here */ | 39 #include <console.h> /* Think declares it here */ |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 #ifdef TWO_FILE_COMMANDLINE | 96 #ifdef TWO_FILE_COMMANDLINE |
95 fprintf(stderr, "inputfile outputfile\n"); | 97 fprintf(stderr, "inputfile outputfile\n"); |
96 #else | 98 #else |
97 fprintf(stderr, "[inputfile]\n"); | 99 fprintf(stderr, "[inputfile]\n"); |
98 #endif | 100 #endif |
99 | 101 |
100 fprintf(stderr, "Switches (names may be abbreviated):\n"); | 102 fprintf(stderr, "Switches (names may be abbreviated):\n"); |
101 fprintf(stderr, " -colors N Reduce image to no more than N colors\n"); | 103 fprintf(stderr, " -colors N Reduce image to no more than N colors\n"); |
102 fprintf(stderr, " -fast Fast, low-quality processing\n"); | 104 fprintf(stderr, " -fast Fast, low-quality processing\n"); |
103 fprintf(stderr, " -grayscale Force grayscale output\n"); | 105 fprintf(stderr, " -grayscale Force grayscale output\n"); |
| 106 fprintf(stderr, " -rgb Force RGB output\n"); |
104 #ifdef IDCT_SCALING_SUPPORTED | 107 #ifdef IDCT_SCALING_SUPPORTED |
105 fprintf(stderr, " -scale M/N Scale output image by fraction M/N, eg, 1/8\
n"); | 108 fprintf(stderr, " -scale M/N Scale output image by fraction M/N, eg, 1/8\
n"); |
106 #endif | 109 #endif |
107 #ifdef BMP_SUPPORTED | 110 #ifdef BMP_SUPPORTED |
108 fprintf(stderr, " -bmp Select BMP output format (Windows style)%s\n
", | 111 fprintf(stderr, " -bmp Select BMP output format (Windows style)%s\n
", |
109 (DEFAULT_FMT == FMT_BMP ? " (default)" : "")); | 112 (DEFAULT_FMT == FMT_BMP ? " (default)" : "")); |
110 #endif | 113 #endif |
111 #ifdef GIF_SUPPORTED | 114 #ifdef GIF_SUPPORTED |
112 fprintf(stderr, " -gif Select GIF output format%s\n", | 115 fprintf(stderr, " -gif Select GIF output format%s\n", |
113 (DEFAULT_FMT == FMT_GIF ? " (default)" : "")); | 116 (DEFAULT_FMT == FMT_GIF ? " (default)" : "")); |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 cinfo->dither_mode = JDITHER_ORDERED; | 236 cinfo->dither_mode = JDITHER_ORDERED; |
234 } else | 237 } else |
235 usage(); | 238 usage(); |
236 | 239 |
237 } else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) { | 240 } else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) { |
238 /* Enable debug printouts. */ | 241 /* Enable debug printouts. */ |
239 /* On first -d, print version identification */ | 242 /* On first -d, print version identification */ |
240 static boolean printed_version = FALSE; | 243 static boolean printed_version = FALSE; |
241 | 244 |
242 if (! printed_version) { | 245 if (! printed_version) { |
243 » fprintf(stderr, "Independent JPEG Group's DJPEG, version %s\n%s\n", | 246 » fprintf(stderr, "%s version %s (build %s)\n", |
| 247 » » PACKAGE_NAME, VERSION, BUILD); |
| 248 » fprintf(stderr, "%s\n\n", LJTCOPYRIGHT); |
| 249 » fprintf(stderr, "Based on Independent JPEG Group's libjpeg, version %s\n
%s\n\n", |
244 JVERSION, JCOPYRIGHT); | 250 JVERSION, JCOPYRIGHT); |
245 printed_version = TRUE; | 251 printed_version = TRUE; |
246 } | 252 } |
247 cinfo->err->trace_level++; | 253 cinfo->err->trace_level++; |
248 | 254 |
249 } else if (keymatch(arg, "fast", 1)) { | 255 } else if (keymatch(arg, "fast", 1)) { |
250 /* Select recommended processing options for quick-and-dirty output. */ | 256 /* Select recommended processing options for quick-and-dirty output. */ |
251 cinfo->two_pass_quantize = FALSE; | 257 cinfo->two_pass_quantize = FALSE; |
252 cinfo->dither_mode = JDITHER_ORDERED; | 258 cinfo->dither_mode = JDITHER_ORDERED; |
253 if (! cinfo->quantize_colors) /* don't override an earlier -colors */ | 259 if (! cinfo->quantize_colors) /* don't override an earlier -colors */ |
254 cinfo->desired_number_of_colors = 216; | 260 cinfo->desired_number_of_colors = 216; |
255 cinfo->dct_method = JDCT_FASTEST; | 261 cinfo->dct_method = JDCT_FASTEST; |
256 cinfo->do_fancy_upsampling = FALSE; | 262 cinfo->do_fancy_upsampling = FALSE; |
257 | 263 |
258 } else if (keymatch(arg, "gif", 1)) { | 264 } else if (keymatch(arg, "gif", 1)) { |
259 /* GIF output format. */ | 265 /* GIF output format. */ |
260 requested_fmt = FMT_GIF; | 266 requested_fmt = FMT_GIF; |
261 | 267 |
262 } else if (keymatch(arg, "grayscale", 2) || keymatch(arg, "greyscale",2)) { | 268 } else if (keymatch(arg, "grayscale", 2) || keymatch(arg, "greyscale",2)) { |
263 /* Force monochrome output. */ | 269 /* Force monochrome output. */ |
264 cinfo->out_color_space = JCS_GRAYSCALE; | 270 cinfo->out_color_space = JCS_GRAYSCALE; |
265 | 271 |
| 272 } else if (keymatch(arg, "rgb", 2)) { |
| 273 /* Force RGB output. */ |
| 274 cinfo->out_color_space = JCS_RGB; |
| 275 |
266 } else if (keymatch(arg, "map", 3)) { | 276 } else if (keymatch(arg, "map", 3)) { |
267 /* Quantize to a color map taken from an input file. */ | 277 /* Quantize to a color map taken from an input file. */ |
268 if (++argn >= argc) /* advance to next argument */ | 278 if (++argn >= argc) /* advance to next argument */ |
269 usage(); | 279 usage(); |
270 if (for_real) { /* too expensive to do twice! */ | 280 if (for_real) { /* too expensive to do twice! */ |
271 #ifdef QUANT_2PASS_SUPPORTED /* otherwise can't quantize to supplied map */ | 281 #ifdef QUANT_2PASS_SUPPORTED /* otherwise can't quantize to supplied map */ |
272 FILE * mapfile; | 282 FILE * mapfile; |
273 | 283 |
274 if ((mapfile = fopen(argv[argn], READ_BINARY)) == NULL) { | 284 if ((mapfile = fopen(argv[argn], READ_BINARY)) == NULL) { |
275 fprintf(stderr, "%s: can't open %s\n", progname, argv[argn]); | 285 fprintf(stderr, "%s: can't open %s\n", progname, argv[argn]); |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
448 jpeg_create_decompress(&cinfo); | 458 jpeg_create_decompress(&cinfo); |
449 /* Add some application-specific error messages (from cderror.h) */ | 459 /* Add some application-specific error messages (from cderror.h) */ |
450 jerr.addon_message_table = cdjpeg_message_table; | 460 jerr.addon_message_table = cdjpeg_message_table; |
451 jerr.first_addon_message = JMSG_FIRSTADDONCODE; | 461 jerr.first_addon_message = JMSG_FIRSTADDONCODE; |
452 jerr.last_addon_message = JMSG_LASTADDONCODE; | 462 jerr.last_addon_message = JMSG_LASTADDONCODE; |
453 | 463 |
454 /* Insert custom marker processor for COM and APP12. | 464 /* Insert custom marker processor for COM and APP12. |
455 * APP12 is used by some digital camera makers for textual info, | 465 * APP12 is used by some digital camera makers for textual info, |
456 * so we provide the ability to display it as text. | 466 * so we provide the ability to display it as text. |
457 * If you like, additional APPn marker types can be selected for display, | 467 * If you like, additional APPn marker types can be selected for display, |
458 * but don't try to override APP0 or APP14 this way (see libjpeg.doc). | 468 * but don't try to override APP0 or APP14 this way (see libjpeg.txt). |
459 */ | 469 */ |
460 jpeg_set_marker_processor(&cinfo, JPEG_COM, print_text_marker); | 470 jpeg_set_marker_processor(&cinfo, JPEG_COM, print_text_marker); |
461 jpeg_set_marker_processor(&cinfo, JPEG_APP0+12, print_text_marker); | 471 jpeg_set_marker_processor(&cinfo, JPEG_APP0+12, print_text_marker); |
462 | 472 |
463 /* Now safe to enable signal catcher. */ | 473 /* Now safe to enable signal catcher. */ |
464 #ifdef NEED_SIGNAL_CATCHER | 474 #ifdef NEED_SIGNAL_CATCHER |
465 enable_signal_catcher((j_common_ptr) &cinfo); | 475 enable_signal_catcher((j_common_ptr) &cinfo); |
466 #endif | 476 #endif |
467 | 477 |
468 /* Scan command line to find file names. */ | 478 /* Scan command line to find file names. */ |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
607 fclose(output_file); | 617 fclose(output_file); |
608 | 618 |
609 #ifdef PROGRESS_REPORT | 619 #ifdef PROGRESS_REPORT |
610 end_progress_monitor((j_common_ptr) &cinfo); | 620 end_progress_monitor((j_common_ptr) &cinfo); |
611 #endif | 621 #endif |
612 | 622 |
613 /* All done. */ | 623 /* All done. */ |
614 exit(jerr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS); | 624 exit(jerr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS); |
615 return 0; /* suppress no-return-value warnings */ | 625 return 0; /* suppress no-return-value warnings */ |
616 } | 626 } |
OLD | NEW |