xref: /aosp_15_r20/external/libjpeg-turbo/cdjpeg.h (revision dfc6aa5c1cfd4bc4e2018dc74aa96e29ee49c6da)
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