Initial commit.
[pdfium.git] / core / src / fxcodec / libjpeg / fpdfapi_jfdctint.c
1 #if !defined(_FX_JPEG_TURBO_)\r
2 /*\r
3  * jfdctint.c\r
4  *\r
5  * Copyright (C) 1991-1996, Thomas G. Lane.\r
6  * This file is part of the Independent JPEG Group's software.\r
7  * For conditions of distribution and use, see the accompanying README file.\r
8  *\r
9  * This file contains a slow-but-accurate integer implementation of the\r
10  * forward DCT (Discrete Cosine Transform).\r
11  *\r
12  * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT\r
13  * on each column.  Direct algorithms are also available, but they are\r
14  * much more complex and seem not to be any faster when reduced to code.\r
15  *\r
16  * This implementation is based on an algorithm described in\r
17  *   C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT\r
18  *   Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics,\r
19  *   Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991.\r
20  * The primary algorithm described there uses 11 multiplies and 29 adds.\r
21  * We use their alternate method with 12 multiplies and 32 adds.\r
22  * The advantage of this method is that no data path contains more than one\r
23  * multiplication; this allows a very simple and accurate implementation in\r
24  * scaled fixed-point arithmetic, with a minimal number of shifts.\r
25  */\r
26 \r
27 #define JPEG_INTERNALS\r
28 #include "jinclude.h"\r
29 #include "jpeglib.h"\r
30 #include "jdct.h"               /* Private declarations for DCT subsystem */\r
31 \r
32 #ifdef DCT_ISLOW_SUPPORTED\r
33 \r
34 \r
35 /*\r
36  * This module is specialized to the case DCTSIZE = 8.\r
37  */\r
38 \r
39 #if DCTSIZE != 8\r
40   Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */\r
41 #endif\r
42 \r
43 \r
44 /*\r
45  * The poop on this scaling stuff is as follows:\r
46  *\r
47  * Each 1-D DCT step produces outputs which are a factor of sqrt(N)\r
48  * larger than the true DCT outputs.  The final outputs are therefore\r
49  * a factor of N larger than desired; since N=8 this can be cured by\r
50  * a simple right shift at the end of the algorithm.  The advantage of\r
51  * this arrangement is that we save two multiplications per 1-D DCT,\r
52  * because the y0 and y4 outputs need not be divided by sqrt(N).\r
53  * In the IJG code, this factor of 8 is removed by the quantization step\r
54  * (in jcdctmgr.c), NOT in this module.\r
55  *\r
56  * We have to do addition and subtraction of the integer inputs, which\r
57  * is no problem, and multiplication by fractional constants, which is\r
58  * a problem to do in integer arithmetic.  We multiply all the constants\r
59  * by CONST_SCALE and convert them to integer constants (thus retaining\r
60  * CONST_BITS bits of precision in the constants).  After doing a\r
61  * multiplication we have to divide the product by CONST_SCALE, with proper\r
62  * rounding, to produce the correct output.  This division can be done\r
63  * cheaply as a right shift of CONST_BITS bits.  We postpone shifting\r
64  * as long as possible so that partial sums can be added together with\r
65  * full fractional precision.\r
66  *\r
67  * The outputs of the first pass are scaled up by PASS1_BITS bits so that\r
68  * they are represented to better-than-integral precision.  These outputs\r
69  * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word\r
70  * with the recommended scaling.  (For 12-bit sample data, the intermediate\r
71  * array is INT32 anyway.)\r
72  *\r
73  * To avoid overflow of the 32-bit intermediate results in pass 2, we must\r
74  * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26.  Error analysis\r
75  * shows that the values given below are the most effective.\r
76  */\r
77 \r
78 #if BITS_IN_JSAMPLE == 8\r
79 #define CONST_BITS  13\r
80 #define PASS1_BITS  2\r
81 #else\r
82 #define CONST_BITS  13\r
83 #define PASS1_BITS  1           /* lose a little precision to avoid overflow */\r
84 #endif\r
85 \r
86 /* Some C compilers fail to reduce "FIX(constant)" at compile time, thus\r
87  * causing a lot of useless floating-point operations at run time.\r
88  * To get around this we use the following pre-calculated constants.\r
89  * If you change CONST_BITS you may want to add appropriate values.\r
90  * (With a reasonable C compiler, you can just rely on the FIX() macro...)\r
91  */\r
92 \r
93 #if CONST_BITS == 13\r
94 #define FIX_0_298631336  ((INT32)  2446)        /* FIX(0.298631336) */\r
95 #define FIX_0_390180644  ((INT32)  3196)        /* FIX(0.390180644) */\r
96 #define FIX_0_541196100  ((INT32)  4433)        /* FIX(0.541196100) */\r
97 #define FIX_0_765366865  ((INT32)  6270)        /* FIX(0.765366865) */\r
98 #define FIX_0_899976223  ((INT32)  7373)        /* FIX(0.899976223) */\r
99 #define FIX_1_175875602  ((INT32)  9633)        /* FIX(1.175875602) */\r
100 #define FIX_1_501321110  ((INT32)  12299)       /* FIX(1.501321110) */\r
101 #define FIX_1_847759065  ((INT32)  15137)       /* FIX(1.847759065) */\r
102 #define FIX_1_961570560  ((INT32)  16069)       /* FIX(1.961570560) */\r
103 #define FIX_2_053119869  ((INT32)  16819)       /* FIX(2.053119869) */\r
104 #define FIX_2_562915447  ((INT32)  20995)       /* FIX(2.562915447) */\r
105 #define FIX_3_072711026  ((INT32)  25172)       /* FIX(3.072711026) */\r
106 #else\r
107 #define FIX_0_298631336  FIX(0.298631336)\r
108 #define FIX_0_390180644  FIX(0.390180644)\r
109 #define FIX_0_541196100  FIX(0.541196100)\r
110 #define FIX_0_765366865  FIX(0.765366865)\r
111 #define FIX_0_899976223  FIX(0.899976223)\r
112 #define FIX_1_175875602  FIX(1.175875602)\r
113 #define FIX_1_501321110  FIX(1.501321110)\r
114 #define FIX_1_847759065  FIX(1.847759065)\r
115 #define FIX_1_961570560  FIX(1.961570560)\r
116 #define FIX_2_053119869  FIX(2.053119869)\r
117 #define FIX_2_562915447  FIX(2.562915447)\r
118 #define FIX_3_072711026  FIX(3.072711026)\r
119 #endif\r
120 \r
121 \r
122 /* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.\r
123  * For 8-bit samples with the recommended scaling, all the variable\r
124  * and constant values involved are no more than 16 bits wide, so a\r
125  * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.\r
126  * For 12-bit samples, a full 32-bit multiplication will be needed.\r
127  */\r
128 \r
129 #if BITS_IN_JSAMPLE == 8\r
130 #define MULTIPLY(var,const)  MULTIPLY16C16(var,const)\r
131 #else\r
132 #define MULTIPLY(var,const)  ((var) * (const))\r
133 #endif\r
134 \r
135 \r
136 /*\r
137  * Perform the forward DCT on one block of samples.\r
138  */\r
139 \r
140 GLOBAL(void)\r
141 jpeg_fdct_islow (DCTELEM * data)\r
142 {\r
143   INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;\r
144   INT32 tmp10, tmp11, tmp12, tmp13;\r
145   INT32 z1, z2, z3, z4, z5;\r
146   DCTELEM *dataptr;\r
147   int ctr;\r
148   SHIFT_TEMPS\r
149 \r
150   /* Pass 1: process rows. */\r
151   /* Note results are scaled up by sqrt(8) compared to a true DCT; */\r
152   /* furthermore, we scale the results by 2**PASS1_BITS. */\r
153 \r
154   dataptr = data;\r
155   for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {\r
156     tmp0 = dataptr[0] + dataptr[7];\r
157     tmp7 = dataptr[0] - dataptr[7];\r
158     tmp1 = dataptr[1] + dataptr[6];\r
159     tmp6 = dataptr[1] - dataptr[6];\r
160     tmp2 = dataptr[2] + dataptr[5];\r
161     tmp5 = dataptr[2] - dataptr[5];\r
162     tmp3 = dataptr[3] + dataptr[4];\r
163     tmp4 = dataptr[3] - dataptr[4];\r
164     \r
165     /* Even part per LL&M figure 1 --- note that published figure is faulty;\r
166      * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".\r
167      */\r
168     \r
169     tmp10 = tmp0 + tmp3;\r
170     tmp13 = tmp0 - tmp3;\r
171     tmp11 = tmp1 + tmp2;\r
172     tmp12 = tmp1 - tmp2;\r
173     \r
174     dataptr[0] = (DCTELEM) ((tmp10 + tmp11) << PASS1_BITS);\r
175     dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS);\r
176     \r
177     z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);\r
178     dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),\r
179                                    CONST_BITS-PASS1_BITS);\r
180     dataptr[6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),\r
181                                    CONST_BITS-PASS1_BITS);\r
182     \r
183     /* Odd part per figure 8 --- note paper omits factor of sqrt(2).\r
184      * cK represents cos(K*pi/16).\r
185      * i0..i3 in the paper are tmp4..tmp7 here.\r
186      */\r
187     \r
188     z1 = tmp4 + tmp7;\r
189     z2 = tmp5 + tmp6;\r
190     z3 = tmp4 + tmp6;\r
191     z4 = tmp5 + tmp7;\r
192     z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */\r
193     \r
194     tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */\r
195     tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */\r
196     tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */\r
197     tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */\r
198     z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */\r
199     z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */\r
200     z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */\r
201     z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */\r
202     \r
203     z3 += z5;\r
204     z4 += z5;\r
205     \r
206     dataptr[7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS-PASS1_BITS);\r
207     dataptr[5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, CONST_BITS-PASS1_BITS);\r
208     dataptr[3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, CONST_BITS-PASS1_BITS);\r
209     dataptr[1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, CONST_BITS-PASS1_BITS);\r
210     \r
211     dataptr += DCTSIZE;         /* advance pointer to next row */\r
212   }\r
213 \r
214   /* Pass 2: process columns.\r
215    * We remove the PASS1_BITS scaling, but leave the results scaled up\r
216    * by an overall factor of 8.\r
217    */\r
218 \r
219   dataptr = data;\r
220   for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {\r
221     tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];\r
222     tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];\r
223     tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];\r
224     tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];\r
225     tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];\r
226     tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];\r
227     tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];\r
228     tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];\r
229     \r
230     /* Even part per LL&M figure 1 --- note that published figure is faulty;\r
231      * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".\r
232      */\r
233     \r
234     tmp10 = tmp0 + tmp3;\r
235     tmp13 = tmp0 - tmp3;\r
236     tmp11 = tmp1 + tmp2;\r
237     tmp12 = tmp1 - tmp2;\r
238     \r
239     dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS);\r
240     dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS);\r
241     \r
242     z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);\r
243     dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),\r
244                                            CONST_BITS+PASS1_BITS);\r
245     dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),\r
246                                            CONST_BITS+PASS1_BITS);\r
247     \r
248     /* Odd part per figure 8 --- note paper omits factor of sqrt(2).\r
249      * cK represents cos(K*pi/16).\r
250      * i0..i3 in the paper are tmp4..tmp7 here.\r
251      */\r
252     \r
253     z1 = tmp4 + tmp7;\r
254     z2 = tmp5 + tmp6;\r
255     z3 = tmp4 + tmp6;\r
256     z4 = tmp5 + tmp7;\r
257     z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */\r
258     \r
259     tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */\r
260     tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */\r
261     tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */\r
262     tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */\r
263     z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */\r
264     z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */\r
265     z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */\r
266     z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */\r
267     \r
268     z3 += z5;\r
269     z4 += z5;\r
270     \r
271     dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp4 + z1 + z3,\r
272                                            CONST_BITS+PASS1_BITS);\r
273     dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp5 + z2 + z4,\r
274                                            CONST_BITS+PASS1_BITS);\r
275     dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp6 + z2 + z3,\r
276                                            CONST_BITS+PASS1_BITS);\r
277     dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp7 + z1 + z4,\r
278                                            CONST_BITS+PASS1_BITS);\r
279     \r
280     dataptr++;                  /* advance pointer to next column */\r
281   }\r
282 }\r
283 \r
284 #endif /* DCT_ISLOW_SUPPORTED */\r
285 \r
286 #endif //_FX_JPEG_TURBO_\r