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