4  * Copyright (C) 1994-1996, Thomas G. Lane. 
   5  * This file is part of the Independent JPEG Group's software. 
   6  * For conditions of distribution and use, see the accompanying README file. 
   8  * This include file contains common declarations for the forward and 
   9  * inverse DCT modules.  These declarations are private to the DCT managers 
  10  * (jcdctmgr.c, jddctmgr.c) and the individual DCT algorithms. 
  11  * The individual DCT algorithms are kept in separate files to ease  
  12  * machine-dependent tuning (e.g., assembly coding). 
  17  * A forward DCT routine is given a pointer to a work area of type DCTELEM[]; 
  18  * the DCT is to be performed in-place in that buffer.  Type DCTELEM is int 
  19  * for 8-bit samples, INT32 for 12-bit samples.  (NOTE: Floating-point DCT 
  20  * implementations use an array of type FAST_FLOAT, instead.) 
  21  * The DCT inputs are expected to be signed (range +-CENTERJSAMPLE). 
  22  * The DCT outputs are returned scaled up by a factor of 8; they therefore 
  23  * have a range of +-8K for 8-bit data, +-128K for 12-bit data.  This 
  24  * convention improves accuracy in integer implementations and saves some 
  25  * work in floating-point ones. 
  26  * Quantization of the output coefficients is done by jcdctmgr.c. 
  29 #if BITS_IN_JSAMPLE == 8 
  30 typedef int DCTELEM
;            /* 16 or 32 bits is fine */ 
  32 typedef INT32 DCTELEM
;          /* must have 32 bits */ 
  35 typedef JMETHOD(void, forward_DCT_method_ptr
, (DCTELEM 
* data
)); 
  36 typedef JMETHOD(void, float_DCT_method_ptr
, (FAST_FLOAT 
* data
)); 
  40  * An inverse DCT routine is given a pointer to the input JBLOCK and a pointer 
  41  * to an output sample array.  The routine must dequantize the input data as 
  42  * well as perform the IDCT; for dequantization, it uses the multiplier table 
  43  * pointed to by compptr->dct_table.  The output data is to be placed into the 
  44  * sample array starting at a specified column.  (Any row offset needed will 
  45  * be applied to the array pointer before it is passed to the IDCT code.) 
  46  * Note that the number of samples emitted by the IDCT routine is 
  47  * DCT_scaled_size * DCT_scaled_size. 
  50 /* typedef inverse_DCT_method_ptr is declared in jpegint.h */ 
  53  * Each IDCT routine has its own ideas about the best dct_table element type. 
  56 typedef MULTIPLIER ISLOW_MULT_TYPE
; /* short or int, whichever is faster */ 
  57 #if BITS_IN_JSAMPLE == 8 
  58 typedef MULTIPLIER IFAST_MULT_TYPE
; /* 16 bits is OK, use short if faster */ 
  59 #define IFAST_SCALE_BITS  2     /* fractional bits in scale factors */ 
  61 typedef INT32 IFAST_MULT_TYPE
;  /* need 32 bits for scaled quantizers */ 
  62 #define IFAST_SCALE_BITS  13    /* fractional bits in scale factors */ 
  64 typedef FAST_FLOAT FLOAT_MULT_TYPE
; /* preferred floating type */ 
  68  * Each IDCT routine is responsible for range-limiting its results and 
  69  * converting them to unsigned form (0..MAXJSAMPLE).  The raw outputs could 
  70  * be quite far out of range if the input data is corrupt, so a bulletproof 
  71  * range-limiting step is required.  We use a mask-and-table-lookup method 
  72  * to do the combined operations quickly.  See the comments with 
  73  * prepare_range_limit_table (in jdmaster.c) for more info. 
  76 #define IDCT_range_limit(cinfo)  ((cinfo)->sample_range_limit + CENTERJSAMPLE) 
  78 #define RANGE_MASK  (MAXJSAMPLE * 4 + 3) /* 2 bits wider than legal samples */ 
  81 /* Short forms of external names for systems with brain-damaged linkers. */ 
  83 #ifdef NEED_SHORT_EXTERNAL_NAMES 
  84 #define jpeg_fdct_islow         jFDislow 
  85 #define jpeg_fdct_ifast         jFDifast 
  86 #define jpeg_fdct_float         jFDfloat 
  87 #define jpeg_idct_islow         jRDislow 
  88 #define jpeg_idct_ifast         jRDifast 
  89 #define jpeg_idct_float         jRDfloat 
  90 #define jpeg_idct_4x4           jRD4x4 
  91 #define jpeg_idct_2x2           jRD2x2 
  92 #define jpeg_idct_1x1           jRD1x1 
  93 #endif /* NEED_SHORT_EXTERNAL_NAMES */ 
  95 /* Extern declarations for the forward and inverse DCT routines. */ 
  97 EXTERN(void) jpeg_fdct_islow 
JPP((DCTELEM 
* data
)); 
  98 EXTERN(void) jpeg_fdct_ifast 
JPP((DCTELEM 
* data
)); 
  99 EXTERN(void) jpeg_fdct_float 
JPP((FAST_FLOAT 
* data
)); 
 101 EXTERN(void) jpeg_idct_islow
 
 102     JPP((j_decompress_ptr cinfo
, jpeg_component_info 
* compptr
, 
 103          JCOEFPTR coef_block
, JSAMPARRAY output_buf
, JDIMENSION output_col
)); 
 104 EXTERN(void) jpeg_idct_ifast
 
 105     JPP((j_decompress_ptr cinfo
, jpeg_component_info 
* compptr
, 
 106          JCOEFPTR coef_block
, JSAMPARRAY output_buf
, JDIMENSION output_col
)); 
 107 EXTERN(void) jpeg_idct_float
 
 108     JPP((j_decompress_ptr cinfo
, jpeg_component_info 
* compptr
, 
 109          JCOEFPTR coef_block
, JSAMPARRAY output_buf
, JDIMENSION output_col
)); 
 110 EXTERN(void) jpeg_idct_4x4
 
 111     JPP((j_decompress_ptr cinfo
, jpeg_component_info 
* compptr
, 
 112          JCOEFPTR coef_block
, JSAMPARRAY output_buf
, JDIMENSION output_col
)); 
 113 EXTERN(void) jpeg_idct_2x2
 
 114     JPP((j_decompress_ptr cinfo
, jpeg_component_info 
* compptr
, 
 115          JCOEFPTR coef_block
, JSAMPARRAY output_buf
, JDIMENSION output_col
)); 
 116 EXTERN(void) jpeg_idct_1x1
 
 117     JPP((j_decompress_ptr cinfo
, jpeg_component_info 
* compptr
, 
 118          JCOEFPTR coef_block
, JSAMPARRAY output_buf
, JDIMENSION output_col
)); 
 122  * Macros for handling fixed-point arithmetic; these are used by many 
 123  * but not all of the DCT/IDCT modules. 
 125  * All values are expected to be of type INT32. 
 126  * Fractional constants are scaled left by CONST_BITS bits. 
 127  * CONST_BITS is defined within each module using these macros, 
 128  * and may differ from one module to the next. 
 131 #define ONE     ((INT32) 1) 
 132 #define CONST_SCALE (ONE << CONST_BITS) 
 134 /* Convert a positive real constant to an integer scaled by CONST_SCALE. 
 135  * Caution: some C compilers fail to reduce "FIX(constant)" at compile time, 
 136  * thus causing a lot of useless floating-point operations at run time. 
 139 #define FIX(x)  ((INT32) ((x) * CONST_SCALE + 0.5)) 
 141 /* Descale and correctly round an INT32 value that's scaled by N bits. 
 142  * We assume RIGHT_SHIFT rounds towards minus infinity, so adding 
 143  * the fudge factor is correct for either sign of X. 
 146 #define DESCALE(x,n)  RIGHT_SHIFT((x) + (ONE << ((n)-1)), n) 
 148 /* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. 
 149  * This macro is used only when the two inputs will actually be no more than 
 150  * 16 bits wide, so that a 16x16->32 bit multiply can be used instead of a 
 151  * full 32x32 multiply.  This provides a useful speedup on many machines. 
 152  * Unfortunately there is no way to specify a 16x16->32 multiply portably 
 153  * in C, but some C compilers will do the right thing if you provide the 
 154  * correct combination of casts. 
 157 #ifdef SHORTxSHORT_32           /* may work if 'int' is 32 bits */ 
 158 #define MULTIPLY16C16(var,const)  (((INT16) (var)) * ((INT16) (const))) 
 160 #ifdef SHORTxLCONST_32          /* known to work with Microsoft C 6.0 */ 
 161 #define MULTIPLY16C16(var,const)  (((INT16) (var)) * ((INT32) (const))) 
 164 #ifndef MULTIPLY16C16           /* default definition */ 
 165 #define MULTIPLY16C16(var,const)  ((var) * (const)) 
 168 /* Same except both inputs are variables. */ 
 170 #ifdef SHORTxSHORT_32           /* may work if 'int' is 32 bits */ 
 171 #define MULTIPLY16V16(var1,var2)  (((INT16) (var1)) * ((INT16) (var2))) 
 174 #ifndef MULTIPLY16V16           /* default definition */ 
 175 #define MULTIPLY16V16(var1,var2)  ((var1) * (var2))