ReactOS 0.4.16-dev-2613-g9533ad7
jddctmgr.c
Go to the documentation of this file.
1/*
2 * jddctmgr.c
3 *
4 * Copyright (C) 1994-1996, Thomas G. Lane.
5 * Modified 2002-2025 by Guido Vollbeding.
6 * This file is part of the Independent JPEG Group's software.
7 * For conditions of distribution and use, see the accompanying README file.
8 *
9 * This file contains the inverse-DCT management logic.
10 * This code selects a particular IDCT implementation to be used,
11 * and it performs related housekeeping chores. No code in this file
12 * is executed per IDCT step, only during output pass setup.
13 *
14 * Note that the IDCT routines are responsible for performing coefficient
15 * dequantization as well as the IDCT proper. This module sets up the
16 * dequantization multiplier table needed by the IDCT routine.
17 */
18
19#define JPEG_INTERNALS
20#include "jinclude.h"
21#include "jpeglib.h"
22#include "jdct.h" /* Private declarations for DCT subsystem */
23
24
25/*
26 * The decompressor input side (jdinput.c) saves away the appropriate
27 * quantization table for each component at the start of the first scan
28 * involving that component. (This is necessary in order to correctly
29 * decode files that reuse Q-table slots.)
30 * When we are ready to make an output pass, the saved Q-table is converted
31 * to a multiplier table that will actually be used by the IDCT routine.
32 * The multiplier table contents are IDCT-method-dependent. To support
33 * application changes in IDCT method between scans, we can remake the
34 * multiplier tables if necessary.
35 * In buffered-image mode, the first output pass may occur before any data
36 * has been seen for some components, and thus before their Q-tables have
37 * been saved away. To handle this case, multiplier tables are preset
38 * to zeroes; the result of the IDCT will be a neutral gray level.
39 */
40
41
42/* Private subobject for this module */
43
44typedef struct {
45 struct jpeg_inverse_dct pub; /* public fields */
46
47 /* This array contains the IDCT method code that each multiplier table
48 * is currently set up for, or -1 if it's not yet set up.
49 * The actual multiplier tables are pointed to by dct_table
50 * in the per-component comp_info structures.
51 */
52 int cur_method[MAX_COMPONENTS];
54
56
57
58/* Allocated multiplier tables: big enough for any supported variant */
59
60typedef union {
62#ifdef DCT_IFAST_SUPPORTED
63 IFAST_MULT_TYPE ifast_array[DCTSIZE2];
64#endif
65#ifdef DCT_FLOAT_SUPPORTED
66 FLOAT_MULT_TYPE float_array[DCTSIZE2];
67#endif
69
70
71/*
72 * Prepare for an output pass.
73 * Here we select the proper IDCT routine for each component and build
74 * a matching multiplier table.
75 */
76
77METHODDEF(void)
79{
80 my_idct_ptr idct = (my_idct_ptr) cinfo->idct;
81 int ci, i;
83 int method = 0;
84 inverse_DCT_method_ptr method_ptr = NULL;
85 JQUANT_TBL * qtbl;
86
87 for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
88 ci++, compptr++) {
89 /* Select the proper IDCT routine for this component's scaling */
91#ifdef IDCT_SCALING_SUPPORTED
92/*
93 * The current scaled-IDCT routines require ISLOW-style multiplier tables,
94 * so be sure to compile that code if either ISLOW or SCALING is requested.
95 */
96#ifndef PROVIDE_ISLOW_TABLES
97#define PROVIDE_ISLOW_TABLES
98#endif
99 case ((1 << 8) + 1):
100 method_ptr = jpeg_idct_1x1;
101 method = JDCT_ISLOW; /* jidctint uses islow-style table */
102 break;
103 case ((2 << 8) + 2):
104 method_ptr = jpeg_idct_2x2;
105 method = JDCT_ISLOW; /* jidctint uses islow-style table */
106 break;
107 case ((3 << 8) + 3):
108 method_ptr = jpeg_idct_3x3;
109 method = JDCT_ISLOW; /* jidctint uses islow-style table */
110 break;
111 case ((4 << 8) + 4):
112 method_ptr = jpeg_idct_4x4;
113 method = JDCT_ISLOW; /* jidctint uses islow-style table */
114 break;
115 case ((5 << 8) + 5):
116 method_ptr = jpeg_idct_5x5;
117 method = JDCT_ISLOW; /* jidctint uses islow-style table */
118 break;
119 case ((6 << 8) + 6):
120 method_ptr = jpeg_idct_6x6;
121 method = JDCT_ISLOW; /* jidctint uses islow-style table */
122 break;
123 case ((7 << 8) + 7):
124 method_ptr = jpeg_idct_7x7;
125 method = JDCT_ISLOW; /* jidctint uses islow-style table */
126 break;
127 case ((9 << 8) + 9):
128 method_ptr = jpeg_idct_9x9;
129 method = JDCT_ISLOW; /* jidctint uses islow-style table */
130 break;
131 case ((10 << 8) + 10):
132 method_ptr = jpeg_idct_10x10;
133 method = JDCT_ISLOW; /* jidctint uses islow-style table */
134 break;
135 case ((11 << 8) + 11):
136 method_ptr = jpeg_idct_11x11;
137 method = JDCT_ISLOW; /* jidctint uses islow-style table */
138 break;
139 case ((12 << 8) + 12):
140 method_ptr = jpeg_idct_12x12;
141 method = JDCT_ISLOW; /* jidctint uses islow-style table */
142 break;
143 case ((13 << 8) + 13):
144 method_ptr = jpeg_idct_13x13;
145 method = JDCT_ISLOW; /* jidctint uses islow-style table */
146 break;
147 case ((14 << 8) + 14):
148 method_ptr = jpeg_idct_14x14;
149 method = JDCT_ISLOW; /* jidctint uses islow-style table */
150 break;
151 case ((15 << 8) + 15):
152 method_ptr = jpeg_idct_15x15;
153 method = JDCT_ISLOW; /* jidctint uses islow-style table */
154 break;
155 case ((16 << 8) + 16):
156 method_ptr = jpeg_idct_16x16;
157 method = JDCT_ISLOW; /* jidctint uses islow-style table */
158 break;
159 case ((16 << 8) + 8):
160 method_ptr = jpeg_idct_16x8;
161 method = JDCT_ISLOW; /* jidctint uses islow-style table */
162 break;
163 case ((14 << 8) + 7):
164 method_ptr = jpeg_idct_14x7;
165 method = JDCT_ISLOW; /* jidctint uses islow-style table */
166 break;
167 case ((12 << 8) + 6):
168 method_ptr = jpeg_idct_12x6;
169 method = JDCT_ISLOW; /* jidctint uses islow-style table */
170 break;
171 case ((10 << 8) + 5):
172 method_ptr = jpeg_idct_10x5;
173 method = JDCT_ISLOW; /* jidctint uses islow-style table */
174 break;
175 case ((8 << 8) + 4):
176 method_ptr = jpeg_idct_8x4;
177 method = JDCT_ISLOW; /* jidctint uses islow-style table */
178 break;
179 case ((6 << 8) + 3):
180 method_ptr = jpeg_idct_6x3;
181 method = JDCT_ISLOW; /* jidctint uses islow-style table */
182 break;
183 case ((4 << 8) + 2):
184 method_ptr = jpeg_idct_4x2;
185 method = JDCT_ISLOW; /* jidctint uses islow-style table */
186 break;
187 case ((2 << 8) + 1):
188 method_ptr = jpeg_idct_2x1;
189 method = JDCT_ISLOW; /* jidctint uses islow-style table */
190 break;
191 case ((8 << 8) + 16):
192 method_ptr = jpeg_idct_8x16;
193 method = JDCT_ISLOW; /* jidctint uses islow-style table */
194 break;
195 case ((7 << 8) + 14):
196 method_ptr = jpeg_idct_7x14;
197 method = JDCT_ISLOW; /* jidctint uses islow-style table */
198 break;
199 case ((6 << 8) + 12):
200 method_ptr = jpeg_idct_6x12;
201 method = JDCT_ISLOW; /* jidctint uses islow-style table */
202 break;
203 case ((5 << 8) + 10):
204 method_ptr = jpeg_idct_5x10;
205 method = JDCT_ISLOW; /* jidctint uses islow-style table */
206 break;
207 case ((4 << 8) + 8):
208 method_ptr = jpeg_idct_4x8;
209 method = JDCT_ISLOW; /* jidctint uses islow-style table */
210 break;
211 case ((3 << 8) + 6):
212 method_ptr = jpeg_idct_3x6;
213 method = JDCT_ISLOW; /* jidctint uses islow-style table */
214 break;
215 case ((2 << 8) + 4):
216 method_ptr = jpeg_idct_2x4;
217 method = JDCT_ISLOW; /* jidctint uses islow-style table */
218 break;
219 case ((1 << 8) + 2):
220 method_ptr = jpeg_idct_1x2;
221 method = JDCT_ISLOW; /* jidctint uses islow-style table */
222 break;
223#endif
224 case ((DCTSIZE << 8) + DCTSIZE):
225 switch (cinfo->dct_method) {
226#ifdef DCT_ISLOW_SUPPORTED
227 case JDCT_ISLOW:
228#ifndef PROVIDE_ISLOW_TABLES
229#define PROVIDE_ISLOW_TABLES
230#endif
231 method_ptr = jpeg_idct_islow;
233 break;
234#endif
235#ifdef DCT_IFAST_SUPPORTED
236 case JDCT_IFAST:
237 method_ptr = jpeg_idct_ifast;
239 break;
240#endif
241#ifdef DCT_FLOAT_SUPPORTED
242 case JDCT_FLOAT:
243 method_ptr = jpeg_idct_float;
245 break;
246#endif
247 default:
248 ERREXIT(cinfo, JERR_NOT_COMPILED);
249 }
250 break;
251 default:
252 ERREXIT2(cinfo, JERR_BAD_DCTSIZE,
254 }
255 idct->pub.inverse_DCT[ci] = method_ptr;
256 /* Create multiplier table from quant table.
257 * However, we can skip this if the component is uninteresting
258 * or if we already built the table. Also, if no quant table
259 * has yet been saved for the component, we leave the
260 * multiplier table all-zero; we'll be reading zeroes
261 * from the coefficient controller's buffer anyway.
262 */
263 if (! compptr->component_needed || idct->cur_method[ci] == method)
264 continue;
265 qtbl = compptr->quant_table;
266 if (qtbl == NULL) /* happens if no data yet for component */
267 continue;
268 idct->cur_method[ci] = method;
269 switch (method) {
270#ifdef PROVIDE_ISLOW_TABLES
271 case JDCT_ISLOW:
272 {
273 /* For LL&M IDCT method, multipliers are equal to raw quantization
274 * coefficients, but are stored as ints to ensure access efficiency.
275 */
277 for (i = 0; i < DCTSIZE2; i++) {
278 ismtbl[i] = (ISLOW_MULT_TYPE) qtbl->quantval[i];
279 }
280 }
281 break;
282#endif
283#ifdef DCT_IFAST_SUPPORTED
284 case JDCT_IFAST:
285 {
286 /* For AA&N IDCT method, multipliers are equal to quantization
287 * coefficients scaled by scalefactor[row]*scalefactor[col], where
288 * scalefactor[0] = 1
289 * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7
290 * For integer operation, the multiplier table is to be scaled by
291 * IFAST_SCALE_BITS.
292 */
294#define CONST_BITS 14
295 static const INT16 aanscales[DCTSIZE2] = {
296 /* precomputed values scaled up by 14 bits */
297 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
298 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
299 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
300 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
301 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
302 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
303 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446,
304 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247
305 };
307
308 for (i = 0; i < DCTSIZE2; i++) {
309 ifmtbl[i] = (IFAST_MULT_TYPE)
310 DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],
311 (INT32) aanscales[i]),
312 CONST_BITS-IFAST_SCALE_BITS);
313 }
314 }
315 break;
316#endif
317#ifdef DCT_FLOAT_SUPPORTED
318 case JDCT_FLOAT:
319 {
320 /* For float AA&N IDCT method, multipliers are equal to quantization
321 * coefficients scaled by scalefactor[row]*scalefactor[col], where
322 * scalefactor[0] = 1
323 * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7
324 * We apply a further scale factor of 1/8
325 * with adjustment if necessary.
326 */
328 int row, col;
329 static const double aanscalefactor[DCTSIZE] = {
330 1.0, 1.387039845, 1.306562965, 1.175875602,
331 1.0, 0.785694958, 0.541196100, 0.275899379
332 };
333#if JPEG_DATA_PRECISION == BITS_IN_JSAMPLE
334
335 i = 0;
336 for (row = 0; row < DCTSIZE; row++) {
337 for (col = 0; col < DCTSIZE; col++) {
338 fmtbl[i] = (FLOAT_MULT_TYPE) ((double) qtbl->quantval[i] *
339 aanscalefactor[row] * aanscalefactor[col] * 0.125);
340#else
341 double extrafactor = 0.125;
342
343 /* Adjust extra factor */
344#if JPEG_DATA_PRECISION < BITS_IN_JSAMPLE
346 do { extrafactor *= 2.0; } while (--i);
347#else
349 do { extrafactor *= 0.5; } while (--i);
350#endif
351
352 i = 0;
353 for (row = 0; row < DCTSIZE; row++) {
354 for (col = 0; col < DCTSIZE; col++) {
355 fmtbl[i] = (FLOAT_MULT_TYPE) ((double) qtbl->quantval[i] *
356 aanscalefactor[row] * aanscalefactor[col] * extrafactor);
357#endif
358 i++;
359 }
360 }
361 }
362 break;
363#endif
364 default:
365 ERREXIT(cinfo, JERR_NOT_COMPILED);
366 }
367 }
368}
369
370
371/*
372 * Initialize IDCT manager.
373 */
374
375GLOBAL(void)
377{
378 my_idct_ptr idct;
379 int ci;
381
382 idct = (my_idct_ptr) (*cinfo->mem->alloc_small)
384 cinfo->idct = &idct->pub;
385 idct->pub.start_pass = start_pass;
386
387 for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
388 ci++, compptr++) {
389 /* Allocate and pre-zero a multiplier table for each component */
390 compptr->dct_table = (*cinfo->mem->alloc_small)
393 /* Mark multiplier table not yet set up for any method */
394 idct->cur_method[ci] = -1;
395 }
396}
short INT16
Definition: actypes.h:130
#define SIZEOF(_ar)
Definition: calc.h:97
#define NULL
Definition: types.h:112
struct png_info_def *typedef unsigned char **typedef struct png_info_def *typedef struct png_info_def *typedef struct png_info_def *typedef unsigned char ** row
Definition: typeof.h:78
method
Definition: dragdrop.c:54
for(i=0;i< ARRAY_SIZE(offsets);i++)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
MULTIPLIER ISLOW_MULT_TYPE
Definition: jdct.h:79
MULTIPLIER IFAST_MULT_TYPE
Definition: jdct.h:81
#define MULTIPLY16V16(var1, var2)
Definition: jdct.h:402
#define IFAST_SCALE_BITS
Definition: jdct.h:82
jpeg_component_info * compptr
Definition: jdct.h:252
FAST_FLOAT FLOAT_MULT_TYPE
Definition: jdct.h:88
start_pass(j_decompress_ptr cinfo)
Definition: jddctmgr.c:78
jinit_inverse_dct(j_decompress_ptr cinfo)
Definition: jddctmgr.c:376
my_idct_controller * my_idct_ptr
Definition: jddctmgr.c:55
#define ERREXIT2(cinfo, code, p1, p2)
Definition: jerror.h:216
#define MAX_COMPONENTS
Definition: jmorecfg.h:81
#define JPEG_DATA_PRECISION
Definition: jmorecfg.h:15
#define BITS_IN_JSAMPLE
Definition: jmorecfg.h:16
#define METHODDEF(type)
Definition: jmorecfg.h:323
#define GLOBAL(type)
Definition: jmorecfg.h:327
#define SHIFT_TEMPS
Definition: jpegint.h:300
#define DESCALE(x, n)
Definition: jpegint.h:309
struct jpeg_common_struct * j_common_ptr
Definition: jpeglib.h:284
#define DCTSIZE
Definition: jpeglib.h:50
#define JPOOL_IMAGE
Definition: jpeglib.h:810
@ JDCT_IFAST
Definition: jpeglib.h:242
@ JDCT_FLOAT
Definition: jpeglib.h:243
@ JDCT_ISLOW
Definition: jpeglib.h:241
#define DCTSIZE2
Definition: jpeglib.h:51
#define ERREXIT(msg)
Definition: rdjpgcom.c:72
boolean component_needed
Definition: jpeglib.h:174
JQUANT_TBL * quant_table
Definition: jpeglib.h:189
int cur_method[MAX_COMPONENTS]
Definition: jddctmgr.c:52
struct jpeg_inverse_dct pub
Definition: jddctmgr.c:45
#define MEMZERO(addr, type, size)
Definition: svc_dg.c:324
int32_t INT32
Definition: typedefs.h:58