xref: /plan9/sys/src/cmd/gs/jpeg/jpegint.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
17dd7cddfSDavid du Colombier /*
27dd7cddfSDavid du Colombier  * jpegint.h
37dd7cddfSDavid du Colombier  *
4*593dc095SDavid du Colombier  * Copyright (C) 1991-1997, Thomas G. Lane.
57dd7cddfSDavid du Colombier  * This file is part of the Independent JPEG Group's software.
67dd7cddfSDavid du Colombier  * For conditions of distribution and use, see the accompanying README file.
77dd7cddfSDavid du Colombier  *
87dd7cddfSDavid du Colombier  * This file provides common declarations for the various JPEG modules.
97dd7cddfSDavid du Colombier  * These declarations are considered internal to the JPEG library; most
107dd7cddfSDavid du Colombier  * applications using the library shouldn't need to include this file.
117dd7cddfSDavid du Colombier  */
127dd7cddfSDavid du Colombier 
137dd7cddfSDavid du Colombier 
147dd7cddfSDavid du Colombier /* Declarations for both compression & decompression */
157dd7cddfSDavid du Colombier 
167dd7cddfSDavid du Colombier typedef enum {			/* Operating modes for buffer controllers */
177dd7cddfSDavid du Colombier 	JBUF_PASS_THRU,		/* Plain stripwise operation */
187dd7cddfSDavid du Colombier 	/* Remaining modes require a full-image buffer to have been created */
197dd7cddfSDavid du Colombier 	JBUF_SAVE_SOURCE,	/* Run source subobject only, save output */
207dd7cddfSDavid du Colombier 	JBUF_CRANK_DEST,	/* Run dest subobject only, using saved data */
217dd7cddfSDavid du Colombier 	JBUF_SAVE_AND_PASS	/* Run both subobjects, save output */
227dd7cddfSDavid du Colombier } J_BUF_MODE;
237dd7cddfSDavid du Colombier 
247dd7cddfSDavid du Colombier /* Values of global_state field (jdapi.c has some dependencies on ordering!) */
257dd7cddfSDavid du Colombier #define CSTATE_START	100	/* after create_compress */
267dd7cddfSDavid du Colombier #define CSTATE_SCANNING	101	/* start_compress done, write_scanlines OK */
277dd7cddfSDavid du Colombier #define CSTATE_RAW_OK	102	/* start_compress done, write_raw_data OK */
287dd7cddfSDavid du Colombier #define CSTATE_WRCOEFS	103	/* jpeg_write_coefficients done */
297dd7cddfSDavid du Colombier #define DSTATE_START	200	/* after create_decompress */
307dd7cddfSDavid du Colombier #define DSTATE_INHEADER	201	/* reading header markers, no SOS yet */
317dd7cddfSDavid du Colombier #define DSTATE_READY	202	/* found SOS, ready for start_decompress */
327dd7cddfSDavid du Colombier #define DSTATE_PRELOAD	203	/* reading multiscan file in start_decompress*/
337dd7cddfSDavid du Colombier #define DSTATE_PRESCAN	204	/* performing dummy pass for 2-pass quant */
347dd7cddfSDavid du Colombier #define DSTATE_SCANNING	205	/* start_decompress done, read_scanlines OK */
357dd7cddfSDavid du Colombier #define DSTATE_RAW_OK	206	/* start_decompress done, read_raw_data OK */
367dd7cddfSDavid du Colombier #define DSTATE_BUFIMAGE	207	/* expecting jpeg_start_output */
377dd7cddfSDavid du Colombier #define DSTATE_BUFPOST	208	/* looking for SOS/EOI in jpeg_finish_output */
387dd7cddfSDavid du Colombier #define DSTATE_RDCOEFS	209	/* reading file in jpeg_read_coefficients */
397dd7cddfSDavid du Colombier #define DSTATE_STOPPING	210	/* looking for EOI in jpeg_finish_decompress */
407dd7cddfSDavid du Colombier 
417dd7cddfSDavid du Colombier 
427dd7cddfSDavid du Colombier /* Declarations for compression modules */
437dd7cddfSDavid du Colombier 
447dd7cddfSDavid du Colombier /* Master control module */
457dd7cddfSDavid du Colombier struct jpeg_comp_master {
467dd7cddfSDavid du Colombier   JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo));
477dd7cddfSDavid du Colombier   JMETHOD(void, pass_startup, (j_compress_ptr cinfo));
487dd7cddfSDavid du Colombier   JMETHOD(void, finish_pass, (j_compress_ptr cinfo));
497dd7cddfSDavid du Colombier 
507dd7cddfSDavid du Colombier   /* State variables made visible to other modules */
517dd7cddfSDavid du Colombier   boolean call_pass_startup;	/* True if pass_startup must be called */
527dd7cddfSDavid du Colombier   boolean is_last_pass;		/* True during last pass */
537dd7cddfSDavid du Colombier };
547dd7cddfSDavid du Colombier 
557dd7cddfSDavid du Colombier /* Main buffer control (downsampled-data buffer) */
567dd7cddfSDavid du Colombier struct jpeg_c_main_controller {
577dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
587dd7cddfSDavid du Colombier   JMETHOD(void, process_data, (j_compress_ptr cinfo,
597dd7cddfSDavid du Colombier 			       JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
607dd7cddfSDavid du Colombier 			       JDIMENSION in_rows_avail));
617dd7cddfSDavid du Colombier };
627dd7cddfSDavid du Colombier 
637dd7cddfSDavid du Colombier /* Compression preprocessing (downsampling input buffer control) */
647dd7cddfSDavid du Colombier struct jpeg_c_prep_controller {
657dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
667dd7cddfSDavid du Colombier   JMETHOD(void, pre_process_data, (j_compress_ptr cinfo,
677dd7cddfSDavid du Colombier 				   JSAMPARRAY input_buf,
687dd7cddfSDavid du Colombier 				   JDIMENSION *in_row_ctr,
697dd7cddfSDavid du Colombier 				   JDIMENSION in_rows_avail,
707dd7cddfSDavid du Colombier 				   JSAMPIMAGE output_buf,
717dd7cddfSDavid du Colombier 				   JDIMENSION *out_row_group_ctr,
727dd7cddfSDavid du Colombier 				   JDIMENSION out_row_groups_avail));
737dd7cddfSDavid du Colombier };
747dd7cddfSDavid du Colombier 
757dd7cddfSDavid du Colombier /* Coefficient buffer control */
767dd7cddfSDavid du Colombier struct jpeg_c_coef_controller {
777dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
787dd7cddfSDavid du Colombier   JMETHOD(boolean, compress_data, (j_compress_ptr cinfo,
797dd7cddfSDavid du Colombier 				   JSAMPIMAGE input_buf));
807dd7cddfSDavid du Colombier };
817dd7cddfSDavid du Colombier 
827dd7cddfSDavid du Colombier /* Colorspace conversion */
837dd7cddfSDavid du Colombier struct jpeg_color_converter {
847dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_compress_ptr cinfo));
857dd7cddfSDavid du Colombier   JMETHOD(void, color_convert, (j_compress_ptr cinfo,
867dd7cddfSDavid du Colombier 				JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
877dd7cddfSDavid du Colombier 				JDIMENSION output_row, int num_rows));
887dd7cddfSDavid du Colombier };
897dd7cddfSDavid du Colombier 
907dd7cddfSDavid du Colombier /* Downsampling */
917dd7cddfSDavid du Colombier struct jpeg_downsampler {
927dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_compress_ptr cinfo));
937dd7cddfSDavid du Colombier   JMETHOD(void, downsample, (j_compress_ptr cinfo,
947dd7cddfSDavid du Colombier 			     JSAMPIMAGE input_buf, JDIMENSION in_row_index,
957dd7cddfSDavid du Colombier 			     JSAMPIMAGE output_buf,
967dd7cddfSDavid du Colombier 			     JDIMENSION out_row_group_index));
977dd7cddfSDavid du Colombier 
987dd7cddfSDavid du Colombier   boolean need_context_rows;	/* TRUE if need rows above & below */
997dd7cddfSDavid du Colombier };
1007dd7cddfSDavid du Colombier 
1017dd7cddfSDavid du Colombier /* Forward DCT (also controls coefficient quantization) */
1027dd7cddfSDavid du Colombier struct jpeg_forward_dct {
1037dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_compress_ptr cinfo));
1047dd7cddfSDavid du Colombier   /* perhaps this should be an array??? */
1057dd7cddfSDavid du Colombier   JMETHOD(void, forward_DCT, (j_compress_ptr cinfo,
1067dd7cddfSDavid du Colombier 			      jpeg_component_info * compptr,
1077dd7cddfSDavid du Colombier 			      JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
1087dd7cddfSDavid du Colombier 			      JDIMENSION start_row, JDIMENSION start_col,
1097dd7cddfSDavid du Colombier 			      JDIMENSION num_blocks));
1107dd7cddfSDavid du Colombier };
1117dd7cddfSDavid du Colombier 
1127dd7cddfSDavid du Colombier /* Entropy encoding */
1137dd7cddfSDavid du Colombier struct jpeg_entropy_encoder {
1147dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics));
1157dd7cddfSDavid du Colombier   JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data));
1167dd7cddfSDavid du Colombier   JMETHOD(void, finish_pass, (j_compress_ptr cinfo));
1177dd7cddfSDavid du Colombier };
1187dd7cddfSDavid du Colombier 
1197dd7cddfSDavid du Colombier /* Marker writing */
1207dd7cddfSDavid du Colombier struct jpeg_marker_writer {
1217dd7cddfSDavid du Colombier   JMETHOD(void, write_file_header, (j_compress_ptr cinfo));
1227dd7cddfSDavid du Colombier   JMETHOD(void, write_frame_header, (j_compress_ptr cinfo));
1237dd7cddfSDavid du Colombier   JMETHOD(void, write_scan_header, (j_compress_ptr cinfo));
1247dd7cddfSDavid du Colombier   JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo));
1257dd7cddfSDavid du Colombier   JMETHOD(void, write_tables_only, (j_compress_ptr cinfo));
126*593dc095SDavid du Colombier   /* These routines are exported to allow insertion of extra markers */
127*593dc095SDavid du Colombier   /* Probably only COM and APPn markers should be written this way */
128*593dc095SDavid du Colombier   JMETHOD(void, write_marker_header, (j_compress_ptr cinfo, int marker,
129*593dc095SDavid du Colombier 				      unsigned int datalen));
130*593dc095SDavid du Colombier   JMETHOD(void, write_marker_byte, (j_compress_ptr cinfo, int val));
1317dd7cddfSDavid du Colombier };
1327dd7cddfSDavid du Colombier 
1337dd7cddfSDavid du Colombier 
1347dd7cddfSDavid du Colombier /* Declarations for decompression modules */
1357dd7cddfSDavid du Colombier 
1367dd7cddfSDavid du Colombier /* Master control module */
1377dd7cddfSDavid du Colombier struct jpeg_decomp_master {
1387dd7cddfSDavid du Colombier   JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo));
1397dd7cddfSDavid du Colombier   JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo));
1407dd7cddfSDavid du Colombier 
1417dd7cddfSDavid du Colombier   /* State variables made visible to other modules */
1427dd7cddfSDavid du Colombier   boolean is_dummy_pass;	/* True during 1st pass for 2-pass quant */
1437dd7cddfSDavid du Colombier };
1447dd7cddfSDavid du Colombier 
1457dd7cddfSDavid du Colombier /* Input control module */
1467dd7cddfSDavid du Colombier struct jpeg_input_controller {
1477dd7cddfSDavid du Colombier   JMETHOD(int, consume_input, (j_decompress_ptr cinfo));
1487dd7cddfSDavid du Colombier   JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo));
1497dd7cddfSDavid du Colombier   JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));
1507dd7cddfSDavid du Colombier   JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo));
1517dd7cddfSDavid du Colombier 
1527dd7cddfSDavid du Colombier   /* State variables made visible to other modules */
1537dd7cddfSDavid du Colombier   boolean has_multiple_scans;	/* True if file has multiple scans */
1547dd7cddfSDavid du Colombier   boolean eoi_reached;		/* True when EOI has been consumed */
1557dd7cddfSDavid du Colombier };
1567dd7cddfSDavid du Colombier 
1577dd7cddfSDavid du Colombier /* Main buffer control (downsampled-data buffer) */
1587dd7cddfSDavid du Colombier struct jpeg_d_main_controller {
1597dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));
1607dd7cddfSDavid du Colombier   JMETHOD(void, process_data, (j_decompress_ptr cinfo,
1617dd7cddfSDavid du Colombier 			       JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
1627dd7cddfSDavid du Colombier 			       JDIMENSION out_rows_avail));
1637dd7cddfSDavid du Colombier };
1647dd7cddfSDavid du Colombier 
1657dd7cddfSDavid du Colombier /* Coefficient buffer control */
1667dd7cddfSDavid du Colombier struct jpeg_d_coef_controller {
1677dd7cddfSDavid du Colombier   JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));
1687dd7cddfSDavid du Colombier   JMETHOD(int, consume_data, (j_decompress_ptr cinfo));
1697dd7cddfSDavid du Colombier   JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo));
1707dd7cddfSDavid du Colombier   JMETHOD(int, decompress_data, (j_decompress_ptr cinfo,
1717dd7cddfSDavid du Colombier 				 JSAMPIMAGE output_buf));
1727dd7cddfSDavid du Colombier   /* Pointer to array of coefficient virtual arrays, or NULL if none */
1737dd7cddfSDavid du Colombier   jvirt_barray_ptr *coef_arrays;
1747dd7cddfSDavid du Colombier };
1757dd7cddfSDavid du Colombier 
1767dd7cddfSDavid du Colombier /* Decompression postprocessing (color quantization buffer control) */
1777dd7cddfSDavid du Colombier struct jpeg_d_post_controller {
1787dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));
1797dd7cddfSDavid du Colombier   JMETHOD(void, post_process_data, (j_decompress_ptr cinfo,
1807dd7cddfSDavid du Colombier 				    JSAMPIMAGE input_buf,
1817dd7cddfSDavid du Colombier 				    JDIMENSION *in_row_group_ctr,
1827dd7cddfSDavid du Colombier 				    JDIMENSION in_row_groups_avail,
1837dd7cddfSDavid du Colombier 				    JSAMPARRAY output_buf,
1847dd7cddfSDavid du Colombier 				    JDIMENSION *out_row_ctr,
1857dd7cddfSDavid du Colombier 				    JDIMENSION out_rows_avail));
1867dd7cddfSDavid du Colombier };
1877dd7cddfSDavid du Colombier 
1887dd7cddfSDavid du Colombier /* Marker reading & parsing */
1897dd7cddfSDavid du Colombier struct jpeg_marker_reader {
1907dd7cddfSDavid du Colombier   JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo));
1917dd7cddfSDavid du Colombier   /* Read markers until SOS or EOI.
1927dd7cddfSDavid du Colombier    * Returns same codes as are defined for jpeg_consume_input:
1937dd7cddfSDavid du Colombier    * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
1947dd7cddfSDavid du Colombier    */
1957dd7cddfSDavid du Colombier   JMETHOD(int, read_markers, (j_decompress_ptr cinfo));
1967dd7cddfSDavid du Colombier   /* Read a restart marker --- exported for use by entropy decoder only */
1977dd7cddfSDavid du Colombier   jpeg_marker_parser_method read_restart_marker;
1987dd7cddfSDavid du Colombier 
1997dd7cddfSDavid du Colombier   /* State of marker reader --- nominally internal, but applications
2007dd7cddfSDavid du Colombier    * supplying COM or APPn handlers might like to know the state.
2017dd7cddfSDavid du Colombier    */
2027dd7cddfSDavid du Colombier   boolean saw_SOI;		/* found SOI? */
2037dd7cddfSDavid du Colombier   boolean saw_SOF;		/* found SOF? */
2047dd7cddfSDavid du Colombier   int next_restart_num;		/* next restart number expected (0-7) */
2057dd7cddfSDavid du Colombier   unsigned int discarded_bytes;	/* # of bytes skipped looking for a marker */
2067dd7cddfSDavid du Colombier };
2077dd7cddfSDavid du Colombier 
2087dd7cddfSDavid du Colombier /* Entropy decoding */
2097dd7cddfSDavid du Colombier struct jpeg_entropy_decoder {
2107dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
2117dd7cddfSDavid du Colombier   JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo,
2127dd7cddfSDavid du Colombier 				JBLOCKROW *MCU_data));
213*593dc095SDavid du Colombier 
214*593dc095SDavid du Colombier   /* This is here to share code between baseline and progressive decoders; */
215*593dc095SDavid du Colombier   /* other modules probably should not use it */
216*593dc095SDavid du Colombier   boolean insufficient_data;	/* set TRUE after emitting warning */
2177dd7cddfSDavid du Colombier };
2187dd7cddfSDavid du Colombier 
2197dd7cddfSDavid du Colombier /* Inverse DCT (also performs dequantization) */
2207dd7cddfSDavid du Colombier typedef JMETHOD(void, inverse_DCT_method_ptr,
2217dd7cddfSDavid du Colombier 		(j_decompress_ptr cinfo, jpeg_component_info * compptr,
2227dd7cddfSDavid du Colombier 		 JCOEFPTR coef_block,
2237dd7cddfSDavid du Colombier 		 JSAMPARRAY output_buf, JDIMENSION output_col));
2247dd7cddfSDavid du Colombier 
2257dd7cddfSDavid du Colombier struct jpeg_inverse_dct {
2267dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
2277dd7cddfSDavid du Colombier   /* It is useful to allow each component to have a separate IDCT method. */
2287dd7cddfSDavid du Colombier   inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS];
2297dd7cddfSDavid du Colombier };
2307dd7cddfSDavid du Colombier 
2317dd7cddfSDavid du Colombier /* Upsampling (note that upsampler must also call color converter) */
2327dd7cddfSDavid du Colombier struct jpeg_upsampler {
2337dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
2347dd7cddfSDavid du Colombier   JMETHOD(void, upsample, (j_decompress_ptr cinfo,
2357dd7cddfSDavid du Colombier 			   JSAMPIMAGE input_buf,
2367dd7cddfSDavid du Colombier 			   JDIMENSION *in_row_group_ctr,
2377dd7cddfSDavid du Colombier 			   JDIMENSION in_row_groups_avail,
2387dd7cddfSDavid du Colombier 			   JSAMPARRAY output_buf,
2397dd7cddfSDavid du Colombier 			   JDIMENSION *out_row_ctr,
2407dd7cddfSDavid du Colombier 			   JDIMENSION out_rows_avail));
2417dd7cddfSDavid du Colombier 
2427dd7cddfSDavid du Colombier   boolean need_context_rows;	/* TRUE if need rows above & below */
2437dd7cddfSDavid du Colombier };
2447dd7cddfSDavid du Colombier 
2457dd7cddfSDavid du Colombier /* Colorspace conversion */
2467dd7cddfSDavid du Colombier struct jpeg_color_deconverter {
2477dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
2487dd7cddfSDavid du Colombier   JMETHOD(void, color_convert, (j_decompress_ptr cinfo,
2497dd7cddfSDavid du Colombier 				JSAMPIMAGE input_buf, JDIMENSION input_row,
2507dd7cddfSDavid du Colombier 				JSAMPARRAY output_buf, int num_rows));
2517dd7cddfSDavid du Colombier };
2527dd7cddfSDavid du Colombier 
2537dd7cddfSDavid du Colombier /* Color quantization or color precision reduction */
2547dd7cddfSDavid du Colombier struct jpeg_color_quantizer {
2557dd7cddfSDavid du Colombier   JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan));
2567dd7cddfSDavid du Colombier   JMETHOD(void, color_quantize, (j_decompress_ptr cinfo,
2577dd7cddfSDavid du Colombier 				 JSAMPARRAY input_buf, JSAMPARRAY output_buf,
2587dd7cddfSDavid du Colombier 				 int num_rows));
2597dd7cddfSDavid du Colombier   JMETHOD(void, finish_pass, (j_decompress_ptr cinfo));
2607dd7cddfSDavid du Colombier   JMETHOD(void, new_color_map, (j_decompress_ptr cinfo));
2617dd7cddfSDavid du Colombier };
2627dd7cddfSDavid du Colombier 
2637dd7cddfSDavid du Colombier 
2647dd7cddfSDavid du Colombier /* Miscellaneous useful macros */
2657dd7cddfSDavid du Colombier 
2667dd7cddfSDavid du Colombier #undef MAX
2677dd7cddfSDavid du Colombier #define MAX(a,b)	((a) > (b) ? (a) : (b))
2687dd7cddfSDavid du Colombier #undef MIN
2697dd7cddfSDavid du Colombier #define MIN(a,b)	((a) < (b) ? (a) : (b))
2707dd7cddfSDavid du Colombier 
2717dd7cddfSDavid du Colombier 
2727dd7cddfSDavid du Colombier /* We assume that right shift corresponds to signed division by 2 with
2737dd7cddfSDavid du Colombier  * rounding towards minus infinity.  This is correct for typical "arithmetic
2747dd7cddfSDavid du Colombier  * shift" instructions that shift in copies of the sign bit.  But some
2757dd7cddfSDavid du Colombier  * C compilers implement >> with an unsigned shift.  For these machines you
2767dd7cddfSDavid du Colombier  * must define RIGHT_SHIFT_IS_UNSIGNED.
2777dd7cddfSDavid du Colombier  * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity.
2787dd7cddfSDavid du Colombier  * It is only applied with constant shift counts.  SHIFT_TEMPS must be
2797dd7cddfSDavid du Colombier  * included in the variables of any routine using RIGHT_SHIFT.
2807dd7cddfSDavid du Colombier  */
2817dd7cddfSDavid du Colombier 
2827dd7cddfSDavid du Colombier #ifdef RIGHT_SHIFT_IS_UNSIGNED
2837dd7cddfSDavid du Colombier #define SHIFT_TEMPS	INT32 shift_temp;
2847dd7cddfSDavid du Colombier #define RIGHT_SHIFT(x,shft)  \
2857dd7cddfSDavid du Colombier 	((shift_temp = (x)) < 0 ? \
2867dd7cddfSDavid du Colombier 	 (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \
2877dd7cddfSDavid du Colombier 	 (shift_temp >> (shft)))
2887dd7cddfSDavid du Colombier #else
2897dd7cddfSDavid du Colombier #define SHIFT_TEMPS
2907dd7cddfSDavid du Colombier #define RIGHT_SHIFT(x,shft)	((x) >> (shft))
2917dd7cddfSDavid du Colombier #endif
2927dd7cddfSDavid du Colombier 
2937dd7cddfSDavid du Colombier 
2947dd7cddfSDavid du Colombier /* Short forms of external names for systems with brain-damaged linkers. */
2957dd7cddfSDavid du Colombier 
2967dd7cddfSDavid du Colombier #ifdef NEED_SHORT_EXTERNAL_NAMES
2977dd7cddfSDavid du Colombier #define jinit_compress_master	jICompress
2987dd7cddfSDavid du Colombier #define jinit_c_master_control	jICMaster
2997dd7cddfSDavid du Colombier #define jinit_c_main_controller	jICMainC
3007dd7cddfSDavid du Colombier #define jinit_c_prep_controller	jICPrepC
3017dd7cddfSDavid du Colombier #define jinit_c_coef_controller	jICCoefC
3027dd7cddfSDavid du Colombier #define jinit_color_converter	jICColor
3037dd7cddfSDavid du Colombier #define jinit_downsampler	jIDownsampler
3047dd7cddfSDavid du Colombier #define jinit_forward_dct	jIFDCT
3057dd7cddfSDavid du Colombier #define jinit_huff_encoder	jIHEncoder
3067dd7cddfSDavid du Colombier #define jinit_phuff_encoder	jIPHEncoder
3077dd7cddfSDavid du Colombier #define jinit_marker_writer	jIMWriter
3087dd7cddfSDavid du Colombier #define jinit_master_decompress	jIDMaster
3097dd7cddfSDavid du Colombier #define jinit_d_main_controller	jIDMainC
3107dd7cddfSDavid du Colombier #define jinit_d_coef_controller	jIDCoefC
3117dd7cddfSDavid du Colombier #define jinit_d_post_controller	jIDPostC
3127dd7cddfSDavid du Colombier #define jinit_input_controller	jIInCtlr
3137dd7cddfSDavid du Colombier #define jinit_marker_reader	jIMReader
3147dd7cddfSDavid du Colombier #define jinit_huff_decoder	jIHDecoder
3157dd7cddfSDavid du Colombier #define jinit_phuff_decoder	jIPHDecoder
3167dd7cddfSDavid du Colombier #define jinit_inverse_dct	jIIDCT
3177dd7cddfSDavid du Colombier #define jinit_upsampler		jIUpsampler
3187dd7cddfSDavid du Colombier #define jinit_color_deconverter	jIDColor
3197dd7cddfSDavid du Colombier #define jinit_1pass_quantizer	jI1Quant
3207dd7cddfSDavid du Colombier #define jinit_2pass_quantizer	jI2Quant
3217dd7cddfSDavid du Colombier #define jinit_merged_upsampler	jIMUpsampler
3227dd7cddfSDavid du Colombier #define jinit_memory_mgr	jIMemMgr
3237dd7cddfSDavid du Colombier #define jdiv_round_up		jDivRound
3247dd7cddfSDavid du Colombier #define jround_up		jRound
3257dd7cddfSDavid du Colombier #define jcopy_sample_rows	jCopySamples
3267dd7cddfSDavid du Colombier #define jcopy_block_row		jCopyBlocks
3277dd7cddfSDavid du Colombier #define jzero_far		jZeroFar
3287dd7cddfSDavid du Colombier #define jpeg_zigzag_order	jZIGTable
3297dd7cddfSDavid du Colombier #define jpeg_natural_order	jZAGTable
3307dd7cddfSDavid du Colombier #endif /* NEED_SHORT_EXTERNAL_NAMES */
3317dd7cddfSDavid du Colombier 
3327dd7cddfSDavid du Colombier 
3337dd7cddfSDavid du Colombier /* Compression module initialization routines */
3347dd7cddfSDavid du Colombier EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo));
3357dd7cddfSDavid du Colombier EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo,
3367dd7cddfSDavid du Colombier 					 boolean transcode_only));
3377dd7cddfSDavid du Colombier EXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo,
3387dd7cddfSDavid du Colombier 					  boolean need_full_buffer));
3397dd7cddfSDavid du Colombier EXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo,
3407dd7cddfSDavid du Colombier 					  boolean need_full_buffer));
3417dd7cddfSDavid du Colombier EXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo,
3427dd7cddfSDavid du Colombier 					  boolean need_full_buffer));
3437dd7cddfSDavid du Colombier EXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo));
3447dd7cddfSDavid du Colombier EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo));
3457dd7cddfSDavid du Colombier EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo));
3467dd7cddfSDavid du Colombier EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo));
3477dd7cddfSDavid du Colombier EXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo));
3487dd7cddfSDavid du Colombier EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo));
3497dd7cddfSDavid du Colombier /* Decompression module initialization routines */
3507dd7cddfSDavid du Colombier EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo));
3517dd7cddfSDavid du Colombier EXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo,
3527dd7cddfSDavid du Colombier 					  boolean need_full_buffer));
3537dd7cddfSDavid du Colombier EXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo,
3547dd7cddfSDavid du Colombier 					  boolean need_full_buffer));
3557dd7cddfSDavid du Colombier EXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo,
3567dd7cddfSDavid du Colombier 					  boolean need_full_buffer));
3577dd7cddfSDavid du Colombier EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo));
3587dd7cddfSDavid du Colombier EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo));
3597dd7cddfSDavid du Colombier EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo));
3607dd7cddfSDavid du Colombier EXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo));
3617dd7cddfSDavid du Colombier EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo));
3627dd7cddfSDavid du Colombier EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo));
3637dd7cddfSDavid du Colombier EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo));
3647dd7cddfSDavid du Colombier EXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo));
3657dd7cddfSDavid du Colombier EXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo));
3667dd7cddfSDavid du Colombier EXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo));
3677dd7cddfSDavid du Colombier /* Memory manager initialization */
3687dd7cddfSDavid du Colombier EXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo));
3697dd7cddfSDavid du Colombier 
3707dd7cddfSDavid du Colombier /* Utility routines in jutils.c */
3717dd7cddfSDavid du Colombier EXTERN(long) jdiv_round_up JPP((long a, long b));
3727dd7cddfSDavid du Colombier EXTERN(long) jround_up JPP((long a, long b));
3737dd7cddfSDavid du Colombier EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row,
3747dd7cddfSDavid du Colombier 				    JSAMPARRAY output_array, int dest_row,
3757dd7cddfSDavid du Colombier 				    int num_rows, JDIMENSION num_cols));
3767dd7cddfSDavid du Colombier EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row,
3777dd7cddfSDavid du Colombier 				  JDIMENSION num_blocks));
3787dd7cddfSDavid du Colombier EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero));
3797dd7cddfSDavid du Colombier /* Constant tables in jutils.c */
380*593dc095SDavid du Colombier #if 0				/* This table is not actually needed in v6a */
3817dd7cddfSDavid du Colombier extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */
382*593dc095SDavid du Colombier #endif
3837dd7cddfSDavid du Colombier extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */
3847dd7cddfSDavid du Colombier 
3857dd7cddfSDavid du Colombier /* Suppress undefined-structure complaints if necessary. */
3867dd7cddfSDavid du Colombier 
3877dd7cddfSDavid du Colombier #ifdef INCOMPLETE_TYPES_BROKEN
3887dd7cddfSDavid du Colombier #ifndef AM_MEMORY_MANAGER	/* only jmemmgr.c defines these */
3897dd7cddfSDavid du Colombier struct jvirt_sarray_control { long dummy; };
3907dd7cddfSDavid du Colombier struct jvirt_barray_control { long dummy; };
3917dd7cddfSDavid du Colombier #endif
3927dd7cddfSDavid du Colombier #endif /* INCOMPLETE_TYPES_BROKEN */
393