/* * djpeg.c * * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1997, Thomas G. Lane. * Modified 2013-2019 by Guido Vollbeding. * libjpeg-turbo Modifications: * Copyright (C) 2010-2011, 2013-2017, 2019-2020, 2022, D. R. Commander. * Copyright (C) 2015, Google, Inc. * For conditions of distribution and use, see the accompanying README.ijg * file. * * This file contains a command-line user interface for the JPEG decompressor. * It should work on any system with Unix- or MS-DOS-style command lines. * * Two different command line styles are permitted, depending on the * compile-time switch TWO_FILE_COMMANDLINE: * djpeg [options] inputfile outputfile * djpeg [options] [inputfile] * In the second style, output is always to standard output, which you'd * normally redirect to a file or pipe to some other program. Input is * either from a named file or from standard input (typically redirected). * The second style is convenient on Unix but is unhelpful on systems that * don't support pipes. Also, you MUST use the first style if your system * doesn't do binary I/O to stdin/stdout. * To simplify script writing, the "-outfile" switch is provided. The syntax * djpeg [options] -outfile outputfile inputfile * works regardless of which command line style is used. */ #ifdef _MSC_VER #define _CRT_SECURE_NO_DEPRECATE #endif #include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ #include "jversion.h" /* for version message */ #include "jconfigint.h" #include <ctype.h> /* to declare isprint() */ /* Create the add-on message string table. */ #define JMESSAGE … static const char * const cdjpeg_message_table[] = …; /* * This list defines the known output image formats * (not all of which need be supported by a given version). * You can change the default output format by defining DEFAULT_FMT; * indeed, you had better do so if you undefine PPM_SUPPORTED. */ IMAGE_FORMATS; #ifndef DEFAULT_FMT /* so can override from CFLAGS in Makefile */ #define DEFAULT_FMT … #endif static IMAGE_FORMATS requested_fmt; /* * Argument-parsing code. * The switch parser is designed to be useful with DOS-style command line * syntax, ie, intermixed switches and file names, where only the switches * to the left of a given file name affect processing of that file. * The main program in this file doesn't actually use this capability... */ static const char *progname; /* program name for error messages */ static char *icc_filename; /* for -icc switch */ static JDIMENSION max_scans; /* for -maxscans switch */ static char *outfilename; /* for -outfile switch */ static boolean memsrc; /* for -memsrc switch */ static boolean report; /* for -report switch */ boolean skip, crop; JDIMENSION skip_start, skip_end; JDIMENSION crop_x, crop_y, crop_width, crop_height; static boolean strict; /* for -strict switch */ #define INPUT_BUF_SIZE … LOCAL(void) usage(void) /* complain about bad command line */ { … } LOCAL(int) parse_switches(j_decompress_ptr cinfo, int argc, char **argv, int last_file_arg_seen, boolean for_real) /* Parse optional switches. * Returns argv[] index of first file-name argument (== argc if none). * Any file names with indexes <= last_file_arg_seen are ignored; * they have presumably been processed in a previous iteration. * (Pass 0 for last_file_arg_seen on the first or only iteration.) * for_real is FALSE on the first (dummy) pass; we may skip any expensive * processing. */ { … } /* * Marker processor for COM and interesting APPn markers. * This replaces the library's built-in processor, which just skips the marker. * We want to print out the marker as text, to the extent possible. * Note this code relies on a non-suspending data source. */ LOCAL(unsigned int) jpeg_getc(j_decompress_ptr cinfo) /* Read next byte */ { … } METHODDEF(boolean) print_text_marker(j_decompress_ptr cinfo) { … } METHODDEF(void) my_emit_message(j_common_ptr cinfo, int msg_level) { … } /* * The main program. */ int #ifdef GTEST djpeg(int argc, char **argv) #else main(int argc, char **argv) #endif { … }