1*dfc6aa5cSAndroid Build Coastguard Worker /* 2*dfc6aa5cSAndroid Build Coastguard Worker * cdjpeg.h 3*dfc6aa5cSAndroid Build Coastguard Worker * 4*dfc6aa5cSAndroid Build Coastguard Worker * This file was part of the Independent JPEG Group's software: 5*dfc6aa5cSAndroid Build Coastguard Worker * Copyright (C) 1994-1997, Thomas G. Lane. 6*dfc6aa5cSAndroid Build Coastguard Worker * Modified 2019 by Guido Vollbeding. 7*dfc6aa5cSAndroid Build Coastguard Worker * libjpeg-turbo Modifications: 8*dfc6aa5cSAndroid Build Coastguard Worker * Copyright (C) 2017, 2019, 2021, D. R. Commander. 9*dfc6aa5cSAndroid Build Coastguard Worker * For conditions of distribution and use, see the accompanying README.ijg 10*dfc6aa5cSAndroid Build Coastguard Worker * file. 11*dfc6aa5cSAndroid Build Coastguard Worker * 12*dfc6aa5cSAndroid Build Coastguard Worker * This file contains common declarations for the sample applications 13*dfc6aa5cSAndroid Build Coastguard Worker * cjpeg and djpeg. It is NOT used by the core JPEG library. 14*dfc6aa5cSAndroid Build Coastguard Worker */ 15*dfc6aa5cSAndroid Build Coastguard Worker 16*dfc6aa5cSAndroid Build Coastguard Worker #define JPEG_CJPEG_DJPEG /* define proper options in jconfig.h */ 17*dfc6aa5cSAndroid Build Coastguard Worker #define JPEG_INTERNAL_OPTIONS /* cjpeg.c,djpeg.c need to see xxx_SUPPORTED */ 18*dfc6aa5cSAndroid Build Coastguard Worker #include "jinclude.h" 19*dfc6aa5cSAndroid Build Coastguard Worker #include "jpeglib.h" 20*dfc6aa5cSAndroid Build Coastguard Worker #include "jerror.h" /* get library error codes too */ 21*dfc6aa5cSAndroid Build Coastguard Worker #include "cderror.h" /* get application-specific error codes */ 22*dfc6aa5cSAndroid Build Coastguard Worker 23*dfc6aa5cSAndroid Build Coastguard Worker 24*dfc6aa5cSAndroid Build Coastguard Worker /* 25*dfc6aa5cSAndroid Build Coastguard Worker * Object interface for cjpeg's source file decoding modules 26*dfc6aa5cSAndroid Build Coastguard Worker */ 27*dfc6aa5cSAndroid Build Coastguard Worker 28*dfc6aa5cSAndroid Build Coastguard Worker typedef struct cjpeg_source_struct *cjpeg_source_ptr; 29*dfc6aa5cSAndroid Build Coastguard Worker 30*dfc6aa5cSAndroid Build Coastguard Worker struct cjpeg_source_struct { 31*dfc6aa5cSAndroid Build Coastguard Worker void (*start_input) (j_compress_ptr cinfo, cjpeg_source_ptr sinfo); 32*dfc6aa5cSAndroid Build Coastguard Worker JDIMENSION (*get_pixel_rows) (j_compress_ptr cinfo, cjpeg_source_ptr sinfo); 33*dfc6aa5cSAndroid Build Coastguard Worker void (*finish_input) (j_compress_ptr cinfo, cjpeg_source_ptr sinfo); 34*dfc6aa5cSAndroid Build Coastguard Worker 35*dfc6aa5cSAndroid Build Coastguard Worker FILE *input_file; 36*dfc6aa5cSAndroid Build Coastguard Worker 37*dfc6aa5cSAndroid Build Coastguard Worker JSAMPARRAY buffer; 38*dfc6aa5cSAndroid Build Coastguard Worker JDIMENSION buffer_height; 39*dfc6aa5cSAndroid Build Coastguard Worker #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION 40*dfc6aa5cSAndroid Build Coastguard Worker JDIMENSION max_pixels; 41*dfc6aa5cSAndroid Build Coastguard Worker #endif 42*dfc6aa5cSAndroid Build Coastguard Worker }; 43*dfc6aa5cSAndroid Build Coastguard Worker 44*dfc6aa5cSAndroid Build Coastguard Worker 45*dfc6aa5cSAndroid Build Coastguard Worker /* 46*dfc6aa5cSAndroid Build Coastguard Worker * Object interface for djpeg's output file encoding modules 47*dfc6aa5cSAndroid Build Coastguard Worker */ 48*dfc6aa5cSAndroid Build Coastguard Worker 49*dfc6aa5cSAndroid Build Coastguard Worker typedef struct djpeg_dest_struct *djpeg_dest_ptr; 50*dfc6aa5cSAndroid Build Coastguard Worker 51*dfc6aa5cSAndroid Build Coastguard Worker struct djpeg_dest_struct { 52*dfc6aa5cSAndroid Build Coastguard Worker /* start_output is called after jpeg_start_decompress finishes. 53*dfc6aa5cSAndroid Build Coastguard Worker * The color map will be ready at this time, if one is needed. 54*dfc6aa5cSAndroid Build Coastguard Worker */ 55*dfc6aa5cSAndroid Build Coastguard Worker void (*start_output) (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo); 56*dfc6aa5cSAndroid Build Coastguard Worker /* Emit the specified number of pixel rows from the buffer. */ 57*dfc6aa5cSAndroid Build Coastguard Worker void (*put_pixel_rows) (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, 58*dfc6aa5cSAndroid Build Coastguard Worker JDIMENSION rows_supplied); 59*dfc6aa5cSAndroid Build Coastguard Worker /* Finish up at the end of the image. */ 60*dfc6aa5cSAndroid Build Coastguard Worker void (*finish_output) (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo); 61*dfc6aa5cSAndroid Build Coastguard Worker /* Re-calculate buffer dimensions based on output dimensions (for use with 62*dfc6aa5cSAndroid Build Coastguard Worker partial image decompression.) If this is NULL, then the output format 63*dfc6aa5cSAndroid Build Coastguard Worker does not support partial image decompression (BMP, in particular, cannot 64*dfc6aa5cSAndroid Build Coastguard Worker support partial decompression because it uses an inversion buffer to write 65*dfc6aa5cSAndroid Build Coastguard Worker the image in bottom-up order.) */ 66*dfc6aa5cSAndroid Build Coastguard Worker void (*calc_buffer_dimensions) (j_decompress_ptr cinfo, 67*dfc6aa5cSAndroid Build Coastguard Worker djpeg_dest_ptr dinfo); 68*dfc6aa5cSAndroid Build Coastguard Worker 69*dfc6aa5cSAndroid Build Coastguard Worker 70*dfc6aa5cSAndroid Build Coastguard Worker /* Target file spec; filled in by djpeg.c after object is created. */ 71*dfc6aa5cSAndroid Build Coastguard Worker FILE *output_file; 72*dfc6aa5cSAndroid Build Coastguard Worker 73*dfc6aa5cSAndroid Build Coastguard Worker /* Output pixel-row buffer. Created by module init or start_output. 74*dfc6aa5cSAndroid Build Coastguard Worker * Width is cinfo->output_width * cinfo->output_components; 75*dfc6aa5cSAndroid Build Coastguard Worker * height is buffer_height. 76*dfc6aa5cSAndroid Build Coastguard Worker */ 77*dfc6aa5cSAndroid Build Coastguard Worker JSAMPARRAY buffer; 78*dfc6aa5cSAndroid Build Coastguard Worker JDIMENSION buffer_height; 79*dfc6aa5cSAndroid Build Coastguard Worker }; 80*dfc6aa5cSAndroid Build Coastguard Worker 81*dfc6aa5cSAndroid Build Coastguard Worker 82*dfc6aa5cSAndroid Build Coastguard Worker /* 83*dfc6aa5cSAndroid Build Coastguard Worker * cjpeg/djpeg may need to perform extra passes to convert to or from 84*dfc6aa5cSAndroid Build Coastguard Worker * the source/destination file format. The JPEG library does not know 85*dfc6aa5cSAndroid Build Coastguard Worker * about these passes, but we'd like them to be counted by the progress 86*dfc6aa5cSAndroid Build Coastguard Worker * monitor. We use an expanded progress monitor object to hold the 87*dfc6aa5cSAndroid Build Coastguard Worker * additional pass count. 88*dfc6aa5cSAndroid Build Coastguard Worker */ 89*dfc6aa5cSAndroid Build Coastguard Worker 90*dfc6aa5cSAndroid Build Coastguard Worker struct cdjpeg_progress_mgr { 91*dfc6aa5cSAndroid Build Coastguard Worker struct jpeg_progress_mgr pub; /* fields known to JPEG library */ 92*dfc6aa5cSAndroid Build Coastguard Worker int completed_extra_passes; /* extra passes completed */ 93*dfc6aa5cSAndroid Build Coastguard Worker int total_extra_passes; /* total extra */ 94*dfc6aa5cSAndroid Build Coastguard Worker JDIMENSION max_scans; /* abort if the number of scans exceeds this 95*dfc6aa5cSAndroid Build Coastguard Worker value and the value is non-zero */ 96*dfc6aa5cSAndroid Build Coastguard Worker boolean report; /* whether or not to report progress */ 97*dfc6aa5cSAndroid Build Coastguard Worker /* last printed percentage stored here to avoid multiple printouts */ 98*dfc6aa5cSAndroid Build Coastguard Worker int percent_done; 99*dfc6aa5cSAndroid Build Coastguard Worker }; 100*dfc6aa5cSAndroid Build Coastguard Worker 101*dfc6aa5cSAndroid Build Coastguard Worker typedef struct cdjpeg_progress_mgr *cd_progress_ptr; 102*dfc6aa5cSAndroid Build Coastguard Worker 103*dfc6aa5cSAndroid Build Coastguard Worker 104*dfc6aa5cSAndroid Build Coastguard Worker /* Module selection routines for I/O modules. */ 105*dfc6aa5cSAndroid Build Coastguard Worker 106*dfc6aa5cSAndroid Build Coastguard Worker EXTERN(cjpeg_source_ptr) jinit_read_bmp(j_compress_ptr cinfo, 107*dfc6aa5cSAndroid Build Coastguard Worker boolean use_inversion_array); 108*dfc6aa5cSAndroid Build Coastguard Worker EXTERN(djpeg_dest_ptr) jinit_write_bmp(j_decompress_ptr cinfo, boolean is_os2, 109*dfc6aa5cSAndroid Build Coastguard Worker boolean use_inversion_array); 110*dfc6aa5cSAndroid Build Coastguard Worker EXTERN(cjpeg_source_ptr) jinit_read_gif(j_compress_ptr cinfo); 111*dfc6aa5cSAndroid Build Coastguard Worker EXTERN(djpeg_dest_ptr) jinit_write_gif(j_decompress_ptr cinfo, boolean is_lzw); 112*dfc6aa5cSAndroid Build Coastguard Worker EXTERN(cjpeg_source_ptr) jinit_read_ppm(j_compress_ptr cinfo); 113*dfc6aa5cSAndroid Build Coastguard Worker EXTERN(djpeg_dest_ptr) jinit_write_ppm(j_decompress_ptr cinfo); 114*dfc6aa5cSAndroid Build Coastguard Worker EXTERN(cjpeg_source_ptr) jinit_read_targa(j_compress_ptr cinfo); 115*dfc6aa5cSAndroid Build Coastguard Worker EXTERN(djpeg_dest_ptr) jinit_write_targa(j_decompress_ptr cinfo); 116*dfc6aa5cSAndroid Build Coastguard Worker 117*dfc6aa5cSAndroid Build Coastguard Worker /* cjpeg support routines (in rdswitch.c) */ 118*dfc6aa5cSAndroid Build Coastguard Worker 119*dfc6aa5cSAndroid Build Coastguard Worker EXTERN(boolean) read_quant_tables(j_compress_ptr cinfo, char *filename, 120*dfc6aa5cSAndroid Build Coastguard Worker boolean force_baseline); 121*dfc6aa5cSAndroid Build Coastguard Worker EXTERN(boolean) read_scan_script(j_compress_ptr cinfo, char *filename); 122*dfc6aa5cSAndroid Build Coastguard Worker EXTERN(boolean) set_quality_ratings(j_compress_ptr cinfo, char *arg, 123*dfc6aa5cSAndroid Build Coastguard Worker boolean force_baseline); 124*dfc6aa5cSAndroid Build Coastguard Worker EXTERN(boolean) set_quant_slots(j_compress_ptr cinfo, char *arg); 125*dfc6aa5cSAndroid Build Coastguard Worker EXTERN(boolean) set_sample_factors(j_compress_ptr cinfo, char *arg); 126*dfc6aa5cSAndroid Build Coastguard Worker 127*dfc6aa5cSAndroid Build Coastguard Worker /* djpeg support routines (in rdcolmap.c) */ 128*dfc6aa5cSAndroid Build Coastguard Worker 129*dfc6aa5cSAndroid Build Coastguard Worker EXTERN(void) read_color_map(j_decompress_ptr cinfo, FILE *infile); 130*dfc6aa5cSAndroid Build Coastguard Worker 131*dfc6aa5cSAndroid Build Coastguard Worker /* common support routines (in cdjpeg.c) */ 132*dfc6aa5cSAndroid Build Coastguard Worker 133*dfc6aa5cSAndroid Build Coastguard Worker EXTERN(void) start_progress_monitor(j_common_ptr cinfo, 134*dfc6aa5cSAndroid Build Coastguard Worker cd_progress_ptr progress); 135*dfc6aa5cSAndroid Build Coastguard Worker EXTERN(void) end_progress_monitor(j_common_ptr cinfo); 136*dfc6aa5cSAndroid Build Coastguard Worker EXTERN(boolean) keymatch(char *arg, const char *keyword, int minchars); 137*dfc6aa5cSAndroid Build Coastguard Worker EXTERN(FILE *) read_stdin(void); 138*dfc6aa5cSAndroid Build Coastguard Worker EXTERN(FILE *) write_stdout(void); 139*dfc6aa5cSAndroid Build Coastguard Worker 140*dfc6aa5cSAndroid Build Coastguard Worker /* miscellaneous useful macros */ 141*dfc6aa5cSAndroid Build Coastguard Worker 142*dfc6aa5cSAndroid Build Coastguard Worker #ifdef DONT_USE_B_MODE /* define mode parameters for fopen() */ 143*dfc6aa5cSAndroid Build Coastguard Worker #define READ_BINARY "r" 144*dfc6aa5cSAndroid Build Coastguard Worker #define WRITE_BINARY "w" 145*dfc6aa5cSAndroid Build Coastguard Worker #else 146*dfc6aa5cSAndroid Build Coastguard Worker #define READ_BINARY "rb" 147*dfc6aa5cSAndroid Build Coastguard Worker #define WRITE_BINARY "wb" 148*dfc6aa5cSAndroid Build Coastguard Worker #endif 149*dfc6aa5cSAndroid Build Coastguard Worker 150*dfc6aa5cSAndroid Build Coastguard Worker #ifndef EXIT_FAILURE /* define exit() codes if not provided */ 151*dfc6aa5cSAndroid Build Coastguard Worker #define EXIT_FAILURE 1 152*dfc6aa5cSAndroid Build Coastguard Worker #endif 153*dfc6aa5cSAndroid Build Coastguard Worker #ifndef EXIT_SUCCESS 154*dfc6aa5cSAndroid Build Coastguard Worker #define EXIT_SUCCESS 0 155*dfc6aa5cSAndroid Build Coastguard Worker #endif 156*dfc6aa5cSAndroid Build Coastguard Worker #ifndef EXIT_WARNING 157*dfc6aa5cSAndroid Build Coastguard Worker #define EXIT_WARNING 2 158*dfc6aa5cSAndroid Build Coastguard Worker #endif 159*dfc6aa5cSAndroid Build Coastguard Worker 160*dfc6aa5cSAndroid Build Coastguard Worker #define IsExtRGB(cs) \ 161*dfc6aa5cSAndroid Build Coastguard Worker (cs == JCS_RGB || (cs >= JCS_EXT_RGB && cs <= JCS_EXT_ARGB)) 162