Remove 'oldcode'
[oweals/cde.git] / cde / lib / DtHelp / jpeg / jidctint.c
1 /*
2  * CDE - Common Desktop Environment
3  *
4  * Copyright (c) 1993-2012, The Open Group. All rights reserved.
5  *
6  * These libraries and programs are free software; you can
7  * redistribute them and/or modify them under the terms of the GNU
8  * Lesser General Public License as published by the Free Software
9  * Foundation; either version 2 of the License, or (at your option)
10  * any later version.
11  *
12  * These libraries and programs are distributed in the hope that
13  * they will be useful, but WITHOUT ANY WARRANTY; without even the
14  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15  * PURPOSE. See the GNU Lesser General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with these libraries and programs; if not, write
20  * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21  * Floor, Boston, MA 02110-1301 USA
22  */
23 /* $XConsortium: jidctint.c /main/2 1996/05/09 03:51:27 drk $ */
24 /*
25  * jidctint.c
26  *
27  * Copyright (C) 1991-1996, Thomas G. Lane.
28  * This file is part of the Independent JPEG Group's software.
29  * For conditions of distribution and use, see the accompanying README file.
30  *
31  * This file contains a slow-but-accurate integer implementation of the
32  * inverse DCT (Discrete Cosine Transform).  In the IJG code, this routine
33  * must also perform dequantization of the input coefficients.
34  *
35  * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT
36  * on each row (or vice versa, but it's more convenient to emit a row at
37  * a time).  Direct algorithms are also available, but they are much more
38  * complex and seem not to be any faster when reduced to code.
39  *
40  * This implementation is based on an algorithm described in
41  *   C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT
42  *   Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics,
43  *   Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991.
44  * The primary algorithm described there uses 11 multiplies and 29 adds.
45  * We use their alternate method with 12 multiplies and 32 adds.
46  * The advantage of this method is that no data path contains more than one
47  * multiplication; this allows a very simple and accurate implementation in
48  * scaled fixed-point arithmetic, with a minimal number of shifts.
49  */
50
51 #define JPEG_INTERNALS
52 #include "jinclude.h"
53 #include "jpeglib.h"
54 #include "jdct.h"               /* Private declarations for DCT subsystem */
55
56 #ifdef DCT_ISLOW_SUPPORTED
57
58
59 /*
60  * This module is specialized to the case DCTSIZE = 8.
61  */
62
63 #if DCTSIZE != 8
64   Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
65 #endif
66
67
68 /*
69  * The poop on this scaling stuff is as follows:
70  *
71  * Each 1-D IDCT step produces outputs which are a factor of sqrt(N)
72  * larger than the true IDCT outputs.  The final outputs are therefore
73  * a factor of N larger than desired; since N=8 this can be cured by
74  * a simple right shift at the end of the algorithm.  The advantage of
75  * this arrangement is that we save two multiplications per 1-D IDCT,
76  * because the y0 and y4 inputs need not be divided by sqrt(N).
77  *
78  * We have to do addition and subtraction of the integer inputs, which
79  * is no problem, and multiplication by fractional constants, which is
80  * a problem to do in integer arithmetic.  We multiply all the constants
81  * by CONST_SCALE and convert them to integer constants (thus retaining
82  * CONST_BITS bits of precision in the constants).  After doing a
83  * multiplication we have to divide the product by CONST_SCALE, with proper
84  * rounding, to produce the correct output.  This division can be done
85  * cheaply as a right shift of CONST_BITS bits.  We postpone shifting
86  * as long as possible so that partial sums can be added together with
87  * full fractional precision.
88  *
89  * The outputs of the first pass are scaled up by PASS1_BITS bits so that
90  * they are represented to better-than-integral precision.  These outputs
91  * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word
92  * with the recommended scaling.  (To scale up 12-bit sample data further, an
93  * intermediate INT32 array would be needed.)
94  *
95  * To avoid overflow of the 32-bit intermediate results in pass 2, we must
96  * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26.  Error analysis
97  * shows that the values given below are the most effective.
98  */
99
100 #if BITS_IN_JSAMPLE == 8
101 #define CONST_BITS  13
102 #define PASS1_BITS  2
103 #else
104 #define CONST_BITS  13
105 #define PASS1_BITS  1           /* lose a little precision to avoid overflow */
106 #endif
107
108 /* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
109  * causing a lot of useless floating-point operations at run time.
110  * To get around this we use the following pre-calculated constants.
111  * If you change CONST_BITS you may want to add appropriate values.
112  * (With a reasonable C compiler, you can just rely on the FIX() macro...)
113  */
114
115 #if CONST_BITS == 13
116 #define FIX_0_298631336  ((INT32)  2446)        /* FIX(0.298631336) */
117 #define FIX_0_390180644  ((INT32)  3196)        /* FIX(0.390180644) */
118 #define FIX_0_541196100  ((INT32)  4433)        /* FIX(0.541196100) */
119 #define FIX_0_765366865  ((INT32)  6270)        /* FIX(0.765366865) */
120 #define FIX_0_899976223  ((INT32)  7373)        /* FIX(0.899976223) */
121 #define FIX_1_175875602  ((INT32)  9633)        /* FIX(1.175875602) */
122 #define FIX_1_501321110  ((INT32)  12299)       /* FIX(1.501321110) */
123 #define FIX_1_847759065  ((INT32)  15137)       /* FIX(1.847759065) */
124 #define FIX_1_961570560  ((INT32)  16069)       /* FIX(1.961570560) */
125 #define FIX_2_053119869  ((INT32)  16819)       /* FIX(2.053119869) */
126 #define FIX_2_562915447  ((INT32)  20995)       /* FIX(2.562915447) */
127 #define FIX_3_072711026  ((INT32)  25172)       /* FIX(3.072711026) */
128 #else
129 #define FIX_0_298631336  FIX(0.298631336)
130 #define FIX_0_390180644  FIX(0.390180644)
131 #define FIX_0_541196100  FIX(0.541196100)
132 #define FIX_0_765366865  FIX(0.765366865)
133 #define FIX_0_899976223  FIX(0.899976223)
134 #define FIX_1_175875602  FIX(1.175875602)
135 #define FIX_1_501321110  FIX(1.501321110)
136 #define FIX_1_847759065  FIX(1.847759065)
137 #define FIX_1_961570560  FIX(1.961570560)
138 #define FIX_2_053119869  FIX(2.053119869)
139 #define FIX_2_562915447  FIX(2.562915447)
140 #define FIX_3_072711026  FIX(3.072711026)
141 #endif
142
143
144 /* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
145  * For 8-bit samples with the recommended scaling, all the variable
146  * and constant values involved are no more than 16 bits wide, so a
147  * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.
148  * For 12-bit samples, a full 32-bit multiplication will be needed.
149  */
150
151 #if BITS_IN_JSAMPLE == 8
152 #define MULTIPLY(var,const)  MULTIPLY16C16(var,const)
153 #else
154 #define MULTIPLY(var,const)  ((var) * (const))
155 #endif
156
157
158 /* Dequantize a coefficient by multiplying it by the multiplier-table
159  * entry; produce an int result.  In this module, both inputs and result
160  * are 16 bits or less, so either int or short multiply will work.
161  */
162
163 #define DEQUANTIZE(coef,quantval)  (((ISLOW_MULT_TYPE) (coef)) * (quantval))
164
165
166 /*
167  * Perform dequantization and inverse DCT on one block of coefficients.
168  */
169
170 GLOBAL(void)
171 jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
172                  JCOEFPTR coef_block,
173                  JSAMPARRAY output_buf, JDIMENSION output_col)
174 {
175   INT32 tmp0, tmp1, tmp2, tmp3;
176   INT32 tmp10, tmp11, tmp12, tmp13;
177   INT32 z1, z2, z3, z4, z5;
178   JCOEFPTR inptr;
179   ISLOW_MULT_TYPE * quantptr;
180   int * wsptr;
181   JSAMPROW outptr;
182   JSAMPLE *range_limit = IDCT_range_limit(cinfo);
183   int ctr;
184   int workspace[DCTSIZE2];      /* buffers data between passes */
185   SHIFT_TEMPS
186
187   /* Pass 1: process columns from input, store into work array. */
188   /* Note results are scaled up by sqrt(8) compared to a true IDCT; */
189   /* furthermore, we scale the results by 2**PASS1_BITS. */
190
191   inptr = coef_block;
192   quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
193   wsptr = workspace;
194   for (ctr = DCTSIZE; ctr > 0; ctr--) {
195     /* Due to quantization, we will usually find that many of the input
196      * coefficients are zero, especially the AC terms.  We can exploit this
197      * by short-circuiting the IDCT calculation for any column in which all
198      * the AC terms are zero.  In that case each output is equal to the
199      * DC coefficient (with scale factor as needed).
200      * With typical images and quantization tables, half or more of the
201      * column DCT calculations can be simplified this way.
202      */
203     
204     if ((inptr[DCTSIZE*1] | inptr[DCTSIZE*2] | inptr[DCTSIZE*3] |
205          inptr[DCTSIZE*4] | inptr[DCTSIZE*5] | inptr[DCTSIZE*6] |
206          inptr[DCTSIZE*7]) == 0) {
207       /* AC terms all zero */
208       int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
209       
210       wsptr[DCTSIZE*0] = dcval;
211       wsptr[DCTSIZE*1] = dcval;
212       wsptr[DCTSIZE*2] = dcval;
213       wsptr[DCTSIZE*3] = dcval;
214       wsptr[DCTSIZE*4] = dcval;
215       wsptr[DCTSIZE*5] = dcval;
216       wsptr[DCTSIZE*6] = dcval;
217       wsptr[DCTSIZE*7] = dcval;
218       
219       inptr++;                  /* advance pointers to next column */
220       quantptr++;
221       wsptr++;
222       continue;
223     }
224     
225     /* Even part: reverse the even part of the forward DCT. */
226     /* The rotator is sqrt(2)*c(-6). */
227     
228     z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
229     z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
230     
231     z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
232     tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);
233     tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);
234     
235     z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
236     z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
237
238     tmp0 = (z2 + z3) << CONST_BITS;
239     tmp1 = (z2 - z3) << CONST_BITS;
240     
241     tmp10 = tmp0 + tmp3;
242     tmp13 = tmp0 - tmp3;
243     tmp11 = tmp1 + tmp2;
244     tmp12 = tmp1 - tmp2;
245     
246     /* Odd part per figure 8; the matrix is unitary and hence its
247      * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.
248      */
249     
250     tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
251     tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
252     tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
253     tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
254     
255     z1 = tmp0 + tmp3;
256     z2 = tmp1 + tmp2;
257     z3 = tmp0 + tmp2;
258     z4 = tmp1 + tmp3;
259     z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
260     
261     tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
262     tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
263     tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
264     tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
265     z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
266     z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
267     z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
268     z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
269     
270     z3 += z5;
271     z4 += z5;
272     
273     tmp0 += z1 + z3;
274     tmp1 += z2 + z4;
275     tmp2 += z2 + z3;
276     tmp3 += z1 + z4;
277     
278     /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
279     
280     wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
281     wsptr[DCTSIZE*7] = (int) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
282     wsptr[DCTSIZE*1] = (int) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
283     wsptr[DCTSIZE*6] = (int) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS);
284     wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS);
285     wsptr[DCTSIZE*5] = (int) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
286     wsptr[DCTSIZE*3] = (int) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
287     wsptr[DCTSIZE*4] = (int) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
288     
289     inptr++;                    /* advance pointers to next column */
290     quantptr++;
291     wsptr++;
292   }
293   
294   /* Pass 2: process rows from work array, store into output array. */
295   /* Note that we must descale the results by a factor of 8 == 2**3, */
296   /* and also undo the PASS1_BITS scaling. */
297
298   wsptr = workspace;
299   for (ctr = 0; ctr < DCTSIZE; ctr++) {
300     outptr = output_buf[ctr] + output_col;
301     /* Rows of zeroes can be exploited in the same way as we did with columns.
302      * However, the column calculation has created many nonzero AC terms, so
303      * the simplification applies less often (typically 5% to 10% of the time).
304      * On machines with very fast multiplication, it's possible that the
305      * test takes more time than it's worth.  In that case this section
306      * may be commented out.
307      */
308     
309 #ifndef NO_ZERO_ROW_TEST
310     if ((wsptr[1] | wsptr[2] | wsptr[3] | wsptr[4] | wsptr[5] | wsptr[6] |
311          wsptr[7]) == 0) {
312       /* AC terms all zero */
313       JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
314                                   & RANGE_MASK];
315       
316       outptr[0] = dcval;
317       outptr[1] = dcval;
318       outptr[2] = dcval;
319       outptr[3] = dcval;
320       outptr[4] = dcval;
321       outptr[5] = dcval;
322       outptr[6] = dcval;
323       outptr[7] = dcval;
324
325       wsptr += DCTSIZE;         /* advance pointer to next row */
326       continue;
327     }
328 #endif
329     
330     /* Even part: reverse the even part of the forward DCT. */
331     /* The rotator is sqrt(2)*c(-6). */
332     
333     z2 = (INT32) wsptr[2];
334     z3 = (INT32) wsptr[6];
335     
336     z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
337     tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);
338     tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);
339     
340     tmp0 = ((INT32) wsptr[0] + (INT32) wsptr[4]) << CONST_BITS;
341     tmp1 = ((INT32) wsptr[0] - (INT32) wsptr[4]) << CONST_BITS;
342     
343     tmp10 = tmp0 + tmp3;
344     tmp13 = tmp0 - tmp3;
345     tmp11 = tmp1 + tmp2;
346     tmp12 = tmp1 - tmp2;
347     
348     /* Odd part per figure 8; the matrix is unitary and hence its
349      * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.
350      */
351     
352     tmp0 = (INT32) wsptr[7];
353     tmp1 = (INT32) wsptr[5];
354     tmp2 = (INT32) wsptr[3];
355     tmp3 = (INT32) wsptr[1];
356     
357     z1 = tmp0 + tmp3;
358     z2 = tmp1 + tmp2;
359     z3 = tmp0 + tmp2;
360     z4 = tmp1 + tmp3;
361     z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
362     
363     tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
364     tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
365     tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
366     tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
367     z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
368     z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
369     z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
370     z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
371     
372     z3 += z5;
373     z4 += z5;
374     
375     tmp0 += z1 + z3;
376     tmp1 += z2 + z4;
377     tmp2 += z2 + z3;
378     tmp3 += z1 + z4;
379     
380     /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
381     
382     outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp3,
383                                           CONST_BITS+PASS1_BITS+3)
384                             & RANGE_MASK];
385     outptr[7] = range_limit[(int) DESCALE(tmp10 - tmp3,
386                                           CONST_BITS+PASS1_BITS+3)
387                             & RANGE_MASK];
388     outptr[1] = range_limit[(int) DESCALE(tmp11 + tmp2,
389                                           CONST_BITS+PASS1_BITS+3)
390                             & RANGE_MASK];
391     outptr[6] = range_limit[(int) DESCALE(tmp11 - tmp2,
392                                           CONST_BITS+PASS1_BITS+3)
393                             & RANGE_MASK];
394     outptr[2] = range_limit[(int) DESCALE(tmp12 + tmp1,
395                                           CONST_BITS+PASS1_BITS+3)
396                             & RANGE_MASK];
397     outptr[5] = range_limit[(int) DESCALE(tmp12 - tmp1,
398                                           CONST_BITS+PASS1_BITS+3)
399                             & RANGE_MASK];
400     outptr[3] = range_limit[(int) DESCALE(tmp13 + tmp0,
401                                           CONST_BITS+PASS1_BITS+3)
402                             & RANGE_MASK];
403     outptr[4] = range_limit[(int) DESCALE(tmp13 - tmp0,
404                                           CONST_BITS+PASS1_BITS+3)
405                             & RANGE_MASK];
406     
407     wsptr += DCTSIZE;           /* advance pointer to next row */
408   }
409 }
410
411 #endif /* DCT_ISLOW_SUPPORTED */