ReactOS 0.4.16-dev-2617-g01a0906
jquant1.c
Go to the documentation of this file.
1/*
2 * jquant1.c
3 *
4 * Copyright (C) 1991-1996, Thomas G. Lane.
5 * Modified 2011-2020 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 1-pass color quantization (color mapping) routines.
10 * These routines provide mapping to a fixed color map using equally spaced
11 * color values. Optional Floyd-Steinberg or ordered dithering is available.
12 */
13
14#define JPEG_INTERNALS
15#include "jinclude.h"
16#include "jpeglib.h"
17
18#ifdef QUANT_1PASS_SUPPORTED
19
20
21/*
22 * The main purpose of 1-pass quantization is to provide a fast, if not very
23 * high quality, colormapped output capability. A 2-pass quantizer usually
24 * gives better visual quality; however, for quantized grayscale output this
25 * quantizer is perfectly adequate. Dithering is highly recommended with this
26 * quantizer, though you can turn it off if you really want to.
27 *
28 * In 1-pass quantization the colormap must be chosen in advance of seeing the
29 * image. We use a map consisting of all combinations of Ncolors[i] color
30 * values for the i'th component. The Ncolors[] values are chosen so that
31 * their product, the total number of colors, is no more than that requested.
32 * (In most cases, the product will be somewhat less.)
33 *
34 * Since the colormap is orthogonal, the representative value for each color
35 * component can be determined without considering the other components;
36 * then these indexes can be combined into a colormap index by a standard
37 * N-dimensional-array-subscript calculation. Most of the arithmetic involved
38 * can be precalculated and stored in the lookup table colorindex[].
39 * colorindex[i][j] maps pixel value j in component i to the nearest
40 * representative value (grid plane) for that component; this index is
41 * multiplied by the array stride for component i, so that the
42 * index of the colormap entry closest to a given pixel value is just
43 * sum( colorindex[component-number][pixel-component-value] )
44 * Aside from being fast, this scheme allows for variable spacing between
45 * representative values with no additional lookup cost.
46 *
47 * If gamma correction has been applied in color conversion, it might be wise
48 * to adjust the color grid spacing so that the representative colors are
49 * equidistant in linear space. At this writing, gamma correction is not
50 * implemented by jdcolor, so nothing is done here.
51 */
52
53
54/* Declarations for ordered dithering.
55 *
56 * We use a standard 16x16 ordered dither array. The basic concept of ordered
57 * dithering is described in many references, for instance Dale Schumacher's
58 * chapter II.2 of Graphics Gems II (James Arvo, ed. Academic Press, 1991).
59 * In place of Schumacher's comparisons against a "threshold" value, we add a
60 * "dither" value to the input pixel and then round the result to the nearest
61 * output value. The dither value is equivalent to (0.5 - threshold) times
62 * the distance between output values. For ordered dithering, we assume that
63 * the output colors are equally spaced; if not, results will probably be
64 * worse, since the dither may be too much or too little at a given point.
65 *
66 * The normal calculation would be to form pixel value + dither, range-limit
67 * this to 0..MAXJSAMPLE, and then index into the colorindex table as usual.
68 * We can skip the separate range-limiting step by extending the colorindex
69 * table in both directions.
70 */
71
72#define ODITHER_SIZE 16 /* dimension of dither matrix */
73/* NB: if ODITHER_SIZE is not a power of 2, ODITHER_MASK uses will break */
74#define ODITHER_CELLS (ODITHER_SIZE*ODITHER_SIZE) /* # cells in matrix */
75#define ODITHER_MASK (ODITHER_SIZE-1) /* mask for wrapping around counters */
76
77typedef int ODITHER_MATRIX[ODITHER_SIZE][ODITHER_SIZE];
78typedef int (*ODITHER_MATRIX_PTR)[ODITHER_SIZE];
79
80static const UINT8 base_dither_matrix[ODITHER_SIZE][ODITHER_SIZE] = {
81 /* Bayer's order-4 dither array. Generated by the code given in
82 * Stephen Hawley's article "Ordered Dithering" in Graphics Gems I.
83 * The values in this array must range from 0 to ODITHER_CELLS-1.
84 */
85 { 0,192, 48,240, 12,204, 60,252, 3,195, 51,243, 15,207, 63,255 },
86 { 128, 64,176,112,140, 76,188,124,131, 67,179,115,143, 79,191,127 },
87 { 32,224, 16,208, 44,236, 28,220, 35,227, 19,211, 47,239, 31,223 },
88 { 160, 96,144, 80,172,108,156, 92,163, 99,147, 83,175,111,159, 95 },
89 { 8,200, 56,248, 4,196, 52,244, 11,203, 59,251, 7,199, 55,247 },
90 { 136, 72,184,120,132, 68,180,116,139, 75,187,123,135, 71,183,119 },
91 { 40,232, 24,216, 36,228, 20,212, 43,235, 27,219, 39,231, 23,215 },
92 { 168,104,152, 88,164,100,148, 84,171,107,155, 91,167,103,151, 87 },
93 { 2,194, 50,242, 14,206, 62,254, 1,193, 49,241, 13,205, 61,253 },
94 { 130, 66,178,114,142, 78,190,126,129, 65,177,113,141, 77,189,125 },
95 { 34,226, 18,210, 46,238, 30,222, 33,225, 17,209, 45,237, 29,221 },
96 { 162, 98,146, 82,174,110,158, 94,161, 97,145, 81,173,109,157, 93 },
97 { 10,202, 58,250, 6,198, 54,246, 9,201, 57,249, 5,197, 53,245 },
98 { 138, 74,186,122,134, 70,182,118,137, 73,185,121,133, 69,181,117 },
99 { 42,234, 26,218, 38,230, 22,214, 41,233, 25,217, 37,229, 21,213 },
100 { 170,106,154, 90,166,102,150, 86,169,105,153, 89,165,101,149, 85 }
101};
102
103
104/* Declarations for Floyd-Steinberg dithering.
105 *
106 * Errors are accumulated into the array fserrors[], at a resolution of
107 * 1/16th of a pixel count. The error at a given pixel is propagated
108 * to its not-yet-processed neighbors using the standard F-S fractions,
109 * ... (here) 7/16
110 * 3/16 5/16 1/16
111 * We work left-to-right on even rows, right-to-left on odd rows.
112 *
113 * We can get away with a single array (holding one row's worth of errors)
114 * by using it to store the current row's errors at pixel columns not yet
115 * processed, but the next row's errors at columns already processed. We
116 * need only a few extra variables to hold the errors immediately around the
117 * current column. (If we are lucky, those variables are in registers, but
118 * even if not, they're probably cheaper to access than array elements are.)
119 *
120 * The fserrors[] array is indexed [component#][position].
121 * We provide (#columns + 2) entries per component; the extra entry at each
122 * end saves us from special-casing the first and last pixels.
123 *
124 * Note: on a wide image, we might not have enough room in a PC's near data
125 * segment to hold the error array; so it is allocated with alloc_large.
126 */
127
128#if BITS_IN_JSAMPLE == 8
129typedef INT16 FSERROR; /* 16 bits should be enough */
130typedef int LOCFSERROR; /* use 'int' for calculation temps */
131#else
132typedef INT32 FSERROR; /* may need more than 16 bits */
133typedef INT32 LOCFSERROR; /* be sure calculation temps are big enough */
134#endif
135
136typedef FSERROR FAR *FSERRPTR; /* pointer to error array (in FAR storage!) */
137
138
139/* Private subobject */
140
141#define MAX_Q_COMPS 4 /* max components I can handle */
142
143typedef struct {
144 struct jpeg_color_quantizer pub; /* public fields */
145
146 /* Initially allocated colormap is saved here */
147 JSAMPARRAY sv_colormap; /* The color map as a 2-D pixel array */
148 int sv_actual; /* number of entries in use */
149
150 JSAMPARRAY colorindex; /* Precomputed mapping for speed */
151 /* colorindex[i][j] = index of color closest to pixel value j in component i,
152 * premultiplied as described above. Since colormap indexes must fit into
153 * JSAMPLEs, the entries of this array will too.
154 */
155 boolean is_padded; /* is the colorindex padded for odither? */
156
157 int Ncolors[MAX_Q_COMPS]; /* # of values alloced to each component */
158
159 /* Variables for ordered dithering */
160 int row_index; /* cur row's vertical index in dither matrix */
161 ODITHER_MATRIX_PTR odither[MAX_Q_COMPS]; /* one dither array per component */
162
163 /* Variables for Floyd-Steinberg dithering */
164 FSERRPTR fserrors[MAX_Q_COMPS]; /* accumulated errors */
165 boolean on_odd_row; /* flag to remember which row we are on */
166} my_cquantizer;
167
168typedef my_cquantizer * my_cquantize_ptr;
169
170
171/*
172 * Policy-making subroutines for create_colormap and create_colorindex.
173 * These routines determine the colormap to be used. The rest of the module
174 * only assumes that the colormap is orthogonal.
175 *
176 * * select_ncolors decides how to divvy up the available colors
177 * among the components.
178 * * output_value defines the set of representative values for a component.
179 * * largest_input_value defines the mapping from input values to
180 * representative values for a component.
181 * Note that the latter two routines may impose different policies for
182 * different components, though this is not currently done.
183 */
184
185
186LOCAL(int)
187select_ncolors (j_decompress_ptr cinfo, int Ncolors[])
188/* Determine allocation of desired colors to components, */
189/* and fill in Ncolors[] array to indicate choice. */
190/* Return value is total number of colors (product of Ncolors[] values). */
191{
192 int nc = cinfo->out_color_components; /* number of color components */
193 int max_colors = cinfo->desired_number_of_colors;
194 int total_colors, iroot, i, j;
195 boolean changed;
196 long temp;
197 static const int RGB_order[3] = { RGB_GREEN, RGB_RED, RGB_BLUE };
198
199 /* We can allocate at least the nc'th root of max_colors per component. */
200 /* Compute floor(nc'th root of max_colors). */
201 iroot = 1;
202 do {
203 iroot++;
204 temp = iroot; /* set temp = iroot ** nc */
205 for (i = 1; i < nc; i++)
206 temp *= iroot;
207 } while (temp <= (long) max_colors); /* repeat till iroot exceeds root */
208 iroot--; /* now iroot = floor(root) */
209
210 /* Must have at least 2 color values per component */
211 if (iroot < 2)
212 ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, (int) temp);
213
214 /* Initialize to iroot color values for each component */
215 total_colors = 1;
216 for (i = 0; i < nc; i++) {
217 Ncolors[i] = iroot;
218 total_colors *= iroot;
219 }
220 /* We may be able to increment the count for one or more components without
221 * exceeding max_colors, though we know not all can be incremented.
222 * Sometimes, the first component can be incremented more than once!
223 * (Example: for 16 colors, we start at 2*2*2, go to 3*2*2, then 4*2*2.)
224 * In RGB colorspace, try to increment G first, then R, then B.
225 */
226 do {
227 changed = FALSE;
228 for (i = 0; i < nc; i++) {
229 j = (cinfo->out_color_space == JCS_RGB ? RGB_order[i] : i);
230 /* calculate new total_colors if Ncolors[j] is incremented */
231 temp = total_colors / Ncolors[j];
232 temp *= Ncolors[j]+1; /* done in long arith to avoid oflo */
233 if (temp > (long) max_colors)
234 break; /* won't fit, done with this pass */
235 Ncolors[j]++; /* OK, apply the increment */
236 total_colors = (int) temp;
237 changed = TRUE;
238 }
239 } while (changed);
240
241 return total_colors;
242}
243
244
245LOCAL(int)
246output_value (j_decompress_ptr cinfo, int ci, int j, int maxj)
247/* Return j'th output value, where j will range from 0 to maxj */
248/* The output values must fall in 0..MAXJSAMPLE in increasing order */
249{
250 /* We always provide values 0 and MAXJSAMPLE for each component;
251 * any additional values are equally spaced between these limits.
252 * (Forcing the upper and lower values to the limits ensures that
253 * dithering can't produce a color outside the selected gamut.)
254 */
255 return (int) (((INT32) j * MAXJSAMPLE + maxj/2) / maxj);
256}
257
258
259LOCAL(int)
260largest_input_value (j_decompress_ptr cinfo, int ci, int j, int maxj)
261/* Return largest input value that should map to j'th output value */
262/* Must have largest(j=0) >= 0, and largest(j=maxj) >= MAXJSAMPLE */
263{
264 /* Breakpoints are halfway between values returned by output_value */
265 return (int) (((INT32) (2*j + 1) * MAXJSAMPLE + maxj) / (2*maxj));
266}
267
268
269/*
270 * Create the colormap.
271 */
272
273LOCAL(void)
274create_colormap (j_decompress_ptr cinfo)
275{
276 my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
277 JSAMPARRAY colormap; /* Created colormap */
278 int total_colors; /* Number of distinct output colors */
279 int i,j,k, nci, blksize, blkdist, ptr, val;
280
281 /* Select number of colors for each component */
282 total_colors = select_ncolors(cinfo, cquantize->Ncolors);
283
284 /* Report selected color counts */
285 if (cinfo->out_color_components == 3)
286 TRACEMS4(cinfo, 1, JTRC_QUANT_3_NCOLORS,
287 total_colors, cquantize->Ncolors[0],
288 cquantize->Ncolors[1], cquantize->Ncolors[2]);
289 else
290 TRACEMS1(cinfo, 1, JTRC_QUANT_NCOLORS, total_colors);
291
292 /* Allocate and fill in the colormap. */
293 /* The colors are ordered in the map in standard row-major order, */
294 /* i.e. rightmost (highest-indexed) color changes most rapidly. */
295
296 colormap = (*cinfo->mem->alloc_sarray) ((j_common_ptr) cinfo, JPOOL_IMAGE,
297 (JDIMENSION) total_colors, (JDIMENSION) cinfo->out_color_components);
298
299 /* blksize is number of adjacent repeated entries for a component */
300 /* blkdist is distance between groups of identical entries for a component */
301 blkdist = total_colors;
302
303 for (i = 0; i < cinfo->out_color_components; i++) {
304 /* fill in colormap entries for i'th color component */
305 nci = cquantize->Ncolors[i]; /* # of distinct values for this color */
306 blksize = blkdist / nci;
307 for (j = 0; j < nci; j++) {
308 /* Compute j'th output value (out of nci) for component */
309 val = output_value(cinfo, i, j, nci-1);
310 /* Fill in all colormap entries that have this value of this component */
311 for (ptr = j * blksize; ptr < total_colors; ptr += blkdist) {
312 /* fill in blksize entries beginning at ptr */
313 for (k = 0; k < blksize; k++)
314 colormap[i][ptr+k] = (JSAMPLE) val;
315 }
316 }
317 blkdist = blksize; /* blksize of this color is blkdist of next */
318 }
319
320 /* Save the colormap in private storage,
321 * where it will survive color quantization mode changes.
322 */
323 cquantize->sv_colormap = colormap;
324 cquantize->sv_actual = total_colors;
325}
326
327
328/*
329 * Create the color index table.
330 */
331
332LOCAL(void)
333create_colorindex (j_decompress_ptr cinfo)
334{
335 my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
336 JSAMPROW indexptr;
337 int i,j,k, nci, blksize, val, pad;
338
339 /* For ordered dither, we pad the color index tables by MAXJSAMPLE in
340 * each direction (input index values can be -MAXJSAMPLE .. 2*MAXJSAMPLE).
341 * This is not necessary in the other dithering modes. However, we
342 * flag whether it was done in case user changes dithering mode.
343 */
344 if (cinfo->dither_mode == JDITHER_ORDERED) {
345 pad = MAXJSAMPLE*2;
346 cquantize->is_padded = TRUE;
347 } else {
348 pad = 0;
349 cquantize->is_padded = FALSE;
350 }
351
352 cquantize->colorindex = (*cinfo->mem->alloc_sarray)
353 ((j_common_ptr) cinfo, JPOOL_IMAGE,
354 (JDIMENSION) (MAXJSAMPLE+1 + pad),
356
357 /* blksize is number of adjacent repeated entries for a component */
358 blksize = cquantize->sv_actual;
359
360 for (i = 0; i < cinfo->out_color_components; i++) {
361 /* fill in colorindex entries for i'th color component */
362 nci = cquantize->Ncolors[i]; /* # of distinct values for this color */
363 blksize = blksize / nci;
364
365 /* adjust colorindex pointers to provide padding at negative indexes. */
366 if (pad)
367 cquantize->colorindex[i] += MAXJSAMPLE;
368
369 /* in loop, val = index of current output value, */
370 /* and k = largest j that maps to current val */
371 indexptr = cquantize->colorindex[i];
372 val = 0;
373 k = largest_input_value(cinfo, i, 0, nci-1);
374 for (j = 0; j <= MAXJSAMPLE; j++) {
375 while (j > k) /* advance val if past boundary */
376 k = largest_input_value(cinfo, i, ++val, nci-1);
377 /* premultiply so that no multiplication needed in main processing */
378 indexptr[j] = (JSAMPLE) (val * blksize);
379 }
380 /* Pad at both ends if necessary */
381 if (pad)
382 for (j = 1; j <= MAXJSAMPLE; j++) {
383 indexptr[-j] = indexptr[0];
384 indexptr[MAXJSAMPLE+j] = indexptr[MAXJSAMPLE];
385 }
386 }
387}
388
389
390/*
391 * Create an ordered-dither array for a component having ncolors
392 * distinct output values.
393 */
394
395LOCAL(ODITHER_MATRIX_PTR)
396make_odither_array (j_decompress_ptr cinfo, int ncolors)
397{
398 ODITHER_MATRIX_PTR odither;
399 int j,k;
400 INT32 num,den;
401
402 odither = (ODITHER_MATRIX_PTR) (*cinfo->mem->alloc_small)
403 ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(ODITHER_MATRIX));
404 /* The inter-value distance for this color is MAXJSAMPLE/(ncolors-1).
405 * Hence the dither value for the matrix cell with fill order f
406 * (f=0..N-1) should be (N-1-2*f)/(2*N) * MAXJSAMPLE/(ncolors-1).
407 * On 16-bit-int machine, be careful to avoid overflow.
408 */
409 den = 2 * ODITHER_CELLS * ((INT32) (ncolors - 1));
410 for (j = 0; j < ODITHER_SIZE; j++) {
411 for (k = 0; k < ODITHER_SIZE; k++) {
412 num = ((INT32) (ODITHER_CELLS-1 - 2*((int)base_dither_matrix[j][k])))
413 * MAXJSAMPLE;
414 /* Ensure round towards zero despite C's lack of consistency
415 * about rounding negative values in integer division...
416 */
417 odither[j][k] = (int) (num<0 ? -((-num)/den) : num/den);
418 }
419 }
420 return odither;
421}
422
423
424/*
425 * Create the ordered-dither tables.
426 * Components having the same number of representative colors may
427 * share a dither table.
428 */
429
430LOCAL(void)
431create_odither_tables (j_decompress_ptr cinfo)
432{
433 my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
434 ODITHER_MATRIX_PTR odither;
435 int i, j, nci;
436
437 for (i = 0; i < cinfo->out_color_components; i++) {
438 nci = cquantize->Ncolors[i]; /* # of distinct values for this color */
439 odither = NULL; /* search for matching prior component */
440 for (j = 0; j < i; j++) {
441 if (nci == cquantize->Ncolors[j]) {
442 odither = cquantize->odither[j];
443 break;
444 }
445 }
446 if (odither == NULL) /* need a new table? */
447 odither = make_odither_array(cinfo, nci);
448 cquantize->odither[i] = odither;
449 }
450}
451
452
453/*
454 * Map some rows of pixels to the output colormapped representation.
455 */
456
457METHODDEF(void)
458color_quantize (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
460/* General case, no dithering */
461{
462 my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
463 JSAMPARRAY colorindex = cquantize->colorindex;
464 register int pixcode, ci;
465 register JSAMPROW ptrin, ptrout;
466 int row;
467 JDIMENSION col;
469 register int nc = cinfo->out_color_components;
470
471 for (row = 0; row < num_rows; row++) {
472 ptrin = input_buf[row];
473 ptrout = output_buf[row];
474 for (col = width; col > 0; col--) {
475 pixcode = 0;
476 for (ci = 0; ci < nc; ci++) {
477 pixcode += GETJSAMPLE(colorindex[ci][GETJSAMPLE(*ptrin++)]);
478 }
479 *ptrout++ = (JSAMPLE) pixcode;
480 }
481 }
482}
483
484
485METHODDEF(void)
486color_quantize3 (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
488/* Fast path for out_color_components==3, no dithering */
489{
490 my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
491 register int pixcode;
492 register JSAMPROW ptrin, ptrout;
493 JSAMPROW colorindex0 = cquantize->colorindex[0];
494 JSAMPROW colorindex1 = cquantize->colorindex[1];
495 JSAMPROW colorindex2 = cquantize->colorindex[2];
496 int row;
497 JDIMENSION col;
499
500 for (row = 0; row < num_rows; row++) {
501 ptrin = input_buf[row];
502 ptrout = output_buf[row];
503 for (col = width; col > 0; col--) {
504 pixcode = GETJSAMPLE(colorindex0[GETJSAMPLE(*ptrin++)]);
505 pixcode += GETJSAMPLE(colorindex1[GETJSAMPLE(*ptrin++)]);
506 pixcode += GETJSAMPLE(colorindex2[GETJSAMPLE(*ptrin++)]);
507 *ptrout++ = (JSAMPLE) pixcode;
508 }
509 }
510}
511
512
513METHODDEF(void)
514quantize_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
516/* General case, with ordered dithering */
517{
518 my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
519 register JSAMPROW input_ptr;
520 register JSAMPROW output_ptr;
521 JSAMPROW colorindex_ci;
522 int * dither; /* points to active row of dither matrix */
523 int row_index, col_index; /* current indexes into dither matrix */
524 int nc = cinfo->out_color_components;
525 int ci;
526 int row;
527 JDIMENSION col;
529
530 for (row = 0; row < num_rows; row++) {
531 /* Initialize output values to 0 so can process components separately */
532 FMEMZERO((void FAR *) output_buf[row], (size_t) width * SIZEOF(JSAMPLE));
533 row_index = cquantize->row_index;
534 for (ci = 0; ci < nc; ci++) {
535 input_ptr = input_buf[row] + ci;
536 output_ptr = output_buf[row];
537 colorindex_ci = cquantize->colorindex[ci];
538 dither = cquantize->odither[ci][row_index];
539 col_index = 0;
540
541 for (col = width; col > 0; col--) {
542 /* Form pixel value + dither, range-limit to 0..MAXJSAMPLE,
543 * select output value, accumulate into output code for this pixel.
544 * Range-limiting need not be done explicitly, as we have extended
545 * the colorindex table to produce the right answers for out-of-range
546 * inputs. The maximum dither is +- MAXJSAMPLE; this sets the
547 * required amount of padding.
548 */
549 *output_ptr += colorindex_ci[GETJSAMPLE(*input_ptr)+dither[col_index]];
550 input_ptr += nc;
551 output_ptr++;
552 col_index = (col_index + 1) & ODITHER_MASK;
553 }
554 }
555 /* Advance row index for next row */
556 row_index = (row_index + 1) & ODITHER_MASK;
557 cquantize->row_index = row_index;
558 }
559}
560
561
562METHODDEF(void)
563quantize3_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
565/* Fast path for out_color_components==3, with ordered dithering */
566{
567 my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
568 register int pixcode;
569 register JSAMPROW input_ptr;
570 register JSAMPROW output_ptr;
571 JSAMPROW colorindex0 = cquantize->colorindex[0];
572 JSAMPROW colorindex1 = cquantize->colorindex[1];
573 JSAMPROW colorindex2 = cquantize->colorindex[2];
574 int * dither0; /* points to active row of dither matrix */
575 int * dither1;
576 int * dither2;
577 int row_index, col_index; /* current indexes into dither matrix */
578 int row;
579 JDIMENSION col;
581
582 for (row = 0; row < num_rows; row++) {
583 row_index = cquantize->row_index;
584 input_ptr = input_buf[row];
585 output_ptr = output_buf[row];
586 dither0 = cquantize->odither[0][row_index];
587 dither1 = cquantize->odither[1][row_index];
588 dither2 = cquantize->odither[2][row_index];
589 col_index = 0;
590
591 for (col = width; col > 0; col--) {
592 pixcode = GETJSAMPLE(colorindex0[GETJSAMPLE(*input_ptr++) +
593 dither0[col_index]]);
594 pixcode += GETJSAMPLE(colorindex1[GETJSAMPLE(*input_ptr++) +
595 dither1[col_index]]);
596 pixcode += GETJSAMPLE(colorindex2[GETJSAMPLE(*input_ptr++) +
597 dither2[col_index]]);
598 *output_ptr++ = (JSAMPLE) pixcode;
599 col_index = (col_index + 1) & ODITHER_MASK;
600 }
601 row_index = (row_index + 1) & ODITHER_MASK;
602 cquantize->row_index = row_index;
603 }
604}
605
606
607METHODDEF(void)
608quantize_fs_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
610/* General case, with Floyd-Steinberg dithering */
611{
612 my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
613 register LOCFSERROR cur; /* current error or pixel value */
614 LOCFSERROR belowerr; /* error for pixel below cur */
615 LOCFSERROR bpreverr; /* error for below/prev col */
616 LOCFSERROR bnexterr; /* error for below/next col */
617 LOCFSERROR delta;
618 register FSERRPTR errorptr; /* => fserrors[] at column before current */
619 register JSAMPROW input_ptr;
620 register JSAMPROW output_ptr;
621 JSAMPROW colorindex_ci;
622 JSAMPROW colormap_ci;
623 int pixcode;
624 int nc = cinfo->out_color_components;
625 int dir; /* 1 for left-to-right, -1 for right-to-left */
626 int dirnc; /* dir * nc */
627 int ci;
628 int row;
629 JDIMENSION col;
631 JSAMPLE *range_limit = cinfo->sample_range_limit;
633
634 for (row = 0; row < num_rows; row++) {
635 /* Initialize output values to 0 so can process components separately */
636 FMEMZERO((void FAR *) output_buf[row], (size_t) width * SIZEOF(JSAMPLE));
637 for (ci = 0; ci < nc; ci++) {
638 input_ptr = input_buf[row] + ci;
639 output_ptr = output_buf[row];
640 if (cquantize->on_odd_row) {
641 /* work right to left in this row */
642 input_ptr += (width-1) * nc; /* so point to rightmost pixel */
643 output_ptr += width-1;
644 dir = -1;
645 dirnc = -nc;
646 errorptr = cquantize->fserrors[ci] + (width+1); /* => entry after last column */
647 } else {
648 /* work left to right in this row */
649 dir = 1;
650 dirnc = nc;
651 errorptr = cquantize->fserrors[ci]; /* => entry before first column */
652 }
653 colorindex_ci = cquantize->colorindex[ci];
654 colormap_ci = cquantize->sv_colormap[ci];
655 /* Preset error values: no error propagated to first pixel from left */
656 cur = 0;
657 /* and no error propagated to row below yet */
658 belowerr = bpreverr = 0;
659
660 for (col = width; col > 0; col--) {
661 /* cur holds the error propagated from the previous pixel on the
662 * current line. Add the error propagated from the previous line
663 * to form the complete error correction term for this pixel, and
664 * round the error term (which is expressed * 16) to an integer.
665 * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct
666 * for either sign of the error value.
667 * Note: errorptr points to *previous* column's array entry.
668 */
669 cur = RIGHT_SHIFT(cur + errorptr[dir] + 8, 4);
670 /* Form pixel value + error, and range-limit to 0..MAXJSAMPLE.
671 * The maximum error is +- MAXJSAMPLE; this sets the required size
672 * of the range_limit array.
673 */
674 cur += GETJSAMPLE(*input_ptr);
675 cur = GETJSAMPLE(range_limit[cur]);
676 /* Select output value, accumulate into output code for this pixel */
677 pixcode = GETJSAMPLE(colorindex_ci[cur]);
678 *output_ptr += (JSAMPLE) pixcode;
679 /* Compute actual representation error at this pixel */
680 /* Note: we can do this even though we don't have the final */
681 /* pixel code, because the colormap is orthogonal. */
682 cur -= GETJSAMPLE(colormap_ci[pixcode]);
683 /* Compute error fractions to be propagated to adjacent pixels.
684 * Add these into the running sums, and simultaneously shift the
685 * next-line error sums left by 1 column.
686 */
687 bnexterr = cur;
688 delta = cur * 2;
689 cur += delta; /* form error * 3 */
690 errorptr[0] = (FSERROR) (bpreverr + cur);
691 cur += delta; /* form error * 5 */
692 bpreverr = belowerr + cur;
693 belowerr = bnexterr;
694 cur += delta; /* form error * 7 */
695 /* At this point cur contains the 7/16 error value to be propagated
696 * to the next pixel on the current line, and all the errors for the
697 * next line have been shifted over. We are therefore ready to move on.
698 */
699 input_ptr += dirnc; /* advance input ptr to next column */
700 output_ptr += dir; /* advance output ptr to next column */
701 errorptr += dir; /* advance errorptr to current column */
702 }
703 /* Post-loop cleanup: we must unload the final error value into the
704 * final fserrors[] entry. Note we need not unload belowerr because
705 * it is for the dummy column before or after the actual array.
706 */
707 errorptr[0] = (FSERROR) bpreverr; /* unload prev err into array */
708 }
709 cquantize->on_odd_row = (cquantize->on_odd_row ? FALSE : TRUE);
710 }
711}
712
713
714/*
715 * Allocate workspace for Floyd-Steinberg errors.
716 */
717
718LOCAL(void)
719alloc_fs_workspace (j_decompress_ptr cinfo)
720{
721 my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
722 size_t arraysize;
723 int i;
724
725 arraysize = ((size_t) cinfo->output_width + (size_t) 2) * SIZEOF(FSERROR);
726 for (i = 0; i < cinfo->out_color_components; i++) {
727 cquantize->fserrors[i] = (FSERRPTR) (*cinfo->mem->alloc_large)
728 ((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize);
729 }
730}
731
732
733/*
734 * Initialize for one-pass color quantization.
735 */
736
737METHODDEF(void)
738start_pass_1_quant (j_decompress_ptr cinfo, boolean is_pre_scan)
739{
740 my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
741 size_t arraysize;
742 int i;
743
744 /* Install my colormap. */
745 cinfo->colormap = cquantize->sv_colormap;
746 cinfo->actual_number_of_colors = cquantize->sv_actual;
747
748 /* Initialize for desired dithering mode. */
749 switch (cinfo->dither_mode) {
750 case JDITHER_NONE:
751 if (cinfo->out_color_components == 3)
752 cquantize->pub.color_quantize = color_quantize3;
753 else
754 cquantize->pub.color_quantize = color_quantize;
755 break;
756 case JDITHER_ORDERED:
757 if (cinfo->out_color_components == 3)
758 cquantize->pub.color_quantize = quantize3_ord_dither;
759 else
760 cquantize->pub.color_quantize = quantize_ord_dither;
761 cquantize->row_index = 0; /* initialize state for ordered dither */
762 /* If user changed to ordered dither from another mode,
763 * we must recreate the color index table with padding.
764 * This will cost extra space, but probably isn't very likely.
765 */
766 if (! cquantize->is_padded)
767 create_colorindex(cinfo);
768 /* Create ordered-dither tables if we didn't already. */
769 if (cquantize->odither[0] == NULL)
770 create_odither_tables(cinfo);
771 break;
772 case JDITHER_FS:
773 cquantize->pub.color_quantize = quantize_fs_dither;
774 cquantize->on_odd_row = FALSE; /* initialize state for F-S dither */
775 /* Allocate Floyd-Steinberg workspace if didn't already. */
776 if (cquantize->fserrors[0] == NULL)
777 alloc_fs_workspace(cinfo);
778 /* Initialize the propagated errors to zero. */
779 arraysize = ((size_t) cinfo->output_width + (size_t) 2) * SIZEOF(FSERROR);
780 for (i = 0; i < cinfo->out_color_components; i++)
781 FMEMZERO((void FAR *) cquantize->fserrors[i], arraysize);
782 break;
783 default:
784 ERREXIT(cinfo, JERR_NOT_COMPILED);
785 }
786}
787
788
789/*
790 * Finish up at the end of the pass.
791 */
792
793METHODDEF(void)
794finish_pass_1_quant (j_decompress_ptr cinfo)
795{
796 /* no work in 1-pass case */
797}
798
799
800/*
801 * Switch to a new external colormap between output passes.
802 * Shouldn't get to this module!
803 */
804
805METHODDEF(void)
806new_color_map_1_quant (j_decompress_ptr cinfo)
807{
808 ERREXIT(cinfo, JERR_MODE_CHANGE);
809}
810
811
812/*
813 * Module initialization routine for 1-pass color quantization.
814 */
815
816GLOBAL(void)
817jinit_1pass_quantizer (j_decompress_ptr cinfo)
818{
819 my_cquantize_ptr cquantize;
820
821 cquantize = (my_cquantize_ptr) (*cinfo->mem->alloc_small)
822 ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_cquantizer));
823 cinfo->cquantize = &cquantize->pub;
824 cquantize->pub.start_pass = start_pass_1_quant;
825 cquantize->pub.finish_pass = finish_pass_1_quant;
826 cquantize->pub.new_color_map = new_color_map_1_quant;
827 cquantize->fserrors[0] = NULL; /* Flag FS workspace not allocated */
828 cquantize->odither[0] = NULL; /* Also flag odither arrays not allocated */
829
830 /* Make sure my internal arrays won't overflow */
831 if (cinfo->out_color_components > MAX_Q_COMPS)
832 ERREXIT1(cinfo, JERR_QUANT_COMPONENTS, MAX_Q_COMPS);
833 /* Make sure colormap indexes can be represented by JSAMPLEs */
834 if (cinfo->desired_number_of_colors > (MAXJSAMPLE+1))
835 ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXJSAMPLE+1);
836
837 /* Create the colormap and color index table. */
838 create_colormap(cinfo);
839 create_colorindex(cinfo);
840
841 /* Allocate Floyd-Steinberg workspace now if requested.
842 * We do this now since it is FAR storage and may affect the memory
843 * manager's space calculations. If the user changes to FS dither
844 * mode in a later pass, we will allocate the space then, and will
845 * possibly overrun the max_memory_to_use setting.
846 */
847 if (cinfo->dither_mode == JDITHER_FS)
848 alloc_fs_workspace(cinfo);
849}
850
851#endif /* QUANT_1PASS_SUPPORTED */
short INT16
Definition: actypes.h:130
unsigned char UINT8
Definition: actypes.h:128
unsigned int dir
Definition: maze.c:112
static void output_value(const WCHAR *value_name, DWORD type, BYTE *data, DWORD data_size)
Definition: query.c:113
#define SIZEOF(_ar)
Definition: calc.h:97
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define FAR
Definition: zlib.h:34
unsigned int size_t
Definition: corecrt.h:203
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
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
switch(r->id)
Definition: btrfs.c:3046
for(i=0;i< ARRAY_SIZE(offsets);i++)
FxCollectionEntry * cur
GLint GLint GLsizei width
Definition: gl.h:1546
GLuint GLfloat * val
Definition: glext.h:7180
GLuint GLuint num
Definition: glext.h:9618
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
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 GLint GLint j
Definition: glfuncs.h:250
jpeg_component_info JCOEFPTR JSAMPARRAY output_buf
Definition: jdct.h:253
#define TRACEMS1(cinfo, lvl, code, p1)
Definition: jerror.h:268
#define TRACEMS4(cinfo, lvl, code, p1, p2, p3, p4)
Definition: jerror.h:282
#define ERREXIT1(cinfo, code, p1)
Definition: jerror.h:212
unsigned int JDIMENSION
Definition: jmorecfg.h:265
#define MAXJSAMPLE
Definition: jmorecfg.h:119
char JSAMPLE
Definition: jmorecfg.h:110
#define LOCAL(type)
Definition: jmorecfg.h:325
#define METHODDEF(type)
Definition: jmorecfg.h:323
#define GLOBAL(type)
Definition: jmorecfg.h:327
#define GETJSAMPLE(value)
Definition: jmorecfg.h:114
#define SHIFT_TEMPS
Definition: jpegint.h:300
JSAMPARRAY int num_rows
Definition: jpegint.h:420
#define FMEMZERO(target, size)
Definition: jpegint.h:367
#define RIGHT_SHIFT(x, shft)
Definition: jpegint.h:301
struct jpeg_common_struct * j_common_ptr
Definition: jpeglib.h:284
@ JDITHER_NONE
Definition: jpeglib.h:256
@ JDITHER_FS
Definition: jpeglib.h:258
@ JDITHER_ORDERED
Definition: jpeglib.h:257
@ JCS_RGB
Definition: jpeglib.h:223
JSAMPROW * JSAMPARRAY
Definition: jpeglib.h:76
JSAMPLE FAR * JSAMPROW
Definition: jpeglib.h:75
#define JPOOL_IMAGE
Definition: jpeglib.h:810
if(dx< 0)
Definition: linetemp.h:194
static PVOID ptr
Definition: dispmode.c:27
int k
Definition: mpi.c:3369
#define ERREXIT(msg)
Definition: rdjpgcom.c:72
static calc_node_t temp
Definition: rpn_ieee.c:38
JSAMPARRAY colormap
Definition: jpeglib.h:528
J_COLOR_SPACE out_color_space
Definition: jpeglib.h:479
JSAMPLE * sample_range_limit
Definition: jpeglib.h:644
JDIMENSION output_width
Definition: jpeglib.h:508
J_DITHER_MODE dither_mode
Definition: jpeglib.h:494
struct jpeg_color_quantizer * cquantize
Definition: jpeglib.h:690
MYWORD blksize
Definition: tftpd.cpp:45
int32_t INT32
Definition: typedefs.h:58