xref: /plan9/sys/src/cmd/gs/jpeg/jpegint.h (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier /*
2*7dd7cddfSDavid du Colombier  * jpegint.h
3*7dd7cddfSDavid du Colombier  *
4*7dd7cddfSDavid du Colombier  * Copyright (C) 1991-1996, Thomas G. Lane.
5*7dd7cddfSDavid du Colombier  * This file is part of the Independent JPEG Group's software.
6*7dd7cddfSDavid du Colombier  * For conditions of distribution and use, see the accompanying README file.
7*7dd7cddfSDavid du Colombier  *
8*7dd7cddfSDavid du Colombier  * This file provides common declarations for the various JPEG modules.
9*7dd7cddfSDavid du Colombier  * These declarations are considered internal to the JPEG library; most
10*7dd7cddfSDavid du Colombier  * applications using the library shouldn't need to include this file.
11*7dd7cddfSDavid du Colombier  */
12*7dd7cddfSDavid du Colombier 
13*7dd7cddfSDavid du Colombier 
14*7dd7cddfSDavid du Colombier /* Declarations for both compression & decompression */
15*7dd7cddfSDavid du Colombier 
16*7dd7cddfSDavid du Colombier typedef enum {			/* Operating modes for buffer controllers */
17*7dd7cddfSDavid du Colombier 	JBUF_PASS_THRU,		/* Plain stripwise operation */
18*7dd7cddfSDavid du Colombier 	/* Remaining modes require a full-image buffer to have been created */
19*7dd7cddfSDavid du Colombier 	JBUF_SAVE_SOURCE,	/* Run source subobject only, save output */
20*7dd7cddfSDavid du Colombier 	JBUF_CRANK_DEST,	/* Run dest subobject only, using saved data */
21*7dd7cddfSDavid du Colombier 	JBUF_SAVE_AND_PASS	/* Run both subobjects, save output */
22*7dd7cddfSDavid du Colombier } J_BUF_MODE;
23*7dd7cddfSDavid du Colombier 
24*7dd7cddfSDavid du Colombier /* Values of global_state field (jdapi.c has some dependencies on ordering!) */
25*7dd7cddfSDavid du Colombier #define CSTATE_START	100	/* after create_compress */
26*7dd7cddfSDavid du Colombier #define CSTATE_SCANNING	101	/* start_compress done, write_scanlines OK */
27*7dd7cddfSDavid du Colombier #define CSTATE_RAW_OK	102	/* start_compress done, write_raw_data OK */
28*7dd7cddfSDavid du Colombier #define CSTATE_WRCOEFS	103	/* jpeg_write_coefficients done */
29*7dd7cddfSDavid du Colombier #define DSTATE_START	200	/* after create_decompress */
30*7dd7cddfSDavid du Colombier #define DSTATE_INHEADER	201	/* reading header markers, no SOS yet */
31*7dd7cddfSDavid du Colombier #define DSTATE_READY	202	/* found SOS, ready for start_decompress */
32*7dd7cddfSDavid du Colombier #define DSTATE_PRELOAD	203	/* reading multiscan file in start_decompress*/
33*7dd7cddfSDavid du Colombier #define DSTATE_PRESCAN	204	/* performing dummy pass for 2-pass quant */
34*7dd7cddfSDavid du Colombier #define DSTATE_SCANNING	205	/* start_decompress done, read_scanlines OK */
35*7dd7cddfSDavid du Colombier #define DSTATE_RAW_OK	206	/* start_decompress done, read_raw_data OK */
36*7dd7cddfSDavid du Colombier #define DSTATE_BUFIMAGE	207	/* expecting jpeg_start_output */
37*7dd7cddfSDavid du Colombier #define DSTATE_BUFPOST	208	/* looking for SOS/EOI in jpeg_finish_output */
38*7dd7cddfSDavid du Colombier #define DSTATE_RDCOEFS	209	/* reading file in jpeg_read_coefficients */
39*7dd7cddfSDavid du Colombier #define DSTATE_STOPPING	210	/* looking for EOI in jpeg_finish_decompress */
40*7dd7cddfSDavid du Colombier 
41*7dd7cddfSDavid du Colombier 
42*7dd7cddfSDavid du Colombier /* Declarations for compression modules */
43*7dd7cddfSDavid du Colombier 
44*7dd7cddfSDavid du Colombier /* Master control module */
45*7dd7cddfSDavid du Colombier struct jpeg_comp_master {
46*7dd7cddfSDavid du Colombier   JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo));
47*7dd7cddfSDavid du Colombier   JMETHOD(void, pass_startup, (j_compress_ptr cinfo));
48*7dd7cddfSDavid du Colombier   JMETHOD(void, finish_pass, (j_compress_ptr cinfo));
49*7dd7cddfSDavid du Colombier 
50*7dd7cddfSDavid du Colombier   /* State variables made visible to other modules */
51*7dd7cddfSDavid du Colombier   boolean call_pass_startup;	/* True if pass_startup must be called */
52*7dd7cddfSDavid du Colombier   boolean is_last_pass;		/* True during last pass */
53*7dd7cddfSDavid du Colombier };
54*7dd7cddfSDavid du Colombier 
55*7dd7cddfSDavid du Colombier /* Main buffer control (downsampled-data buffer) */
56*7dd7cddfSDavid du Colombier struct jpeg_c_main_controller {
57*7dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
58*7dd7cddfSDavid du Colombier   JMETHOD(void, process_data, (j_compress_ptr cinfo,
59*7dd7cddfSDavid du Colombier 			       JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
60*7dd7cddfSDavid du Colombier 			       JDIMENSION in_rows_avail));
61*7dd7cddfSDavid du Colombier };
62*7dd7cddfSDavid du Colombier 
63*7dd7cddfSDavid du Colombier /* Compression preprocessing (downsampling input buffer control) */
64*7dd7cddfSDavid du Colombier struct jpeg_c_prep_controller {
65*7dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
66*7dd7cddfSDavid du Colombier   JMETHOD(void, pre_process_data, (j_compress_ptr cinfo,
67*7dd7cddfSDavid du Colombier 				   JSAMPARRAY input_buf,
68*7dd7cddfSDavid du Colombier 				   JDIMENSION *in_row_ctr,
69*7dd7cddfSDavid du Colombier 				   JDIMENSION in_rows_avail,
70*7dd7cddfSDavid du Colombier 				   JSAMPIMAGE output_buf,
71*7dd7cddfSDavid du Colombier 				   JDIMENSION *out_row_group_ctr,
72*7dd7cddfSDavid du Colombier 				   JDIMENSION out_row_groups_avail));
73*7dd7cddfSDavid du Colombier };
74*7dd7cddfSDavid du Colombier 
75*7dd7cddfSDavid du Colombier /* Coefficient buffer control */
76*7dd7cddfSDavid du Colombier struct jpeg_c_coef_controller {
77*7dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
78*7dd7cddfSDavid du Colombier   JMETHOD(boolean, compress_data, (j_compress_ptr cinfo,
79*7dd7cddfSDavid du Colombier 				   JSAMPIMAGE input_buf));
80*7dd7cddfSDavid du Colombier };
81*7dd7cddfSDavid du Colombier 
82*7dd7cddfSDavid du Colombier /* Colorspace conversion */
83*7dd7cddfSDavid du Colombier struct jpeg_color_converter {
84*7dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_compress_ptr cinfo));
85*7dd7cddfSDavid du Colombier   JMETHOD(void, color_convert, (j_compress_ptr cinfo,
86*7dd7cddfSDavid du Colombier 				JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
87*7dd7cddfSDavid du Colombier 				JDIMENSION output_row, int num_rows));
88*7dd7cddfSDavid du Colombier };
89*7dd7cddfSDavid du Colombier 
90*7dd7cddfSDavid du Colombier /* Downsampling */
91*7dd7cddfSDavid du Colombier struct jpeg_downsampler {
92*7dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_compress_ptr cinfo));
93*7dd7cddfSDavid du Colombier   JMETHOD(void, downsample, (j_compress_ptr cinfo,
94*7dd7cddfSDavid du Colombier 			     JSAMPIMAGE input_buf, JDIMENSION in_row_index,
95*7dd7cddfSDavid du Colombier 			     JSAMPIMAGE output_buf,
96*7dd7cddfSDavid du Colombier 			     JDIMENSION out_row_group_index));
97*7dd7cddfSDavid du Colombier 
98*7dd7cddfSDavid du Colombier   boolean need_context_rows;	/* TRUE if need rows above & below */
99*7dd7cddfSDavid du Colombier };
100*7dd7cddfSDavid du Colombier 
101*7dd7cddfSDavid du Colombier /* Forward DCT (also controls coefficient quantization) */
102*7dd7cddfSDavid du Colombier struct jpeg_forward_dct {
103*7dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_compress_ptr cinfo));
104*7dd7cddfSDavid du Colombier   /* perhaps this should be an array??? */
105*7dd7cddfSDavid du Colombier   JMETHOD(void, forward_DCT, (j_compress_ptr cinfo,
106*7dd7cddfSDavid du Colombier 			      jpeg_component_info * compptr,
107*7dd7cddfSDavid du Colombier 			      JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
108*7dd7cddfSDavid du Colombier 			      JDIMENSION start_row, JDIMENSION start_col,
109*7dd7cddfSDavid du Colombier 			      JDIMENSION num_blocks));
110*7dd7cddfSDavid du Colombier };
111*7dd7cddfSDavid du Colombier 
112*7dd7cddfSDavid du Colombier /* Entropy encoding */
113*7dd7cddfSDavid du Colombier struct jpeg_entropy_encoder {
114*7dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics));
115*7dd7cddfSDavid du Colombier   JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data));
116*7dd7cddfSDavid du Colombier   JMETHOD(void, finish_pass, (j_compress_ptr cinfo));
117*7dd7cddfSDavid du Colombier };
118*7dd7cddfSDavid du Colombier 
119*7dd7cddfSDavid du Colombier /* Marker writing */
120*7dd7cddfSDavid du Colombier struct jpeg_marker_writer {
121*7dd7cddfSDavid du Colombier   /* write_any_marker is exported for use by applications */
122*7dd7cddfSDavid du Colombier   /* Probably only COM and APPn markers should be written */
123*7dd7cddfSDavid du Colombier   JMETHOD(void, write_any_marker, (j_compress_ptr cinfo, int marker,
124*7dd7cddfSDavid du Colombier 				   const JOCTET *dataptr, unsigned int datalen));
125*7dd7cddfSDavid du Colombier   JMETHOD(void, write_file_header, (j_compress_ptr cinfo));
126*7dd7cddfSDavid du Colombier   JMETHOD(void, write_frame_header, (j_compress_ptr cinfo));
127*7dd7cddfSDavid du Colombier   JMETHOD(void, write_scan_header, (j_compress_ptr cinfo));
128*7dd7cddfSDavid du Colombier   JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo));
129*7dd7cddfSDavid du Colombier   JMETHOD(void, write_tables_only, (j_compress_ptr cinfo));
130*7dd7cddfSDavid du Colombier };
131*7dd7cddfSDavid du Colombier 
132*7dd7cddfSDavid du Colombier 
133*7dd7cddfSDavid du Colombier /* Declarations for decompression modules */
134*7dd7cddfSDavid du Colombier 
135*7dd7cddfSDavid du Colombier /* Master control module */
136*7dd7cddfSDavid du Colombier struct jpeg_decomp_master {
137*7dd7cddfSDavid du Colombier   JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo));
138*7dd7cddfSDavid du Colombier   JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo));
139*7dd7cddfSDavid du Colombier 
140*7dd7cddfSDavid du Colombier   /* State variables made visible to other modules */
141*7dd7cddfSDavid du Colombier   boolean is_dummy_pass;	/* True during 1st pass for 2-pass quant */
142*7dd7cddfSDavid du Colombier };
143*7dd7cddfSDavid du Colombier 
144*7dd7cddfSDavid du Colombier /* Input control module */
145*7dd7cddfSDavid du Colombier struct jpeg_input_controller {
146*7dd7cddfSDavid du Colombier   JMETHOD(int, consume_input, (j_decompress_ptr cinfo));
147*7dd7cddfSDavid du Colombier   JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo));
148*7dd7cddfSDavid du Colombier   JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));
149*7dd7cddfSDavid du Colombier   JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo));
150*7dd7cddfSDavid du Colombier 
151*7dd7cddfSDavid du Colombier   /* State variables made visible to other modules */
152*7dd7cddfSDavid du Colombier   boolean has_multiple_scans;	/* True if file has multiple scans */
153*7dd7cddfSDavid du Colombier   boolean eoi_reached;		/* True when EOI has been consumed */
154*7dd7cddfSDavid du Colombier };
155*7dd7cddfSDavid du Colombier 
156*7dd7cddfSDavid du Colombier /* Main buffer control (downsampled-data buffer) */
157*7dd7cddfSDavid du Colombier struct jpeg_d_main_controller {
158*7dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));
159*7dd7cddfSDavid du Colombier   JMETHOD(void, process_data, (j_decompress_ptr cinfo,
160*7dd7cddfSDavid du Colombier 			       JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
161*7dd7cddfSDavid du Colombier 			       JDIMENSION out_rows_avail));
162*7dd7cddfSDavid du Colombier };
163*7dd7cddfSDavid du Colombier 
164*7dd7cddfSDavid du Colombier /* Coefficient buffer control */
165*7dd7cddfSDavid du Colombier struct jpeg_d_coef_controller {
166*7dd7cddfSDavid du Colombier   JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));
167*7dd7cddfSDavid du Colombier   JMETHOD(int, consume_data, (j_decompress_ptr cinfo));
168*7dd7cddfSDavid du Colombier   JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo));
169*7dd7cddfSDavid du Colombier   JMETHOD(int, decompress_data, (j_decompress_ptr cinfo,
170*7dd7cddfSDavid du Colombier 				 JSAMPIMAGE output_buf));
171*7dd7cddfSDavid du Colombier   /* Pointer to array of coefficient virtual arrays, or NULL if none */
172*7dd7cddfSDavid du Colombier   jvirt_barray_ptr *coef_arrays;
173*7dd7cddfSDavid du Colombier };
174*7dd7cddfSDavid du Colombier 
175*7dd7cddfSDavid du Colombier /* Decompression postprocessing (color quantization buffer control) */
176*7dd7cddfSDavid du Colombier struct jpeg_d_post_controller {
177*7dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));
178*7dd7cddfSDavid du Colombier   JMETHOD(void, post_process_data, (j_decompress_ptr cinfo,
179*7dd7cddfSDavid du Colombier 				    JSAMPIMAGE input_buf,
180*7dd7cddfSDavid du Colombier 				    JDIMENSION *in_row_group_ctr,
181*7dd7cddfSDavid du Colombier 				    JDIMENSION in_row_groups_avail,
182*7dd7cddfSDavid du Colombier 				    JSAMPARRAY output_buf,
183*7dd7cddfSDavid du Colombier 				    JDIMENSION *out_row_ctr,
184*7dd7cddfSDavid du Colombier 				    JDIMENSION out_rows_avail));
185*7dd7cddfSDavid du Colombier };
186*7dd7cddfSDavid du Colombier 
187*7dd7cddfSDavid du Colombier /* Marker reading & parsing */
188*7dd7cddfSDavid du Colombier struct jpeg_marker_reader {
189*7dd7cddfSDavid du Colombier   JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo));
190*7dd7cddfSDavid du Colombier   /* Read markers until SOS or EOI.
191*7dd7cddfSDavid du Colombier    * Returns same codes as are defined for jpeg_consume_input:
192*7dd7cddfSDavid du Colombier    * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
193*7dd7cddfSDavid du Colombier    */
194*7dd7cddfSDavid du Colombier   JMETHOD(int, read_markers, (j_decompress_ptr cinfo));
195*7dd7cddfSDavid du Colombier   /* Read a restart marker --- exported for use by entropy decoder only */
196*7dd7cddfSDavid du Colombier   jpeg_marker_parser_method read_restart_marker;
197*7dd7cddfSDavid du Colombier   /* Application-overridable marker processing methods */
198*7dd7cddfSDavid du Colombier   jpeg_marker_parser_method process_COM;
199*7dd7cddfSDavid du Colombier   jpeg_marker_parser_method process_APPn[16];
200*7dd7cddfSDavid du Colombier 
201*7dd7cddfSDavid du Colombier   /* State of marker reader --- nominally internal, but applications
202*7dd7cddfSDavid du Colombier    * supplying COM or APPn handlers might like to know the state.
203*7dd7cddfSDavid du Colombier    */
204*7dd7cddfSDavid du Colombier   boolean saw_SOI;		/* found SOI? */
205*7dd7cddfSDavid du Colombier   boolean saw_SOF;		/* found SOF? */
206*7dd7cddfSDavid du Colombier   int next_restart_num;		/* next restart number expected (0-7) */
207*7dd7cddfSDavid du Colombier   unsigned int discarded_bytes;	/* # of bytes skipped looking for a marker */
208*7dd7cddfSDavid du Colombier };
209*7dd7cddfSDavid du Colombier 
210*7dd7cddfSDavid du Colombier /* Entropy decoding */
211*7dd7cddfSDavid du Colombier struct jpeg_entropy_decoder {
212*7dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
213*7dd7cddfSDavid du Colombier   JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo,
214*7dd7cddfSDavid du Colombier 				JBLOCKROW *MCU_data));
215*7dd7cddfSDavid du Colombier };
216*7dd7cddfSDavid du Colombier 
217*7dd7cddfSDavid du Colombier /* Inverse DCT (also performs dequantization) */
218*7dd7cddfSDavid du Colombier typedef JMETHOD(void, inverse_DCT_method_ptr,
219*7dd7cddfSDavid du Colombier 		(j_decompress_ptr cinfo, jpeg_component_info * compptr,
220*7dd7cddfSDavid du Colombier 		 JCOEFPTR coef_block,
221*7dd7cddfSDavid du Colombier 		 JSAMPARRAY output_buf, JDIMENSION output_col));
222*7dd7cddfSDavid du Colombier 
223*7dd7cddfSDavid du Colombier struct jpeg_inverse_dct {
224*7dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
225*7dd7cddfSDavid du Colombier   /* It is useful to allow each component to have a separate IDCT method. */
226*7dd7cddfSDavid du Colombier   inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS];
227*7dd7cddfSDavid du Colombier };
228*7dd7cddfSDavid du Colombier 
229*7dd7cddfSDavid du Colombier /* Upsampling (note that upsampler must also call color converter) */
230*7dd7cddfSDavid du Colombier struct jpeg_upsampler {
231*7dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
232*7dd7cddfSDavid du Colombier   JMETHOD(void, upsample, (j_decompress_ptr cinfo,
233*7dd7cddfSDavid du Colombier 			   JSAMPIMAGE input_buf,
234*7dd7cddfSDavid du Colombier 			   JDIMENSION *in_row_group_ctr,
235*7dd7cddfSDavid du Colombier 			   JDIMENSION in_row_groups_avail,
236*7dd7cddfSDavid du Colombier 			   JSAMPARRAY output_buf,
237*7dd7cddfSDavid du Colombier 			   JDIMENSION *out_row_ctr,
238*7dd7cddfSDavid du Colombier 			   JDIMENSION out_rows_avail));
239*7dd7cddfSDavid du Colombier 
240*7dd7cddfSDavid du Colombier   boolean need_context_rows;	/* TRUE if need rows above & below */
241*7dd7cddfSDavid du Colombier };
242*7dd7cddfSDavid du Colombier 
243*7dd7cddfSDavid du Colombier /* Colorspace conversion */
244*7dd7cddfSDavid du Colombier struct jpeg_color_deconverter {
245*7dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
246*7dd7cddfSDavid du Colombier   JMETHOD(void, color_convert, (j_decompress_ptr cinfo,
247*7dd7cddfSDavid du Colombier 				JSAMPIMAGE input_buf, JDIMENSION input_row,
248*7dd7cddfSDavid du Colombier 				JSAMPARRAY output_buf, int num_rows));
249*7dd7cddfSDavid du Colombier };
250*7dd7cddfSDavid du Colombier 
251*7dd7cddfSDavid du Colombier /* Color quantization or color precision reduction */
252*7dd7cddfSDavid du Colombier struct jpeg_color_quantizer {
253*7dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan));
254*7dd7cddfSDavid du Colombier   JMETHOD(void, color_quantize, (j_decompress_ptr cinfo,
255*7dd7cddfSDavid du Colombier 				 JSAMPARRAY input_buf, JSAMPARRAY output_buf,
256*7dd7cddfSDavid du Colombier 				 int num_rows));
257*7dd7cddfSDavid du Colombier   JMETHOD(void, finish_pass, (j_decompress_ptr cinfo));
258*7dd7cddfSDavid du Colombier   JMETHOD(void, new_color_map, (j_decompress_ptr cinfo));
259*7dd7cddfSDavid du Colombier };
260*7dd7cddfSDavid du Colombier 
261*7dd7cddfSDavid du Colombier 
262*7dd7cddfSDavid du Colombier /* Miscellaneous useful macros */
263*7dd7cddfSDavid du Colombier 
264*7dd7cddfSDavid du Colombier #undef MAX
265*7dd7cddfSDavid du Colombier #define MAX(a,b)	((a) > (b) ? (a) : (b))
266*7dd7cddfSDavid du Colombier #undef MIN
267*7dd7cddfSDavid du Colombier #define MIN(a,b)	((a) < (b) ? (a) : (b))
268*7dd7cddfSDavid du Colombier 
269*7dd7cddfSDavid du Colombier 
270*7dd7cddfSDavid du Colombier /* We assume that right shift corresponds to signed division by 2 with
271*7dd7cddfSDavid du Colombier  * rounding towards minus infinity.  This is correct for typical "arithmetic
272*7dd7cddfSDavid du Colombier  * shift" instructions that shift in copies of the sign bit.  But some
273*7dd7cddfSDavid du Colombier  * C compilers implement >> with an unsigned shift.  For these machines you
274*7dd7cddfSDavid du Colombier  * must define RIGHT_SHIFT_IS_UNSIGNED.
275*7dd7cddfSDavid du Colombier  * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity.
276*7dd7cddfSDavid du Colombier  * It is only applied with constant shift counts.  SHIFT_TEMPS must be
277*7dd7cddfSDavid du Colombier  * included in the variables of any routine using RIGHT_SHIFT.
278*7dd7cddfSDavid du Colombier  */
279*7dd7cddfSDavid du Colombier 
280*7dd7cddfSDavid du Colombier #ifdef RIGHT_SHIFT_IS_UNSIGNED
281*7dd7cddfSDavid du Colombier #define SHIFT_TEMPS	INT32 shift_temp;
282*7dd7cddfSDavid du Colombier #define RIGHT_SHIFT(x,shft)  \
283*7dd7cddfSDavid du Colombier 	((shift_temp = (x)) < 0 ? \
284*7dd7cddfSDavid du Colombier 	 (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \
285*7dd7cddfSDavid du Colombier 	 (shift_temp >> (shft)))
286*7dd7cddfSDavid du Colombier #else
287*7dd7cddfSDavid du Colombier #define SHIFT_TEMPS
288*7dd7cddfSDavid du Colombier #define RIGHT_SHIFT(x,shft)	((x) >> (shft))
289*7dd7cddfSDavid du Colombier #endif
290*7dd7cddfSDavid du Colombier 
291*7dd7cddfSDavid du Colombier 
292*7dd7cddfSDavid du Colombier /* Short forms of external names for systems with brain-damaged linkers. */
293*7dd7cddfSDavid du Colombier 
294*7dd7cddfSDavid du Colombier #ifdef NEED_SHORT_EXTERNAL_NAMES
295*7dd7cddfSDavid du Colombier #define jinit_compress_master	jICompress
296*7dd7cddfSDavid du Colombier #define jinit_c_master_control	jICMaster
297*7dd7cddfSDavid du Colombier #define jinit_c_main_controller	jICMainC
298*7dd7cddfSDavid du Colombier #define jinit_c_prep_controller	jICPrepC
299*7dd7cddfSDavid du Colombier #define jinit_c_coef_controller	jICCoefC
300*7dd7cddfSDavid du Colombier #define jinit_color_converter	jICColor
301*7dd7cddfSDavid du Colombier #define jinit_downsampler	jIDownsampler
302*7dd7cddfSDavid du Colombier #define jinit_forward_dct	jIFDCT
303*7dd7cddfSDavid du Colombier #define jinit_huff_encoder	jIHEncoder
304*7dd7cddfSDavid du Colombier #define jinit_phuff_encoder	jIPHEncoder
305*7dd7cddfSDavid du Colombier #define jinit_marker_writer	jIMWriter
306*7dd7cddfSDavid du Colombier #define jinit_master_decompress	jIDMaster
307*7dd7cddfSDavid du Colombier #define jinit_d_main_controller	jIDMainC
308*7dd7cddfSDavid du Colombier #define jinit_d_coef_controller	jIDCoefC
309*7dd7cddfSDavid du Colombier #define jinit_d_post_controller	jIDPostC
310*7dd7cddfSDavid du Colombier #define jinit_input_controller	jIInCtlr
311*7dd7cddfSDavid du Colombier #define jinit_marker_reader	jIMReader
312*7dd7cddfSDavid du Colombier #define jinit_huff_decoder	jIHDecoder
313*7dd7cddfSDavid du Colombier #define jinit_phuff_decoder	jIPHDecoder
314*7dd7cddfSDavid du Colombier #define jinit_inverse_dct	jIIDCT
315*7dd7cddfSDavid du Colombier #define jinit_upsampler		jIUpsampler
316*7dd7cddfSDavid du Colombier #define jinit_color_deconverter	jIDColor
317*7dd7cddfSDavid du Colombier #define jinit_1pass_quantizer	jI1Quant
318*7dd7cddfSDavid du Colombier #define jinit_2pass_quantizer	jI2Quant
319*7dd7cddfSDavid du Colombier #define jinit_merged_upsampler	jIMUpsampler
320*7dd7cddfSDavid du Colombier #define jinit_memory_mgr	jIMemMgr
321*7dd7cddfSDavid du Colombier #define jdiv_round_up		jDivRound
322*7dd7cddfSDavid du Colombier #define jround_up		jRound
323*7dd7cddfSDavid du Colombier #define jcopy_sample_rows	jCopySamples
324*7dd7cddfSDavid du Colombier #define jcopy_block_row		jCopyBlocks
325*7dd7cddfSDavid du Colombier #define jzero_far		jZeroFar
326*7dd7cddfSDavid du Colombier #define jpeg_zigzag_order	jZIGTable
327*7dd7cddfSDavid du Colombier #define jpeg_natural_order	jZAGTable
328*7dd7cddfSDavid du Colombier #endif /* NEED_SHORT_EXTERNAL_NAMES */
329*7dd7cddfSDavid du Colombier 
330*7dd7cddfSDavid du Colombier 
331*7dd7cddfSDavid du Colombier /* Compression module initialization routines */
332*7dd7cddfSDavid du Colombier EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo));
333*7dd7cddfSDavid du Colombier EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo,
334*7dd7cddfSDavid du Colombier 					 boolean transcode_only));
335*7dd7cddfSDavid du Colombier EXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo,
336*7dd7cddfSDavid du Colombier 					  boolean need_full_buffer));
337*7dd7cddfSDavid du Colombier EXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo,
338*7dd7cddfSDavid du Colombier 					  boolean need_full_buffer));
339*7dd7cddfSDavid du Colombier EXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo,
340*7dd7cddfSDavid du Colombier 					  boolean need_full_buffer));
341*7dd7cddfSDavid du Colombier EXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo));
342*7dd7cddfSDavid du Colombier EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo));
343*7dd7cddfSDavid du Colombier EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo));
344*7dd7cddfSDavid du Colombier EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo));
345*7dd7cddfSDavid du Colombier EXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo));
346*7dd7cddfSDavid du Colombier EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo));
347*7dd7cddfSDavid du Colombier /* Decompression module initialization routines */
348*7dd7cddfSDavid du Colombier EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo));
349*7dd7cddfSDavid du Colombier EXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo,
350*7dd7cddfSDavid du Colombier 					  boolean need_full_buffer));
351*7dd7cddfSDavid du Colombier EXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo,
352*7dd7cddfSDavid du Colombier 					  boolean need_full_buffer));
353*7dd7cddfSDavid du Colombier EXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo,
354*7dd7cddfSDavid du Colombier 					  boolean need_full_buffer));
355*7dd7cddfSDavid du Colombier EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo));
356*7dd7cddfSDavid du Colombier EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo));
357*7dd7cddfSDavid du Colombier EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo));
358*7dd7cddfSDavid du Colombier EXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo));
359*7dd7cddfSDavid du Colombier EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo));
360*7dd7cddfSDavid du Colombier EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo));
361*7dd7cddfSDavid du Colombier EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo));
362*7dd7cddfSDavid du Colombier EXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo));
363*7dd7cddfSDavid du Colombier EXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo));
364*7dd7cddfSDavid du Colombier EXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo));
365*7dd7cddfSDavid du Colombier /* Memory manager initialization */
366*7dd7cddfSDavid du Colombier EXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo));
367*7dd7cddfSDavid du Colombier 
368*7dd7cddfSDavid du Colombier /* Utility routines in jutils.c */
369*7dd7cddfSDavid du Colombier EXTERN(long) jdiv_round_up JPP((long a, long b));
370*7dd7cddfSDavid du Colombier EXTERN(long) jround_up JPP((long a, long b));
371*7dd7cddfSDavid du Colombier EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row,
372*7dd7cddfSDavid du Colombier 				    JSAMPARRAY output_array, int dest_row,
373*7dd7cddfSDavid du Colombier 				    int num_rows, JDIMENSION num_cols));
374*7dd7cddfSDavid du Colombier EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row,
375*7dd7cddfSDavid du Colombier 				  JDIMENSION num_blocks));
376*7dd7cddfSDavid du Colombier EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero));
377*7dd7cddfSDavid du Colombier /* Constant tables in jutils.c */
378*7dd7cddfSDavid du Colombier extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */
379*7dd7cddfSDavid du Colombier extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */
380*7dd7cddfSDavid du Colombier 
381*7dd7cddfSDavid du Colombier /* Suppress undefined-structure complaints if necessary. */
382*7dd7cddfSDavid du Colombier 
383*7dd7cddfSDavid du Colombier #ifdef INCOMPLETE_TYPES_BROKEN
384*7dd7cddfSDavid du Colombier #ifndef AM_MEMORY_MANAGER	/* only jmemmgr.c defines these */
385*7dd7cddfSDavid du Colombier struct jvirt_sarray_control { long dummy; };
386*7dd7cddfSDavid du Colombier struct jvirt_barray_control { long dummy; };
387*7dd7cddfSDavid du Colombier #endif
388*7dd7cddfSDavid du Colombier #endif /* INCOMPLETE_TYPES_BROKEN */
389