source: trunk/third/jpeg/jdct.h @ 15227

Revision 15227, 6.9 KB checked in by ghudson, 24 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r15226, which included commits to RCS files with non-trunk default branches.
Line 
1/*
2 * jdct.h
3 *
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.
7 *
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).
13 */
14
15
16/*
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.
27 */
28
29#if BITS_IN_JSAMPLE == 8
30typedef int DCTELEM;            /* 16 or 32 bits is fine */
31#else
32typedef INT32 DCTELEM;          /* must have 32 bits */
33#endif
34
35typedef JMETHOD(void, forward_DCT_method_ptr, (DCTELEM * data));
36typedef JMETHOD(void, float_DCT_method_ptr, (FAST_FLOAT * data));
37
38
39/*
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.
48 */
49
50/* typedef inverse_DCT_method_ptr is declared in jpegint.h */
51
52/*
53 * Each IDCT routine has its own ideas about the best dct_table element type.
54 */
55
56typedef MULTIPLIER ISLOW_MULT_TYPE; /* short or int, whichever is faster */
57#if BITS_IN_JSAMPLE == 8
58typedef MULTIPLIER IFAST_MULT_TYPE; /* 16 bits is OK, use short if faster */
59#define IFAST_SCALE_BITS  2     /* fractional bits in scale factors */
60#else
61typedef INT32 IFAST_MULT_TYPE;  /* need 32 bits for scaled quantizers */
62#define IFAST_SCALE_BITS  13    /* fractional bits in scale factors */
63#endif
64typedef FAST_FLOAT FLOAT_MULT_TYPE; /* preferred floating type */
65
66
67/*
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.
74 */
75
76#define IDCT_range_limit(cinfo)  ((cinfo)->sample_range_limit + CENTERJSAMPLE)
77
78#define RANGE_MASK  (MAXJSAMPLE * 4 + 3) /* 2 bits wider than legal samples */
79
80
81/* Short forms of external names for systems with brain-damaged linkers. */
82
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 */
94
95/* Extern declarations for the forward and inverse DCT routines. */
96
97EXTERN(void) jpeg_fdct_islow JPP((DCTELEM * data));
98EXTERN(void) jpeg_fdct_ifast JPP((DCTELEM * data));
99EXTERN(void) jpeg_fdct_float JPP((FAST_FLOAT * data));
100
101EXTERN(void) jpeg_idct_islow
102    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
103         JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
104EXTERN(void) jpeg_idct_ifast
105    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
106         JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
107EXTERN(void) jpeg_idct_float
108    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
109         JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
110EXTERN(void) jpeg_idct_4x4
111    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
112         JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
113EXTERN(void) jpeg_idct_2x2
114    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
115         JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
116EXTERN(void) jpeg_idct_1x1
117    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
118         JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
119
120
121/*
122 * Macros for handling fixed-point arithmetic; these are used by many
123 * but not all of the DCT/IDCT modules.
124 *
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.
129 */
130
131#define ONE     ((INT32) 1)
132#define CONST_SCALE (ONE << CONST_BITS)
133
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.
137 */
138
139#define FIX(x)  ((INT32) ((x) * CONST_SCALE + 0.5))
140
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.
144 */
145
146#define DESCALE(x,n)  RIGHT_SHIFT((x) + (ONE << ((n)-1)), n)
147
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.
155 */
156
157#ifdef SHORTxSHORT_32           /* may work if 'int' is 32 bits */
158#define MULTIPLY16C16(var,const)  (((INT16) (var)) * ((INT16) (const)))
159#endif
160#ifdef SHORTxLCONST_32          /* known to work with Microsoft C 6.0 */
161#define MULTIPLY16C16(var,const)  (((INT16) (var)) * ((INT32) (const)))
162#endif
163
164#ifndef MULTIPLY16C16           /* default definition */
165#define MULTIPLY16C16(var,const)  ((var) * (const))
166#endif
167
168/* Same except both inputs are variables. */
169
170#ifdef SHORTxSHORT_32           /* may work if 'int' is 32 bits */
171#define MULTIPLY16V16(var1,var2)  (((INT16) (var1)) * ((INT16) (var2)))
172#endif
173
174#ifndef MULTIPLY16V16           /* default definition */
175#define MULTIPLY16V16(var1,var2)  ((var1) * (var2))
176#endif
Note: See TracBrowser for help on using the repository browser.