1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if !defined(_FX_JPEG_TURBO_)
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * jidctred.c
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (C) 1994-1998, Thomas G. Lane.
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * This file is part of the Independent JPEG Group's software.
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * For conditions of distribution and use, see the accompanying README file.
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * This file contains inverse-DCT routines that produce reduced-size output:
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * either 4x4, 2x2, or 1x1 pixels from an 8x8 DCT block.
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * The implementation is based on the Loeffler, Ligtenberg and Moschytz (LL&M)
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * algorithm used in jidctint.c.  We simply replace each 8-to-8 1-D IDCT step
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * with an 8-to-4 step that produces the four averages of two adjacent outputs
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * (or an 8-to-2 step producing two averages of four outputs, for 2x2 output).
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * These steps were derived by computing the corresponding values at the end
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * of the normal LL&M code, then simplifying as much as possible.
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 1x1 is trivial: just take the DC coefficient divided by 8.
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * See jidctint.c for additional comments.
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define JPEG_INTERNALS
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "jinclude.h"
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "jpeglib.h"
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "jdct.h"		/* Private declarations for DCT subsystem */
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef IDCT_SCALING_SUPPORTED
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * This module is specialized to the case DCTSIZE = 8.
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if DCTSIZE != 8
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Scaling is the same as in jidctint.c. */
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if BITS_IN_JSAMPLE == 8
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define CONST_BITS  13
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define PASS1_BITS  2
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define CONST_BITS  13
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define PASS1_BITS  1		/* lose a little precision to avoid overflow */
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * causing a lot of useless floating-point operations at run time.
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * To get around this we use the following pre-calculated constants.
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * If you change CONST_BITS you may want to add appropriate values.
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * (With a reasonable C compiler, you can just rely on the FIX() macro...)
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if CONST_BITS == 13
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_0_211164243  ((INT32)  1730)	/* FIX(0.211164243) */
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_0_509795579  ((INT32)  4176)	/* FIX(0.509795579) */
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_0_601344887  ((INT32)  4926)	/* FIX(0.601344887) */
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_0_720959822  ((INT32)  5906)	/* FIX(0.720959822) */
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_0_765366865  ((INT32)  6270)	/* FIX(0.765366865) */
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_0_850430095  ((INT32)  6967)	/* FIX(0.850430095) */
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_0_899976223  ((INT32)  7373)	/* FIX(0.899976223) */
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_1_061594337  ((INT32)  8697)	/* FIX(1.061594337) */
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_1_272758580  ((INT32)  10426)	/* FIX(1.272758580) */
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_1_451774981  ((INT32)  11893)	/* FIX(1.451774981) */
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_1_847759065  ((INT32)  15137)	/* FIX(1.847759065) */
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_2_172734803  ((INT32)  17799)	/* FIX(2.172734803) */
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_2_562915447  ((INT32)  20995)	/* FIX(2.562915447) */
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_3_624509785  ((INT32)  29692)	/* FIX(3.624509785) */
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_0_211164243  FIX(0.211164243)
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_0_509795579  FIX(0.509795579)
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_0_601344887  FIX(0.601344887)
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_0_720959822  FIX(0.720959822)
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_0_765366865  FIX(0.765366865)
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_0_850430095  FIX(0.850430095)
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_0_899976223  FIX(0.899976223)
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_1_061594337  FIX(1.061594337)
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_1_272758580  FIX(1.272758580)
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_1_451774981  FIX(1.451774981)
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_1_847759065  FIX(1.847759065)
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_2_172734803  FIX(2.172734803)
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_2_562915447  FIX(2.562915447)
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX_3_624509785  FIX(3.624509785)
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * For 8-bit samples with the recommended scaling, all the variable
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * and constant values involved are no more than 16 bits wide, so a
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * For 12-bit samples, a full 32-bit multiplication will be needed.
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if BITS_IN_JSAMPLE == 8
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define MULTIPLY(var,const)  MULTIPLY16C16(var,const)
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define MULTIPLY(var,const)  ((var) * (const))
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Dequantize a coefficient by multiplying it by the multiplier-table
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * entry; produce an int result.  In this module, both inputs and result
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * are 16 bits or less, so either int or short multiply will work.
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define DEQUANTIZE(coef,quantval)  (((ISLOW_MULT_TYPE) (coef)) * (quantval))
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Perform dequantization and inverse DCT on one block of coefficients,
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * producing a reduced-size 4x4 output block.
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovGLOBAL(void)
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovjpeg_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	       JCOEFPTR coef_block,
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	       JSAMPARRAY output_buf, JDIMENSION output_col)
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  INT32 tmp0, tmp2, tmp10, tmp12;
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  INT32 z1, z2, z3, z4;
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  JCOEFPTR inptr;
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ISLOW_MULT_TYPE * quantptr;
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int * wsptr;
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  JSAMPROW outptr;
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  JSAMPLE *range_limit = IDCT_range_limit(cinfo);
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int ctr;
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int workspace[DCTSIZE*4];	/* buffers data between passes */
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  SHIFT_TEMPS
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Pass 1: process columns from input, store into work array. */
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  inptr = coef_block;
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  wsptr = workspace;
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) {
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Don't bother to process column 4, because second pass won't use it */
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (ctr == DCTSIZE-4)
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      continue;
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*5] == 0 &&
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	inptr[DCTSIZE*6] == 0 && inptr[DCTSIZE*7] == 0) {
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      /* AC terms all zero; we need not examine term 4 for 4x4 output */
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      wsptr[DCTSIZE*0] = dcval;
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      wsptr[DCTSIZE*1] = dcval;
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      wsptr[DCTSIZE*2] = dcval;
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      wsptr[DCTSIZE*3] = dcval;
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      continue;
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Even part */
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tmp0 <<= (CONST_BITS+1);
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tmp2 = MULTIPLY(z2, FIX_1_847759065) + MULTIPLY(z3, - FIX_0_765366865);
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tmp10 = tmp0 + tmp2;
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tmp12 = tmp0 - tmp2;
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Odd part */
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    z2 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    z4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Final output stage */
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp2, CONST_BITS-PASS1_BITS+1);
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    wsptr[DCTSIZE*3] = (int) DESCALE(tmp10 - tmp2, CONST_BITS-PASS1_BITS+1);
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    wsptr[DCTSIZE*1] = (int) DESCALE(tmp12 + tmp0, CONST_BITS-PASS1_BITS+1);
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 - tmp0, CONST_BITS-PASS1_BITS+1);
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Pass 2: process 4 rows from work array, store into output array. */
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  wsptr = workspace;
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  for (ctr = 0; ctr < 4; ctr++) {
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr = output_buf[ctr] + output_col;
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* It's not clear whether a zero row test is worthwhile here ... */
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef NO_ZERO_ROW_TEST
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 &&
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      /* AC terms all zero */
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				  & RANGE_MASK];
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      outptr[0] = dcval;
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      outptr[1] = dcval;
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      outptr[2] = dcval;
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      outptr[3] = dcval;
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      wsptr += DCTSIZE;		/* advance pointer to next row */
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      continue;
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Even part */
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tmp0 = ((INT32) wsptr[0]) << (CONST_BITS+1);
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tmp2 = MULTIPLY((INT32) wsptr[2], FIX_1_847759065)
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 + MULTIPLY((INT32) wsptr[6], - FIX_0_765366865);
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tmp10 = tmp0 + tmp2;
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tmp12 = tmp0 - tmp2;
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Odd part */
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    z1 = (INT32) wsptr[7];
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    z2 = (INT32) wsptr[5];
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    z3 = (INT32) wsptr[3];
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    z4 = (INT32) wsptr[1];
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Final output stage */
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp2,
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					  CONST_BITS+PASS1_BITS+3+1)
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			    & RANGE_MASK];
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr[3] = range_limit[(int) DESCALE(tmp10 - tmp2,
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					  CONST_BITS+PASS1_BITS+3+1)
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			    & RANGE_MASK];
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr[1] = range_limit[(int) DESCALE(tmp12 + tmp0,
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					  CONST_BITS+PASS1_BITS+3+1)
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			    & RANGE_MASK];
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr[2] = range_limit[(int) DESCALE(tmp12 - tmp0,
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					  CONST_BITS+PASS1_BITS+3+1)
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			    & RANGE_MASK];
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    wsptr += DCTSIZE;		/* advance pointer to next row */
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Perform dequantization and inverse DCT on one block of coefficients,
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * producing a reduced-size 2x2 output block.
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovGLOBAL(void)
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovjpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	       JCOEFPTR coef_block,
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	       JSAMPARRAY output_buf, JDIMENSION output_col)
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  INT32 tmp0, tmp10, z1;
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  JCOEFPTR inptr;
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ISLOW_MULT_TYPE * quantptr;
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int * wsptr;
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  JSAMPROW outptr;
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  JSAMPLE *range_limit = IDCT_range_limit(cinfo);
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int ctr;
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int workspace[DCTSIZE*2];	/* buffers data between passes */
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  SHIFT_TEMPS
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Pass 1: process columns from input, store into work array. */
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  inptr = coef_block;
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  wsptr = workspace;
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) {
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Don't bother to process columns 2,4,6 */
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (ctr == DCTSIZE-2 || ctr == DCTSIZE-4 || ctr == DCTSIZE-6)
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      continue;
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*3] == 0 &&
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*7] == 0) {
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      /* AC terms all zero; we need not examine terms 2,4,6 for 2x2 output */
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      wsptr[DCTSIZE*0] = dcval;
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      wsptr[DCTSIZE*1] = dcval;
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      continue;
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Even part */
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tmp10 = z1 << (CONST_BITS+2);
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Odd part */
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tmp0 = MULTIPLY(z1, - FIX_0_720959822); /* sqrt(2) * (c7-c5+c3-c1) */
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    z1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tmp0 += MULTIPLY(z1, FIX_0_850430095); /* sqrt(2) * (-c1+c3+c5+c7) */
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    z1 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tmp0 += MULTIPLY(z1, - FIX_1_272758580); /* sqrt(2) * (-c1+c3-c5-c7) */
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tmp0 += MULTIPLY(z1, FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Final output stage */
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp0, CONST_BITS-PASS1_BITS+2);
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    wsptr[DCTSIZE*1] = (int) DESCALE(tmp10 - tmp0, CONST_BITS-PASS1_BITS+2);
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Pass 2: process 2 rows from work array, store into output array. */
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  wsptr = workspace;
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  for (ctr = 0; ctr < 2; ctr++) {
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr = output_buf[ctr] + output_col;
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* It's not clear whether a zero row test is worthwhile here ... */
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef NO_ZERO_ROW_TEST
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (wsptr[1] == 0 && wsptr[3] == 0 && wsptr[5] == 0 && wsptr[7] == 0) {
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      /* AC terms all zero */
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				  & RANGE_MASK];
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      outptr[0] = dcval;
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      outptr[1] = dcval;
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      wsptr += DCTSIZE;		/* advance pointer to next row */
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      continue;
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Even part */
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tmp10 = ((INT32) wsptr[0]) << (CONST_BITS+2);
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Odd part */
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    tmp0 = MULTIPLY((INT32) wsptr[7], - FIX_0_720959822) /* sqrt(2) * (c7-c5+c3-c1) */
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 + MULTIPLY((INT32) wsptr[5], FIX_0_850430095) /* sqrt(2) * (-c1+c3+c5+c7) */
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 + MULTIPLY((INT32) wsptr[3], - FIX_1_272758580) /* sqrt(2) * (-c1+c3-c5-c7) */
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 + MULTIPLY((INT32) wsptr[1], FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Final output stage */
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp0,
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					  CONST_BITS+PASS1_BITS+3+2)
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			    & RANGE_MASK];
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr[1] = range_limit[(int) DESCALE(tmp10 - tmp0,
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					  CONST_BITS+PASS1_BITS+3+2)
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			    & RANGE_MASK];
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    wsptr += DCTSIZE;		/* advance pointer to next row */
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Perform dequantization and inverse DCT on one block of coefficients,
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * producing a reduced-size 1x1 output block.
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovGLOBAL(void)
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovjpeg_idct_1x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	       JCOEFPTR coef_block,
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	       JSAMPARRAY output_buf, JDIMENSION output_col)
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int dcval;
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ISLOW_MULT_TYPE * quantptr;
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  JSAMPLE *range_limit = IDCT_range_limit(cinfo);
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  SHIFT_TEMPS
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* We hardly need an inverse DCT routine for this: just take the
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   * average pixel value, which is one-eighth of the DC coefficient.
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  dcval = DEQUANTIZE(coef_block[0], quantptr[0]);
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  dcval = (int) DESCALE((INT32) dcval, 3);
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  output_buf[0][output_col] = range_limit[dcval & RANGE_MASK];
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* IDCT_SCALING_SUPPORTED */
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif //_FX_JPEG_TURBO_
402