QtBase  v6.3.1
jquant2.c
Go to the documentation of this file.
1 /*
2  * jquant2.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, 2014-2015, 2020, D. R. Commander.
8  * For conditions of distribution and use, see the accompanying README.ijg
9  * file.
10  *
11  * This file contains 2-pass color quantization (color mapping) routines.
12  * These routines provide selection of a custom color map for an image,
13  * followed by mapping of the image to that color map, with optional
14  * Floyd-Steinberg dithering.
15  * It is also possible to use just the second pass to map to an arbitrary
16  * externally-given color map.
17  *
18  * Note: ordered dithering is not supported, since there isn't any fast
19  * way to compute intercolor distances; it's unclear that ordered dither's
20  * fundamental assumptions even hold with an irregularly spaced color map.
21  */
22 
23 #define JPEG_INTERNALS
24 #include "jinclude.h"
25 #include "jpeglib.h"
26 
27 #ifdef QUANT_2PASS_SUPPORTED
28 
29 
30 /*
31  * This module implements the well-known Heckbert paradigm for color
32  * quantization. Most of the ideas used here can be traced back to
33  * Heckbert's seminal paper
34  * Heckbert, Paul. "Color Image Quantization for Frame Buffer Display",
35  * Proc. SIGGRAPH '82, Computer Graphics v.16 #3 (July 1982), pp 297-304.
36  *
37  * In the first pass over the image, we accumulate a histogram showing the
38  * usage count of each possible color. To keep the histogram to a reasonable
39  * size, we reduce the precision of the input; typical practice is to retain
40  * 5 or 6 bits per color, so that 8 or 4 different input values are counted
41  * in the same histogram cell.
42  *
43  * Next, the color-selection step begins with a box representing the whole
44  * color space, and repeatedly splits the "largest" remaining box until we
45  * have as many boxes as desired colors. Then the mean color in each
46  * remaining box becomes one of the possible output colors.
47  *
48  * The second pass over the image maps each input pixel to the closest output
49  * color (optionally after applying a Floyd-Steinberg dithering correction).
50  * This mapping is logically trivial, but making it go fast enough requires
51  * considerable care.
52  *
53  * Heckbert-style quantizers vary a good deal in their policies for choosing
54  * the "largest" box and deciding where to cut it. The particular policies
55  * used here have proved out well in experimental comparisons, but better ones
56  * may yet be found.
57  *
58  * In earlier versions of the IJG code, this module quantized in YCbCr color
59  * space, processing the raw upsampled data without a color conversion step.
60  * This allowed the color conversion math to be done only once per colormap
61  * entry, not once per pixel. However, that optimization precluded other
62  * useful optimizations (such as merging color conversion with upsampling)
63  * and it also interfered with desired capabilities such as quantizing to an
64  * externally-supplied colormap. We have therefore abandoned that approach.
65  * The present code works in the post-conversion color space, typically RGB.
66  *
67  * To improve the visual quality of the results, we actually work in scaled
68  * RGB space, giving G distances more weight than R, and R in turn more than
69  * B. To do everything in integer math, we must use integer scale factors.
70  * The 2/3/1 scale factors used here correspond loosely to the relative
71  * weights of the colors in the NTSC grayscale equation.
72  * If you want to use this code to quantize a non-RGB color space, you'll
73  * probably need to change these scale factors.
74  */
75 
76 #define R_SCALE 2 /* scale R distances by this much */
77 #define G_SCALE 3 /* scale G distances by this much */
78 #define B_SCALE 1 /* and B by this much */
79 
80 static const int c_scales[3] = { R_SCALE, G_SCALE, B_SCALE };
81 #define C0_SCALE c_scales[rgb_red[cinfo->out_color_space]]
82 #define C1_SCALE c_scales[rgb_green[cinfo->out_color_space]]
83 #define C2_SCALE c_scales[rgb_blue[cinfo->out_color_space]]
84 
85 /*
86  * First we have the histogram data structure and routines for creating it.
87  *
88  * The number of bits of precision can be adjusted by changing these symbols.
89  * We recommend keeping 6 bits for G and 5 each for R and B.
90  * If you have plenty of memory and cycles, 6 bits all around gives marginally
91  * better results; if you are short of memory, 5 bits all around will save
92  * some space but degrade the results.
93  * To maintain a fully accurate histogram, we'd need to allocate a "long"
94  * (preferably unsigned long) for each cell. In practice this is overkill;
95  * we can get by with 16 bits per cell. Few of the cell counts will overflow,
96  * and clamping those that do overflow to the maximum value will give close-
97  * enough results. This reduces the recommended histogram size from 256Kb
98  * to 128Kb, which is a useful savings on PC-class machines.
99  * (In the second pass the histogram space is re-used for pixel mapping data;
100  * in that capacity, each cell must be able to store zero to the number of
101  * desired colors. 16 bits/cell is plenty for that too.)
102  * Since the JPEG code is intended to run in small memory model on 80x86
103  * machines, we can't just allocate the histogram in one chunk. Instead
104  * of a true 3-D array, we use a row of pointers to 2-D arrays. Each
105  * pointer corresponds to a C0 value (typically 2^5 = 32 pointers) and
106  * each 2-D array has 2^6*2^5 = 2048 or 2^6*2^6 = 4096 entries.
107  */
108 
109 #define MAXNUMCOLORS (MAXJSAMPLE + 1) /* maximum size of colormap */
110 
111 /* These will do the right thing for either R,G,B or B,G,R color order,
112  * but you may not like the results for other color orders.
113  */
114 #define HIST_C0_BITS 5 /* bits of precision in R/B histogram */
115 #define HIST_C1_BITS 6 /* bits of precision in G histogram */
116 #define HIST_C2_BITS 5 /* bits of precision in B/R histogram */
117 
118 /* Number of elements along histogram axes. */
119 #define HIST_C0_ELEMS (1 << HIST_C0_BITS)
120 #define HIST_C1_ELEMS (1 << HIST_C1_BITS)
121 #define HIST_C2_ELEMS (1 << HIST_C2_BITS)
122 
123 /* These are the amounts to shift an input value to get a histogram index. */
124 #define C0_SHIFT (BITS_IN_JSAMPLE - HIST_C0_BITS)
125 #define C1_SHIFT (BITS_IN_JSAMPLE - HIST_C1_BITS)
126 #define C2_SHIFT (BITS_IN_JSAMPLE - HIST_C2_BITS)
127 
128 
129 typedef UINT16 histcell; /* histogram cell; prefer an unsigned type */
130 
131 typedef histcell *histptr; /* for pointers to histogram cells */
132 
133 typedef histcell hist1d[HIST_C2_ELEMS]; /* typedefs for the array */
134 typedef hist1d *hist2d; /* type for the 2nd-level pointers */
135 typedef hist2d *hist3d; /* type for top-level pointer */
136 
137 
138 /* Declarations for Floyd-Steinberg dithering.
139  *
140  * Errors are accumulated into the array fserrors[], at a resolution of
141  * 1/16th of a pixel count. The error at a given pixel is propagated
142  * to its not-yet-processed neighbors using the standard F-S fractions,
143  * ... (here) 7/16
144  * 3/16 5/16 1/16
145  * We work left-to-right on even rows, right-to-left on odd rows.
146  *
147  * We can get away with a single array (holding one row's worth of errors)
148  * by using it to store the current row's errors at pixel columns not yet
149  * processed, but the next row's errors at columns already processed. We
150  * need only a few extra variables to hold the errors immediately around the
151  * current column. (If we are lucky, those variables are in registers, but
152  * even if not, they're probably cheaper to access than array elements are.)
153  *
154  * The fserrors[] array has (#columns + 2) entries; the extra entry at
155  * each end saves us from special-casing the first and last pixels.
156  * Each entry is three values long, one value for each color component.
157  */
158 
159 #if BITS_IN_JSAMPLE == 8
160 typedef INT16 FSERROR; /* 16 bits should be enough */
161 typedef int LOCFSERROR; /* use 'int' for calculation temps */
162 #else
163 typedef JLONG FSERROR; /* may need more than 16 bits */
164 typedef JLONG LOCFSERROR; /* be sure calculation temps are big enough */
165 #endif
166 
167 typedef FSERROR *FSERRPTR; /* pointer to error array */
168 
169 
170 /* Private subobject */
171 
172 typedef struct {
173  struct jpeg_color_quantizer pub; /* public fields */
174 
175  /* Space for the eventually created colormap is stashed here */
176  JSAMPARRAY sv_colormap; /* colormap allocated at init time */
177  int desired; /* desired # of colors = size of colormap */
178 
179  /* Variables for accumulating image statistics */
180  hist3d histogram; /* pointer to the histogram */
181 
182  boolean needs_zeroed; /* TRUE if next pass must zero histogram */
183 
184  /* Variables for Floyd-Steinberg dithering */
185  FSERRPTR fserrors; /* accumulated errors */
186  boolean on_odd_row; /* flag to remember which row we are on */
187  int *error_limiter; /* table for clamping the applied error */
188 } my_cquantizer;
189 
191 
192 
193 /*
194  * Prescan some rows of pixels.
195  * In this module the prescan simply updates the histogram, which has been
196  * initialized to zeroes by start_pass.
197  * An output_buf parameter is required by the method signature, but no data
198  * is actually output (in fact the buffer controller is probably passing a
199  * NULL pointer).
200  */
201 
202 METHODDEF(void)
205 {
206  my_cquantize_ptr cquantize = (my_cquantize_ptr)cinfo->cquantize;
207  register JSAMPROW ptr;
208  register histptr histp;
209  register hist3d histogram = cquantize->histogram;
210  int row;
211  JDIMENSION col;
212  JDIMENSION width = cinfo->output_width;
213 
214  for (row = 0; row < num_rows; row++) {
215  ptr = input_buf[row];
216  for (col = width; col > 0; col--) {
217  /* get pixel value and index into the histogram */
218  histp = &histogram[ptr[0] >> C0_SHIFT]
219  [ptr[1] >> C1_SHIFT]
220  [ptr[2] >> C2_SHIFT];
221  /* increment, check for overflow and undo increment if so. */
222  if (++(*histp) <= 0)
223  (*histp)--;
224  ptr += 3;
225  }
226  }
227 }
228 
229 
230 /*
231  * Next we have the really interesting routines: selection of a colormap
232  * given the completed histogram.
233  * These routines work with a list of "boxes", each representing a rectangular
234  * subset of the input color space (to histogram precision).
235  */
236 
237 typedef struct {
238  /* The bounds of the box (inclusive); expressed as histogram indexes */
239  int c0min, c0max;
240  int c1min, c1max;
241  int c2min, c2max;
242  /* The volume (actually 2-norm) of the box */
244  /* The number of nonzero histogram cells within this box */
246 } box;
247 
248 typedef box *boxptr;
249 
250 
251 LOCAL(boxptr)
252 find_biggest_color_pop(boxptr boxlist, int numboxes)
253 /* Find the splittable box with the largest color population */
254 /* Returns NULL if no splittable boxes remain */
255 {
256  register boxptr boxp;
257  register int i;
258  register long maxc = 0;
259  boxptr which = NULL;
260 
261  for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) {
262  if (boxp->colorcount > maxc && boxp->volume > 0) {
263  which = boxp;
264  maxc = boxp->colorcount;
265  }
266  }
267  return which;
268 }
269 
270 
271 LOCAL(boxptr)
272 find_biggest_volume(boxptr boxlist, int numboxes)
273 /* Find the splittable box with the largest (scaled) volume */
274 /* Returns NULL if no splittable boxes remain */
275 {
276  register boxptr boxp;
277  register int i;
278  register JLONG maxv = 0;
279  boxptr which = NULL;
280 
281  for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) {
282  if (boxp->volume > maxv) {
283  which = boxp;
284  maxv = boxp->volume;
285  }
286  }
287  return which;
288 }
289 
290 
291 LOCAL(void)
293 /* Shrink the min/max bounds of a box to enclose only nonzero elements, */
294 /* and recompute its volume and population */
295 {
296  my_cquantize_ptr cquantize = (my_cquantize_ptr)cinfo->cquantize;
297  hist3d histogram = cquantize->histogram;
298  histptr histp;
299  int c0, c1, c2;
300  int c0min, c0max, c1min, c1max, c2min, c2max;
301  JLONG dist0, dist1, dist2;
302  long ccount;
303 
304  c0min = boxp->c0min; c0max = boxp->c0max;
305  c1min = boxp->c1min; c1max = boxp->c1max;
306  c2min = boxp->c2min; c2max = boxp->c2max;
307 
308  if (c0max > c0min)
309  for (c0 = c0min; c0 <= c0max; c0++)
310  for (c1 = c1min; c1 <= c1max; c1++) {
311  histp = &histogram[c0][c1][c2min];
312  for (c2 = c2min; c2 <= c2max; c2++)
313  if (*histp++ != 0) {
314  boxp->c0min = c0min = c0;
315  goto have_c0min;
316  }
317  }
318 have_c0min:
319  if (c0max > c0min)
320  for (c0 = c0max; c0 >= c0min; c0--)
321  for (c1 = c1min; c1 <= c1max; c1++) {
322  histp = &histogram[c0][c1][c2min];
323  for (c2 = c2min; c2 <= c2max; c2++)
324  if (*histp++ != 0) {
325  boxp->c0max = c0max = c0;
326  goto have_c0max;
327  }
328  }
329 have_c0max:
330  if (c1max > c1min)
331  for (c1 = c1min; c1 <= c1max; c1++)
332  for (c0 = c0min; c0 <= c0max; c0++) {
333  histp = &histogram[c0][c1][c2min];
334  for (c2 = c2min; c2 <= c2max; c2++)
335  if (*histp++ != 0) {
336  boxp->c1min = c1min = c1;
337  goto have_c1min;
338  }
339  }
340 have_c1min:
341  if (c1max > c1min)
342  for (c1 = c1max; c1 >= c1min; c1--)
343  for (c0 = c0min; c0 <= c0max; c0++) {
344  histp = &histogram[c0][c1][c2min];
345  for (c2 = c2min; c2 <= c2max; c2++)
346  if (*histp++ != 0) {
347  boxp->c1max = c1max = c1;
348  goto have_c1max;
349  }
350  }
351 have_c1max:
352  if (c2max > c2min)
353  for (c2 = c2min; c2 <= c2max; c2++)
354  for (c0 = c0min; c0 <= c0max; c0++) {
355  histp = &histogram[c0][c1min][c2];
356  for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS)
357  if (*histp != 0) {
358  boxp->c2min = c2min = c2;
359  goto have_c2min;
360  }
361  }
362 have_c2min:
363  if (c2max > c2min)
364  for (c2 = c2max; c2 >= c2min; c2--)
365  for (c0 = c0min; c0 <= c0max; c0++) {
366  histp = &histogram[c0][c1min][c2];
367  for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS)
368  if (*histp != 0) {
369  boxp->c2max = c2max = c2;
370  goto have_c2max;
371  }
372  }
373 have_c2max:
374 
375  /* Update box volume.
376  * We use 2-norm rather than real volume here; this biases the method
377  * against making long narrow boxes, and it has the side benefit that
378  * a box is splittable iff norm > 0.
379  * Since the differences are expressed in histogram-cell units,
380  * we have to shift back to JSAMPLE units to get consistent distances;
381  * after which, we scale according to the selected distance scale factors.
382  */
383  dist0 = ((c0max - c0min) << C0_SHIFT) * C0_SCALE;
384  dist1 = ((c1max - c1min) << C1_SHIFT) * C1_SCALE;
385  dist2 = ((c2max - c2min) << C2_SHIFT) * C2_SCALE;
386  boxp->volume = dist0 * dist0 + dist1 * dist1 + dist2 * dist2;
387 
388  /* Now scan remaining volume of box and compute population */
389  ccount = 0;
390  for (c0 = c0min; c0 <= c0max; c0++)
391  for (c1 = c1min; c1 <= c1max; c1++) {
392  histp = &histogram[c0][c1][c2min];
393  for (c2 = c2min; c2 <= c2max; c2++, histp++)
394  if (*histp != 0) {
395  ccount++;
396  }
397  }
398  boxp->colorcount = ccount;
399 }
400 
401 
402 LOCAL(int)
403 median_cut(j_decompress_ptr cinfo, boxptr boxlist, int numboxes,
404  int desired_colors)
405 /* Repeatedly select and split the largest box until we have enough boxes */
406 {
407  int n, lb;
408  int c0, c1, c2, cmax;
409  register boxptr b1, b2;
410 
411  while (numboxes < desired_colors) {
412  /* Select box to split.
413  * Current algorithm: by population for first half, then by volume.
414  */
415  if (numboxes * 2 <= desired_colors) {
416  b1 = find_biggest_color_pop(boxlist, numboxes);
417  } else {
418  b1 = find_biggest_volume(boxlist, numboxes);
419  }
420  if (b1 == NULL) /* no splittable boxes left! */
421  break;
422  b2 = &boxlist[numboxes]; /* where new box will go */
423  /* Copy the color bounds to the new box. */
424  b2->c0max = b1->c0max; b2->c1max = b1->c1max; b2->c2max = b1->c2max;
425  b2->c0min = b1->c0min; b2->c1min = b1->c1min; b2->c2min = b1->c2min;
426  /* Choose which axis to split the box on.
427  * Current algorithm: longest scaled axis.
428  * See notes in update_box about scaling distances.
429  */
430  c0 = ((b1->c0max - b1->c0min) << C0_SHIFT) * C0_SCALE;
431  c1 = ((b1->c1max - b1->c1min) << C1_SHIFT) * C1_SCALE;
432  c2 = ((b1->c2max - b1->c2min) << C2_SHIFT) * C2_SCALE;
433  /* We want to break any ties in favor of green, then red, blue last.
434  * This code does the right thing for R,G,B or B,G,R color orders only.
435  */
436  if (rgb_red[cinfo->out_color_space] == 0) {
437  cmax = c1; n = 1;
438  if (c0 > cmax) { cmax = c0; n = 0; }
439  if (c2 > cmax) { n = 2; }
440  } else {
441  cmax = c1; n = 1;
442  if (c2 > cmax) { cmax = c2; n = 2; }
443  if (c0 > cmax) { n = 0; }
444  }
445  /* Choose split point along selected axis, and update box bounds.
446  * Current algorithm: split at halfway point.
447  * (Since the box has been shrunk to minimum volume,
448  * any split will produce two nonempty subboxes.)
449  * Note that lb value is max for lower box, so must be < old max.
450  */
451  switch (n) {
452  case 0:
453  lb = (b1->c0max + b1->c0min) / 2;
454  b1->c0max = lb;
455  b2->c0min = lb + 1;
456  break;
457  case 1:
458  lb = (b1->c1max + b1->c1min) / 2;
459  b1->c1max = lb;
460  b2->c1min = lb + 1;
461  break;
462  case 2:
463  lb = (b1->c2max + b1->c2min) / 2;
464  b1->c2max = lb;
465  b2->c2min = lb + 1;
466  break;
467  }
468  /* Update stats for boxes */
469  update_box(cinfo, b1);
470  update_box(cinfo, b2);
471  numboxes++;
472  }
473  return numboxes;
474 }
475 
476 
477 LOCAL(void)
478 compute_color(j_decompress_ptr cinfo, boxptr boxp, int icolor)
479 /* Compute representative color for a box, put it in colormap[icolor] */
480 {
481  /* Current algorithm: mean weighted by pixels (not colors) */
482  /* Note it is important to get the rounding correct! */
483  my_cquantize_ptr cquantize = (my_cquantize_ptr)cinfo->cquantize;
484  hist3d histogram = cquantize->histogram;
485  histptr histp;
486  int c0, c1, c2;
487  int c0min, c0max, c1min, c1max, c2min, c2max;
488  long count;
489  long total = 0;
490  long c0total = 0;
491  long c1total = 0;
492  long c2total = 0;
493 
494  c0min = boxp->c0min; c0max = boxp->c0max;
495  c1min = boxp->c1min; c1max = boxp->c1max;
496  c2min = boxp->c2min; c2max = boxp->c2max;
497 
498  for (c0 = c0min; c0 <= c0max; c0++)
499  for (c1 = c1min; c1 <= c1max; c1++) {
500  histp = &histogram[c0][c1][c2min];
501  for (c2 = c2min; c2 <= c2max; c2++) {
502  if ((count = *histp++) != 0) {
503  total += count;
504  c0total += ((c0 << C0_SHIFT) + ((1 << C0_SHIFT) >> 1)) * count;
505  c1total += ((c1 << C1_SHIFT) + ((1 << C1_SHIFT) >> 1)) * count;
506  c2total += ((c2 << C2_SHIFT) + ((1 << C2_SHIFT) >> 1)) * count;
507  }
508  }
509  }
510 
511  cinfo->colormap[0][icolor] = (JSAMPLE)((c0total + (total >> 1)) / total);
512  cinfo->colormap[1][icolor] = (JSAMPLE)((c1total + (total >> 1)) / total);
513  cinfo->colormap[2][icolor] = (JSAMPLE)((c2total + (total >> 1)) / total);
514 }
515 
516 
517 LOCAL(void)
518 select_colors(j_decompress_ptr cinfo, int desired_colors)
519 /* Master routine for color selection */
520 {
521  boxptr boxlist;
522  int numboxes;
523  int i;
524 
525  /* Allocate workspace for box list */
526  boxlist = (boxptr)(*cinfo->mem->alloc_small)
527  ((j_common_ptr)cinfo, JPOOL_IMAGE, desired_colors * sizeof(box));
528  /* Initialize one box containing whole space */
529  numboxes = 1;
530  boxlist[0].c0min = 0;
531  boxlist[0].c0max = MAXJSAMPLE >> C0_SHIFT;
532  boxlist[0].c1min = 0;
533  boxlist[0].c1max = MAXJSAMPLE >> C1_SHIFT;
534  boxlist[0].c2min = 0;
535  boxlist[0].c2max = MAXJSAMPLE >> C2_SHIFT;
536  /* Shrink it to actually-used volume and set its statistics */
537  update_box(cinfo, &boxlist[0]);
538  /* Perform median-cut to produce final box list */
539  numboxes = median_cut(cinfo, boxlist, numboxes, desired_colors);
540  /* Compute the representative color for each box, fill colormap */
541  for (i = 0; i < numboxes; i++)
542  compute_color(cinfo, &boxlist[i], i);
543  cinfo->actual_number_of_colors = numboxes;
544  TRACEMS1(cinfo, 1, JTRC_QUANT_SELECTED, numboxes);
545 }
546 
547 
548 /*
549  * These routines are concerned with the time-critical task of mapping input
550  * colors to the nearest color in the selected colormap.
551  *
552  * We re-use the histogram space as an "inverse color map", essentially a
553  * cache for the results of nearest-color searches. All colors within a
554  * histogram cell will be mapped to the same colormap entry, namely the one
555  * closest to the cell's center. This may not be quite the closest entry to
556  * the actual input color, but it's almost as good. A zero in the cache
557  * indicates we haven't found the nearest color for that cell yet; the array
558  * is cleared to zeroes before starting the mapping pass. When we find the
559  * nearest color for a cell, its colormap index plus one is recorded in the
560  * cache for future use. The pass2 scanning routines call fill_inverse_cmap
561  * when they need to use an unfilled entry in the cache.
562  *
563  * Our method of efficiently finding nearest colors is based on the "locally
564  * sorted search" idea described by Heckbert and on the incremental distance
565  * calculation described by Spencer W. Thomas in chapter III.1 of Graphics
566  * Gems II (James Arvo, ed. Academic Press, 1991). Thomas points out that
567  * the distances from a given colormap entry to each cell of the histogram can
568  * be computed quickly using an incremental method: the differences between
569  * distances to adjacent cells themselves differ by a constant. This allows a
570  * fairly fast implementation of the "brute force" approach of computing the
571  * distance from every colormap entry to every histogram cell. Unfortunately,
572  * it needs a work array to hold the best-distance-so-far for each histogram
573  * cell (because the inner loop has to be over cells, not colormap entries).
574  * The work array elements have to be JLONGs, so the work array would need
575  * 256Kb at our recommended precision. This is not feasible in DOS machines.
576  *
577  * To get around these problems, we apply Thomas' method to compute the
578  * nearest colors for only the cells within a small subbox of the histogram.
579  * The work array need be only as big as the subbox, so the memory usage
580  * problem is solved. Furthermore, we need not fill subboxes that are never
581  * referenced in pass2; many images use only part of the color gamut, so a
582  * fair amount of work is saved. An additional advantage of this
583  * approach is that we can apply Heckbert's locality criterion to quickly
584  * eliminate colormap entries that are far away from the subbox; typically
585  * three-fourths of the colormap entries are rejected by Heckbert's criterion,
586  * and we need not compute their distances to individual cells in the subbox.
587  * The speed of this approach is heavily influenced by the subbox size: too
588  * small means too much overhead, too big loses because Heckbert's criterion
589  * can't eliminate as many colormap entries. Empirically the best subbox
590  * size seems to be about 1/512th of the histogram (1/8th in each direction).
591  *
592  * Thomas' article also describes a refined method which is asymptotically
593  * faster than the brute-force method, but it is also far more complex and
594  * cannot efficiently be applied to small subboxes. It is therefore not
595  * useful for programs intended to be portable to DOS machines. On machines
596  * with plenty of memory, filling the whole histogram in one shot with Thomas'
597  * refined method might be faster than the present code --- but then again,
598  * it might not be any faster, and it's certainly more complicated.
599  */
600 
601 
602 /* log2(histogram cells in update box) for each axis; this can be adjusted */
603 #define BOX_C0_LOG (HIST_C0_BITS - 3)
604 #define BOX_C1_LOG (HIST_C1_BITS - 3)
605 #define BOX_C2_LOG (HIST_C2_BITS - 3)
606 
607 #define BOX_C0_ELEMS (1 << BOX_C0_LOG) /* # of hist cells in update box */
608 #define BOX_C1_ELEMS (1 << BOX_C1_LOG)
609 #define BOX_C2_ELEMS (1 << BOX_C2_LOG)
610 
611 #define BOX_C0_SHIFT (C0_SHIFT + BOX_C0_LOG)
612 #define BOX_C1_SHIFT (C1_SHIFT + BOX_C1_LOG)
613 #define BOX_C2_SHIFT (C2_SHIFT + BOX_C2_LOG)
614 
615 
616 /*
617  * The next three routines implement inverse colormap filling. They could
618  * all be folded into one big routine, but splitting them up this way saves
619  * some stack space (the mindist[] and bestdist[] arrays need not coexist)
620  * and may allow some compilers to produce better code by registerizing more
621  * inner-loop variables.
622  */
623 
624 LOCAL(int)
625 find_nearby_colors(j_decompress_ptr cinfo, int minc0, int minc1, int minc2,
626  JSAMPLE colorlist[])
627 /* Locate the colormap entries close enough to an update box to be candidates
628  * for the nearest entry to some cell(s) in the update box. The update box
629  * is specified by the center coordinates of its first cell. The number of
630  * candidate colormap entries is returned, and their colormap indexes are
631  * placed in colorlist[].
632  * This routine uses Heckbert's "locally sorted search" criterion to select
633  * the colors that need further consideration.
634  */
635 {
636  int numcolors = cinfo->actual_number_of_colors;
637  int maxc0, maxc1, maxc2;
638  int centerc0, centerc1, centerc2;
639  int i, x, ncolors;
640  JLONG minmaxdist, min_dist, max_dist, tdist;
641  JLONG mindist[MAXNUMCOLORS]; /* min distance to colormap entry i */
642 
643  /* Compute true coordinates of update box's upper corner and center.
644  * Actually we compute the coordinates of the center of the upper-corner
645  * histogram cell, which are the upper bounds of the volume we care about.
646  * Note that since ">>" rounds down, the "center" values may be closer to
647  * min than to max; hence comparisons to them must be "<=", not "<".
648  */
649  maxc0 = minc0 + ((1 << BOX_C0_SHIFT) - (1 << C0_SHIFT));
650  centerc0 = (minc0 + maxc0) >> 1;
651  maxc1 = minc1 + ((1 << BOX_C1_SHIFT) - (1 << C1_SHIFT));
652  centerc1 = (minc1 + maxc1) >> 1;
653  maxc2 = minc2 + ((1 << BOX_C2_SHIFT) - (1 << C2_SHIFT));
654  centerc2 = (minc2 + maxc2) >> 1;
655 
656  /* For each color in colormap, find:
657  * 1. its minimum squared-distance to any point in the update box
658  * (zero if color is within update box);
659  * 2. its maximum squared-distance to any point in the update box.
660  * Both of these can be found by considering only the corners of the box.
661  * We save the minimum distance for each color in mindist[];
662  * only the smallest maximum distance is of interest.
663  */
664  minmaxdist = 0x7FFFFFFFL;
665 
666  for (i = 0; i < numcolors; i++) {
667  /* We compute the squared-c0-distance term, then add in the other two. */
668  x = cinfo->colormap[0][i];
669  if (x < minc0) {
670  tdist = (x - minc0) * C0_SCALE;
671  min_dist = tdist * tdist;
672  tdist = (x - maxc0) * C0_SCALE;
673  max_dist = tdist * tdist;
674  } else if (x > maxc0) {
675  tdist = (x - maxc0) * C0_SCALE;
676  min_dist = tdist * tdist;
677  tdist = (x - minc0) * C0_SCALE;
678  max_dist = tdist * tdist;
679  } else {
680  /* within cell range so no contribution to min_dist */
681  min_dist = 0;
682  if (x <= centerc0) {
683  tdist = (x - maxc0) * C0_SCALE;
684  max_dist = tdist * tdist;
685  } else {
686  tdist = (x - minc0) * C0_SCALE;
687  max_dist = tdist * tdist;
688  }
689  }
690 
691  x = cinfo->colormap[1][i];
692  if (x < minc1) {
693  tdist = (x - minc1) * C1_SCALE;
694  min_dist += tdist * tdist;
695  tdist = (x - maxc1) * C1_SCALE;
696  max_dist += tdist * tdist;
697  } else if (x > maxc1) {
698  tdist = (x - maxc1) * C1_SCALE;
699  min_dist += tdist * tdist;
700  tdist = (x - minc1) * C1_SCALE;
701  max_dist += tdist * tdist;
702  } else {
703  /* within cell range so no contribution to min_dist */
704  if (x <= centerc1) {
705  tdist = (x - maxc1) * C1_SCALE;
706  max_dist += tdist * tdist;
707  } else {
708  tdist = (x - minc1) * C1_SCALE;
709  max_dist += tdist * tdist;
710  }
711  }
712 
713  x = cinfo->colormap[2][i];
714  if (x < minc2) {
715  tdist = (x - minc2) * C2_SCALE;
716  min_dist += tdist * tdist;
717  tdist = (x - maxc2) * C2_SCALE;
718  max_dist += tdist * tdist;
719  } else if (x > maxc2) {
720  tdist = (x - maxc2) * C2_SCALE;
721  min_dist += tdist * tdist;
722  tdist = (x - minc2) * C2_SCALE;
723  max_dist += tdist * tdist;
724  } else {
725  /* within cell range so no contribution to min_dist */
726  if (x <= centerc2) {
727  tdist = (x - maxc2) * C2_SCALE;
728  max_dist += tdist * tdist;
729  } else {
730  tdist = (x - minc2) * C2_SCALE;
731  max_dist += tdist * tdist;
732  }
733  }
734 
735  mindist[i] = min_dist; /* save away the results */
736  if (max_dist < minmaxdist)
737  minmaxdist = max_dist;
738  }
739 
740  /* Now we know that no cell in the update box is more than minmaxdist
741  * away from some colormap entry. Therefore, only colors that are
742  * within minmaxdist of some part of the box need be considered.
743  */
744  ncolors = 0;
745  for (i = 0; i < numcolors; i++) {
746  if (mindist[i] <= minmaxdist)
747  colorlist[ncolors++] = (JSAMPLE)i;
748  }
749  return ncolors;
750 }
751 
752 
753 LOCAL(void)
754 find_best_colors(j_decompress_ptr cinfo, int minc0, int minc1, int minc2,
755  int numcolors, JSAMPLE colorlist[], JSAMPLE bestcolor[])
756 /* Find the closest colormap entry for each cell in the update box,
757  * given the list of candidate colors prepared by find_nearby_colors.
758  * Return the indexes of the closest entries in the bestcolor[] array.
759  * This routine uses Thomas' incremental distance calculation method to
760  * find the distance from a colormap entry to successive cells in the box.
761  */
762 {
763  int ic0, ic1, ic2;
764  int i, icolor;
765  register JLONG *bptr; /* pointer into bestdist[] array */
766  JSAMPLE *cptr; /* pointer into bestcolor[] array */
767  JLONG dist0, dist1; /* initial distance values */
768  register JLONG dist2; /* current distance in inner loop */
769  JLONG xx0, xx1; /* distance increments */
770  register JLONG xx2;
771  JLONG inc0, inc1, inc2; /* initial values for increments */
772  /* This array holds the distance to the nearest-so-far color for each cell */
774 
775  /* Initialize best-distance for each cell of the update box */
776  bptr = bestdist;
777  for (i = BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS - 1; i >= 0; i--)
778  *bptr++ = 0x7FFFFFFFL;
779 
780  /* For each color selected by find_nearby_colors,
781  * compute its distance to the center of each cell in the box.
782  * If that's less than best-so-far, update best distance and color number.
783  */
784 
785  /* Nominal steps between cell centers ("x" in Thomas article) */
786 #define STEP_C0 ((1 << C0_SHIFT) * C0_SCALE)
787 #define STEP_C1 ((1 << C1_SHIFT) * C1_SCALE)
788 #define STEP_C2 ((1 << C2_SHIFT) * C2_SCALE)
789 
790  for (i = 0; i < numcolors; i++) {
791  icolor = colorlist[i];
792  /* Compute (square of) distance from minc0/c1/c2 to this color */
793  inc0 = (minc0 - cinfo->colormap[0][icolor]) * C0_SCALE;
794  dist0 = inc0 * inc0;
795  inc1 = (minc1 - cinfo->colormap[1][icolor]) * C1_SCALE;
796  dist0 += inc1 * inc1;
797  inc2 = (minc2 - cinfo->colormap[2][icolor]) * C2_SCALE;
798  dist0 += inc2 * inc2;
799  /* Form the initial difference increments */
800  inc0 = inc0 * (2 * STEP_C0) + STEP_C0 * STEP_C0;
801  inc1 = inc1 * (2 * STEP_C1) + STEP_C1 * STEP_C1;
802  inc2 = inc2 * (2 * STEP_C2) + STEP_C2 * STEP_C2;
803  /* Now loop over all cells in box, updating distance per Thomas method */
804  bptr = bestdist;
805  cptr = bestcolor;
806  xx0 = inc0;
807  for (ic0 = BOX_C0_ELEMS - 1; ic0 >= 0; ic0--) {
808  dist1 = dist0;
809  xx1 = inc1;
810  for (ic1 = BOX_C1_ELEMS - 1; ic1 >= 0; ic1--) {
811  dist2 = dist1;
812  xx2 = inc2;
813  for (ic2 = BOX_C2_ELEMS - 1; ic2 >= 0; ic2--) {
814  if (dist2 < *bptr) {
815  *bptr = dist2;
816  *cptr = (JSAMPLE)icolor;
817  }
818  dist2 += xx2;
819  xx2 += 2 * STEP_C2 * STEP_C2;
820  bptr++;
821  cptr++;
822  }
823  dist1 += xx1;
824  xx1 += 2 * STEP_C1 * STEP_C1;
825  }
826  dist0 += xx0;
827  xx0 += 2 * STEP_C0 * STEP_C0;
828  }
829  }
830 }
831 
832 
833 LOCAL(void)
834 fill_inverse_cmap(j_decompress_ptr cinfo, int c0, int c1, int c2)
835 /* Fill the inverse-colormap entries in the update box that contains */
836 /* histogram cell c0/c1/c2. (Only that one cell MUST be filled, but */
837 /* we can fill as many others as we wish.) */
838 {
839  my_cquantize_ptr cquantize = (my_cquantize_ptr)cinfo->cquantize;
840  hist3d histogram = cquantize->histogram;
841  int minc0, minc1, minc2; /* lower left corner of update box */
842  int ic0, ic1, ic2;
843  register JSAMPLE *cptr; /* pointer into bestcolor[] array */
844  register histptr cachep; /* pointer into main cache array */
845  /* This array lists the candidate colormap indexes. */
846  JSAMPLE colorlist[MAXNUMCOLORS];
847  int numcolors; /* number of candidate colors */
848  /* This array holds the actually closest colormap index for each cell. */
849  JSAMPLE bestcolor[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS];
850 
851  /* Convert cell coordinates to update box ID */
852  c0 >>= BOX_C0_LOG;
853  c1 >>= BOX_C1_LOG;
854  c2 >>= BOX_C2_LOG;
855 
856  /* Compute true coordinates of update box's origin corner.
857  * Actually we compute the coordinates of the center of the corner
858  * histogram cell, which are the lower bounds of the volume we care about.
859  */
860  minc0 = (c0 << BOX_C0_SHIFT) + ((1 << C0_SHIFT) >> 1);
861  minc1 = (c1 << BOX_C1_SHIFT) + ((1 << C1_SHIFT) >> 1);
862  minc2 = (c2 << BOX_C2_SHIFT) + ((1 << C2_SHIFT) >> 1);
863 
864  /* Determine which colormap entries are close enough to be candidates
865  * for the nearest entry to some cell in the update box.
866  */
867  numcolors = find_nearby_colors(cinfo, minc0, minc1, minc2, colorlist);
868 
869  /* Determine the actually nearest colors. */
870  find_best_colors(cinfo, minc0, minc1, minc2, numcolors, colorlist,
871  bestcolor);
872 
873  /* Save the best color numbers (plus 1) in the main cache array */
874  c0 <<= BOX_C0_LOG; /* convert ID back to base cell indexes */
875  c1 <<= BOX_C1_LOG;
876  c2 <<= BOX_C2_LOG;
877  cptr = bestcolor;
878  for (ic0 = 0; ic0 < BOX_C0_ELEMS; ic0++) {
879  for (ic1 = 0; ic1 < BOX_C1_ELEMS; ic1++) {
880  cachep = &histogram[c0 + ic0][c1 + ic1][c2];
881  for (ic2 = 0; ic2 < BOX_C2_ELEMS; ic2++) {
882  *cachep++ = (histcell)((*cptr++) + 1);
883  }
884  }
885  }
886 }
887 
888 
889 /*
890  * Map some rows of pixels to the output colormapped representation.
891  */
892 
893 METHODDEF(void)
896 /* This version performs no dithering */
897 {
898  my_cquantize_ptr cquantize = (my_cquantize_ptr)cinfo->cquantize;
899  hist3d histogram = cquantize->histogram;
900  register JSAMPROW inptr, outptr;
901  register histptr cachep;
902  register int c0, c1, c2;
903  int row;
904  JDIMENSION col;
905  JDIMENSION width = cinfo->output_width;
906 
907  for (row = 0; row < num_rows; row++) {
908  inptr = input_buf[row];
909  outptr = output_buf[row];
910  for (col = width; col > 0; col--) {
911  /* get pixel value and index into the cache */
912  c0 = (*inptr++) >> C0_SHIFT;
913  c1 = (*inptr++) >> C1_SHIFT;
914  c2 = (*inptr++) >> C2_SHIFT;
915  cachep = &histogram[c0][c1][c2];
916  /* If we have not seen this color before, find nearest colormap entry */
917  /* and update the cache */
918  if (*cachep == 0)
919  fill_inverse_cmap(cinfo, c0, c1, c2);
920  /* Now emit the colormap index for this cell */
921  *outptr++ = (JSAMPLE)(*cachep - 1);
922  }
923  }
924 }
925 
926 
927 METHODDEF(void)
930 /* This version performs Floyd-Steinberg dithering */
931 {
932  my_cquantize_ptr cquantize = (my_cquantize_ptr)cinfo->cquantize;
933  hist3d histogram = cquantize->histogram;
934  register LOCFSERROR cur0, cur1, cur2; /* current error or pixel value */
935  LOCFSERROR belowerr0, belowerr1, belowerr2; /* error for pixel below cur */
936  LOCFSERROR bpreverr0, bpreverr1, bpreverr2; /* error for below/prev col */
937  register FSERRPTR errorptr; /* => fserrors[] at column before current */
938  JSAMPROW inptr; /* => current input pixel */
939  JSAMPROW outptr; /* => current output pixel */
940  histptr cachep;
941  int dir; /* +1 or -1 depending on direction */
942  int dir3; /* 3*dir, for advancing inptr & errorptr */
943  int row;
944  JDIMENSION col;
945  JDIMENSION width = cinfo->output_width;
946  JSAMPLE *range_limit = cinfo->sample_range_limit;
947  int *error_limit = cquantize->error_limiter;
948  JSAMPROW colormap0 = cinfo->colormap[0];
949  JSAMPROW colormap1 = cinfo->colormap[1];
950  JSAMPROW colormap2 = cinfo->colormap[2];
952 
953  for (row = 0; row < num_rows; row++) {
954  inptr = input_buf[row];
955  outptr = output_buf[row];
956  if (cquantize->on_odd_row) {
957  /* work right to left in this row */
958  inptr += (width - 1) * 3; /* so point to rightmost pixel */
959  outptr += width - 1;
960  dir = -1;
961  dir3 = -3;
962  errorptr = cquantize->fserrors + (width + 1) * 3; /* => entry after last column */
963  cquantize->on_odd_row = FALSE; /* flip for next time */
964  } else {
965  /* work left to right in this row */
966  dir = 1;
967  dir3 = 3;
968  errorptr = cquantize->fserrors; /* => entry before first real column */
969  cquantize->on_odd_row = TRUE; /* flip for next time */
970  }
971  /* Preset error values: no error propagated to first pixel from left */
972  cur0 = cur1 = cur2 = 0;
973  /* and no error propagated to row below yet */
974  belowerr0 = belowerr1 = belowerr2 = 0;
975  bpreverr0 = bpreverr1 = bpreverr2 = 0;
976 
977  for (col = width; col > 0; col--) {
978  /* curN holds the error propagated from the previous pixel on the
979  * current line. Add the error propagated from the previous line
980  * to form the complete error correction term for this pixel, and
981  * round the error term (which is expressed * 16) to an integer.
982  * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct
983  * for either sign of the error value.
984  * Note: errorptr points to *previous* column's array entry.
985  */
986  cur0 = RIGHT_SHIFT(cur0 + errorptr[dir3 + 0] + 8, 4);
987  cur1 = RIGHT_SHIFT(cur1 + errorptr[dir3 + 1] + 8, 4);
988  cur2 = RIGHT_SHIFT(cur2 + errorptr[dir3 + 2] + 8, 4);
989  /* Limit the error using transfer function set by init_error_limit.
990  * See comments with init_error_limit for rationale.
991  */
992  cur0 = error_limit[cur0];
993  cur1 = error_limit[cur1];
994  cur2 = error_limit[cur2];
995  /* Form pixel value + error, and range-limit to 0..MAXJSAMPLE.
996  * The maximum error is +- MAXJSAMPLE (or less with error limiting);
997  * this sets the required size of the range_limit array.
998  */
999  cur0 += inptr[0];
1000  cur1 += inptr[1];
1001  cur2 += inptr[2];
1002  cur0 = range_limit[cur0];
1003  cur1 = range_limit[cur1];
1004  cur2 = range_limit[cur2];
1005  /* Index into the cache with adjusted pixel value */
1006  cachep =
1007  &histogram[cur0 >> C0_SHIFT][cur1 >> C1_SHIFT][cur2 >> C2_SHIFT];
1008  /* If we have not seen this color before, find nearest colormap */
1009  /* entry and update the cache */
1010  if (*cachep == 0)
1011  fill_inverse_cmap(cinfo, cur0 >> C0_SHIFT, cur1 >> C1_SHIFT,
1012  cur2 >> C2_SHIFT);
1013  /* Now emit the colormap index for this cell */
1014  {
1015  register int pixcode = *cachep - 1;
1016  *outptr = (JSAMPLE)pixcode;
1017  /* Compute representation error for this pixel */
1018  cur0 -= colormap0[pixcode];
1019  cur1 -= colormap1[pixcode];
1020  cur2 -= colormap2[pixcode];
1021  }
1022  /* Compute error fractions to be propagated to adjacent pixels.
1023  * Add these into the running sums, and simultaneously shift the
1024  * next-line error sums left by 1 column.
1025  */
1026  {
1027  register LOCFSERROR bnexterr;
1028 
1029  bnexterr = cur0; /* Process component 0 */
1030  errorptr[0] = (FSERROR)(bpreverr0 + cur0 * 3);
1031  bpreverr0 = belowerr0 + cur0 * 5;
1032  belowerr0 = bnexterr;
1033  cur0 *= 7;
1034  bnexterr = cur1; /* Process component 1 */
1035  errorptr[1] = (FSERROR)(bpreverr1 + cur1 * 3);
1036  bpreverr1 = belowerr1 + cur1 * 5;
1037  belowerr1 = bnexterr;
1038  cur1 *= 7;
1039  bnexterr = cur2; /* Process component 2 */
1040  errorptr[2] = (FSERROR)(bpreverr2 + cur2 * 3);
1041  bpreverr2 = belowerr2 + cur2 * 5;
1042  belowerr2 = bnexterr;
1043  cur2 *= 7;
1044  }
1045  /* At this point curN contains the 7/16 error value to be propagated
1046  * to the next pixel on the current line, and all the errors for the
1047  * next line have been shifted over. We are therefore ready to move on.
1048  */
1049  inptr += dir3; /* Advance pixel pointers to next column */
1050  outptr += dir;
1051  errorptr += dir3; /* advance errorptr to current column */
1052  }
1053  /* Post-loop cleanup: we must unload the final error values into the
1054  * final fserrors[] entry. Note we need not unload belowerrN because
1055  * it is for the dummy column before or after the actual array.
1056  */
1057  errorptr[0] = (FSERROR)bpreverr0; /* unload prev errs into array */
1058  errorptr[1] = (FSERROR)bpreverr1;
1059  errorptr[2] = (FSERROR)bpreverr2;
1060  }
1061 }
1062 
1063 
1064 /*
1065  * Initialize the error-limiting transfer function (lookup table).
1066  * The raw F-S error computation can potentially compute error values of up to
1067  * +- MAXJSAMPLE. But we want the maximum correction applied to a pixel to be
1068  * much less, otherwise obviously wrong pixels will be created. (Typical
1069  * effects include weird fringes at color-area boundaries, isolated bright
1070  * pixels in a dark area, etc.) The standard advice for avoiding this problem
1071  * is to ensure that the "corners" of the color cube are allocated as output
1072  * colors; then repeated errors in the same direction cannot cause cascading
1073  * error buildup. However, that only prevents the error from getting
1074  * completely out of hand; Aaron Giles reports that error limiting improves
1075  * the results even with corner colors allocated.
1076  * A simple clamping of the error values to about +- MAXJSAMPLE/8 works pretty
1077  * well, but the smoother transfer function used below is even better. Thanks
1078  * to Aaron Giles for this idea.
1079  */
1080 
1081 LOCAL(void)
1083 /* Allocate and fill in the error_limiter table */
1084 {
1085  my_cquantize_ptr cquantize = (my_cquantize_ptr)cinfo->cquantize;
1086  int *table;
1087  int in, out;
1088 
1089  table = (int *)(*cinfo->mem->alloc_small)
1090  ((j_common_ptr)cinfo, JPOOL_IMAGE, (MAXJSAMPLE * 2 + 1) * sizeof(int));
1091  table += MAXJSAMPLE; /* so can index -MAXJSAMPLE .. +MAXJSAMPLE */
1092  cquantize->error_limiter = table;
1093 
1094 #define STEPSIZE ((MAXJSAMPLE + 1) / 16)
1095  /* Map errors 1:1 up to +- MAXJSAMPLE/16 */
1096  out = 0;
1097  for (in = 0; in < STEPSIZE; in++, out++) {
1098  table[in] = out; table[-in] = -out;
1099  }
1100  /* Map errors 1:2 up to +- 3*MAXJSAMPLE/16 */
1101  for (; in < STEPSIZE * 3; in++, out += (in & 1) ? 0 : 1) {
1102  table[in] = out; table[-in] = -out;
1103  }
1104  /* Clamp the rest to final out value (which is (MAXJSAMPLE+1)/8) */
1105  for (; in <= MAXJSAMPLE; in++) {
1106  table[in] = out; table[-in] = -out;
1107  }
1108 #undef STEPSIZE
1109 }
1110 
1111 
1112 /*
1113  * Finish up at the end of each pass.
1114  */
1115 
1116 METHODDEF(void)
1118 {
1119  my_cquantize_ptr cquantize = (my_cquantize_ptr)cinfo->cquantize;
1120 
1121  /* Select the representative colors and fill in cinfo->colormap */
1122  cinfo->colormap = cquantize->sv_colormap;
1123  select_colors(cinfo, cquantize->desired);
1124  /* Force next pass to zero the color index table */
1125  cquantize->needs_zeroed = TRUE;
1126 }
1127 
1128 
1129 METHODDEF(void)
1131 {
1132  /* no work */
1133 }
1134 
1135 
1136 /*
1137  * Initialize for each processing pass.
1138  */
1139 
1140 METHODDEF(void)
1141 start_pass_2_quant(j_decompress_ptr cinfo, boolean is_pre_scan)
1142 {
1143  my_cquantize_ptr cquantize = (my_cquantize_ptr)cinfo->cquantize;
1144  hist3d histogram = cquantize->histogram;
1145  int i;
1146 
1147  /* Only F-S dithering or no dithering is supported. */
1148  /* If user asks for ordered dither, give them F-S. */
1149  if (cinfo->dither_mode != JDITHER_NONE)
1150  cinfo->dither_mode = JDITHER_FS;
1151 
1152  if (is_pre_scan) {
1153  /* Set up method pointers */
1154  cquantize->pub.color_quantize = prescan_quantize;
1155  cquantize->pub.finish_pass = finish_pass1;
1156  cquantize->needs_zeroed = TRUE; /* Always zero histogram */
1157  } else {
1158  /* Set up method pointers */
1159  if (cinfo->dither_mode == JDITHER_FS)
1160  cquantize->pub.color_quantize = pass2_fs_dither;
1161  else
1162  cquantize->pub.color_quantize = pass2_no_dither;
1163  cquantize->pub.finish_pass = finish_pass2;
1164 
1165  /* Make sure color count is acceptable */
1166  i = cinfo->actual_number_of_colors;
1167  if (i < 1)
1168  ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 1);
1169  if (i > MAXNUMCOLORS)
1170  ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS);
1171 
1172  if (cinfo->dither_mode == JDITHER_FS) {
1173  size_t arraysize =
1174  (size_t)((cinfo->output_width + 2) * (3 * sizeof(FSERROR)));
1175  /* Allocate Floyd-Steinberg workspace if we didn't already. */
1176  if (cquantize->fserrors == NULL)
1177  cquantize->fserrors = (FSERRPTR)(*cinfo->mem->alloc_large)
1178  ((j_common_ptr)cinfo, JPOOL_IMAGE, arraysize);
1179  /* Initialize the propagated errors to zero. */
1180  jzero_far((void *)cquantize->fserrors, arraysize);
1181  /* Make the error-limit table if we didn't already. */
1182  if (cquantize->error_limiter == NULL)
1183  init_error_limit(cinfo);
1184  cquantize->on_odd_row = FALSE;
1185  }
1186 
1187  }
1188  /* Zero the histogram or inverse color map, if necessary */
1189  if (cquantize->needs_zeroed) {
1190  for (i = 0; i < HIST_C0_ELEMS; i++) {
1191  jzero_far((void *)histogram[i],
1192  HIST_C1_ELEMS * HIST_C2_ELEMS * sizeof(histcell));
1193  }
1194  cquantize->needs_zeroed = FALSE;
1195  }
1196 }
1197 
1198 
1199 /*
1200  * Switch to a new external colormap between output passes.
1201  */
1202 
1203 METHODDEF(void)
1205 {
1206  my_cquantize_ptr cquantize = (my_cquantize_ptr)cinfo->cquantize;
1207 
1208  /* Reset the inverse color map */
1209  cquantize->needs_zeroed = TRUE;
1210 }
1211 
1212 
1213 /*
1214  * Module initialization routine for 2-pass color quantization.
1215  */
1216 
1217 GLOBAL(void)
1219 {
1220  my_cquantize_ptr cquantize;
1221  int i;
1222 
1223  cquantize = (my_cquantize_ptr)
1224  (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
1225  sizeof(my_cquantizer));
1226  cinfo->cquantize = (struct jpeg_color_quantizer *)cquantize;
1227  cquantize->pub.start_pass = start_pass_2_quant;
1229  cquantize->fserrors = NULL; /* flag optional arrays not allocated */
1230  cquantize->error_limiter = NULL;
1231 
1232  /* Make sure jdmaster didn't give me a case I can't handle */
1233  if (cinfo->out_color_components != 3)
1234  ERREXIT(cinfo, JERR_NOTIMPL);
1235 
1236  /* Allocate the histogram/inverse colormap storage */
1237  cquantize->histogram = (hist3d)(*cinfo->mem->alloc_small)
1238  ((j_common_ptr)cinfo, JPOOL_IMAGE, HIST_C0_ELEMS * sizeof(hist2d));
1239  for (i = 0; i < HIST_C0_ELEMS; i++) {
1240  cquantize->histogram[i] = (hist2d)(*cinfo->mem->alloc_large)
1241  ((j_common_ptr)cinfo, JPOOL_IMAGE,
1242  HIST_C1_ELEMS * HIST_C2_ELEMS * sizeof(histcell));
1243  }
1244  cquantize->needs_zeroed = TRUE; /* histogram is garbage now */
1245 
1246  /* Allocate storage for the completed colormap, if required.
1247  * We do this now since it may affect the memory manager's space
1248  * calculations.
1249  */
1250  if (cinfo->enable_2pass_quant) {
1251  /* Make sure color count is acceptable */
1252  int desired = cinfo->desired_number_of_colors;
1253  /* Lower bound on # of colors ... somewhat arbitrary as long as > 0 */
1254  if (desired < 8)
1255  ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 8);
1256  /* Make sure colormap indexes can be represented by JSAMPLEs */
1257  if (desired > MAXNUMCOLORS)
1258  ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS);
1259  cquantize->sv_colormap = (*cinfo->mem->alloc_sarray)
1261  cquantize->desired = desired;
1262  } else
1263  cquantize->sv_colormap = NULL;
1264 
1265  /* Only F-S dithering or no dithering is supported. */
1266  /* If user asks for ordered dither, give them F-S. */
1267  if (cinfo->dither_mode != JDITHER_NONE)
1268  cinfo->dither_mode = JDITHER_FS;
1269 
1270  /* Allocate Floyd-Steinberg workspace if necessary.
1271  * This isn't really needed until pass 2, but again it may affect the memory
1272  * manager's space calculations. Although we will cope with a later change
1273  * in dither_mode, we do not promise to honor max_memory_to_use if
1274  * dither_mode changes.
1275  */
1276  if (cinfo->dither_mode == JDITHER_FS) {
1277  cquantize->fserrors = (FSERRPTR)(*cinfo->mem->alloc_large)
1278  ((j_common_ptr)cinfo, JPOOL_IMAGE,
1279  (size_t)((cinfo->output_width + 2) * (3 * sizeof(FSERROR))));
1280  /* Might as well create the error-limiting table too. */
1281  init_error_limit(cinfo);
1282  }
1283 }
1284 
1285 #endif /* QUANT_2PASS_SUPPORTED */
small capitals from c petite p scientific i
[1]
Definition: afcover.h:80
for(n=0;n< outline->n_points;n++)
Definition: ftbbox.c:494
#define NULL
Definition: ftobjs.h:61
#define TRUE
Definition: ftobjs.h:53
#define FALSE
Definition: ftobjs.h:57
jpeg_component_info JCOEFPTR JSAMPARRAY output_buf
Definition: jdct.h:99
#define ERREXIT(cinfo, code)
Definition: jerror.h:234
#define TRACEMS1(cinfo, lvl, code, p1)
Definition: jerror.h:294
#define ERREXIT1(cinfo, code, p1)
Definition: jerror.h:237
unsigned int JDIMENSION
Definition: jmorecfg.h:155
unsigned short UINT16
Definition: jmorecfg.h:103
short INT16
Definition: jmorecfg.h:108
#define LOCAL(type)
Definition: jmorecfg.h:170
#define METHODDEF(type)
Definition: jmorecfg.h:168
#define GLOBAL(type)
Definition: jmorecfg.h:172
#define SHIFT_TEMPS
Definition: jpegint.h:315
long JLONG
Definition: jpegint.h:49
int JSAMPARRAY int int num_rows
Definition: jpegint.h:364
#define RIGHT_SHIFT(x, shft)
Definition: jpegint.h:316
struct jpeg_common_struct * j_common_ptr
Definition: jpeglib.h:290
@ JDITHER_NONE
Definition: jpeglib.h:262
@ JDITHER_FS
Definition: jpeglib.h:264
int desired
Definition: jpeglib.h:1063
JSAMPLE * JSAMPROW
Definition: jpeglib.h:69
JSAMPROW * JSAMPARRAY
Definition: jpeglib.h:70
#define JPOOL_IMAGE
Definition: jpeglib.h:826
int LOCFSERROR
Definition: jquant1.c:129
FSERROR * FSERRPTR
Definition: jquant1.c:135
INT16 FSERROR
Definition: jquant1.c:128
#define HIST_C0_ELEMS
Definition: jquant2.c:119
#define B_SCALE
Definition: jquant2.c:78
find_biggest_volume(boxptr boxlist, int numboxes)
Definition: jquant2.c:272
#define STEPSIZE
new_color_map_2_quant(j_decompress_ptr cinfo)
Definition: jquant2.c:1204
#define BOX_C1_ELEMS
Definition: jquant2.c:608
box * boxptr
Definition: jquant2.c:248
#define BOX_C1_LOG
Definition: jquant2.c:604
start_pass_2_quant(j_decompress_ptr cinfo, boolean is_pre_scan)
Definition: jquant2.c:1141
#define C2_SCALE
Definition: jquant2.c:83
update_box(j_decompress_ptr cinfo, boxptr boxp)
Definition: jquant2.c:292
my_cquantizer * my_cquantize_ptr
Definition: jquant2.c:190
compute_color(j_decompress_ptr cinfo, boxptr boxp, int icolor)
Definition: jquant2.c:478
#define BOX_C0_LOG
Definition: jquant2.c:603
#define BOX_C0_SHIFT
Definition: jquant2.c:611
init_error_limit(j_decompress_ptr cinfo)
Definition: jquant2.c:1082
find_nearby_colors(j_decompress_ptr cinfo, int minc0, int minc1, int minc2, JSAMPLE colorlist[])
Definition: jquant2.c:625
finish_pass2(j_decompress_ptr cinfo)
Definition: jquant2.c:1130
#define BOX_C0_ELEMS
Definition: jquant2.c:607
#define BOX_C2_ELEMS
Definition: jquant2.c:609
#define STEP_C1
#define MAXNUMCOLORS
Definition: jquant2.c:109
#define C1_SCALE
Definition: jquant2.c:82
#define BOX_C2_LOG
Definition: jquant2.c:605
hist1d * hist2d
Definition: jquant2.c:134
pass2_fs_dither(j_decompress_ptr cinfo, JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows)
Definition: jquant2.c:928
#define C0_SCALE
Definition: jquant2.c:81
#define HIST_C2_ELEMS
Definition: jquant2.c:121
int LOCFSERROR
Definition: jquant2.c:161
finish_pass1(j_decompress_ptr cinfo)
Definition: jquant2.c:1117
prescan_quantize(j_decompress_ptr cinfo, JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows)
Definition: jquant2.c:203
#define BOX_C2_SHIFT
Definition: jquant2.c:613
#define C1_SHIFT
Definition: jquant2.c:125
jinit_2pass_quantizer(j_decompress_ptr cinfo)
Definition: jquant2.c:1218
FSERROR * FSERRPTR
Definition: jquant2.c:167
#define C2_SHIFT
Definition: jquant2.c:126
#define C0_SHIFT
Definition: jquant2.c:124
#define G_SCALE
Definition: jquant2.c:77
pass2_no_dither(j_decompress_ptr cinfo, JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows)
Definition: jquant2.c:894
#define HIST_C1_ELEMS
Definition: jquant2.c:120
#define STEP_C2
find_best_colors(j_decompress_ptr cinfo, int minc0, int minc1, int minc2, int numcolors, JSAMPLE colorlist[], JSAMPLE bestcolor[])
Definition: jquant2.c:754
histcell * histptr
Definition: jquant2.c:131
hist2d * hist3d
Definition: jquant2.c:135
histcell hist1d[HIST_C2_ELEMS]
Definition: jquant2.c:133
#define BOX_C1_SHIFT
Definition: jquant2.c:612
fill_inverse_cmap(j_decompress_ptr cinfo, int c0, int c1, int c2)
Definition: jquant2.c:834
UINT16 histcell
Definition: jquant2.c:129
select_colors(j_decompress_ptr cinfo, int desired_colors)
Definition: jquant2.c:518
#define R_SCALE
Definition: jquant2.c:76
median_cut(j_decompress_ptr cinfo, boxptr boxlist, int numboxes, int desired_colors)
Definition: jquant2.c:403
find_biggest_color_pop(boxptr boxlist, int numboxes)
Definition: jquant2.c:252
#define STEP_C0
INT16 FSERROR
Definition: jquant2.c:160
JSAMPARRAY input_buf
Definition: jsimd.h:23
jzero_far(void *target, size_t bytestozero)
Definition: jutils.c:128
set set set set set set set macro pixldst1 abits if abits op else op endif endm macro pixldst2 abits if abits op else op endif endm macro pixldst4 abits if abits op else op endif endm macro pixldst0 abits op endm macro pixldst3 mem_operand op endm macro pixldst30 mem_operand op endm macro pixldst abits if abits elseif abits elseif abits elseif abits elseif abits pixldst0 abits else pixldst0 abits pixldst0 abits pixldst0 abits pixldst0 abits endif elseif abits else pixldst0 abits pixldst0 abits endif elseif abits else error unsupported bpp *numpix else pixst endif endm macro vuzp8 reg2 vuzp d d &reg2 endm macro vzip8 reg2 vzip d d &reg2 endm macro pixdeinterleave basereg basereg basereg basereg basereg endif endm macro pixinterleave basereg basereg basereg basereg basereg endif endm macro PF boost_increment endif if endif PF tst PF addne PF subne PF cmp ORIG_W if endif if endif if endif PF subge ORIG_W PF subges if endif if endif if endif endif endm macro cache_preload_simple endif if dst_r_bpp pld[DST_R, #(PREFETCH_DISTANCE_SIMPLE *dst_r_bpp/8)] endif if mask_bpp pld if[MASK, #(PREFETCH_DISTANCE_SIMPLE *mask_bpp/8)] endif endif endm macro ensure_destination_ptr_alignment process_pixblock_tail_head if beq irp skip1(dst_w_bpp<=(lowbit *8)) &&((lowbit *8)<(pixblock_size *dst_w_bpp)) .if lowbit< 16 tst DST_R
[3]
GLint GLint GLint GLint GLint x
[0]
GLenum GLenum GLsizei count
GLint GLsizei width
GLfloat n
GLsizei const GLint * box
GLuint in
Definition: qopenglext.h:8870
GLenum GLenum GLsizei void * row
Definition: qopenglext.h:2747
GLenum GLenum GLsizei void * table
Definition: qopenglext.h:2745
QTextStream out(stdout)
[7]
MyCustomStruct c2
QString dir
[11]
Definition: jquant2.c:237
int c2max
Definition: jquant2.c:241
int c1max
Definition: jquant2.c:240
JLONG volume
Definition: jquant2.c:243
int c2min
Definition: jquant2.c:241
int c1min
Definition: jquant2.c:240
int c0max
Definition: jquant2.c:239
int c0min
Definition: jquant2.c:239
long colorcount
Definition: jquant2.c:245
void(* start_pass)(j_decompress_ptr cinfo, boolean is_pre_scan)
Definition: jpegint.h:282
void(* new_color_map)(j_decompress_ptr cinfo)
Definition: jpegint.h:286
void(* color_quantize)(j_decompress_ptr cinfo, JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows)
Definition: jpegint.h:283
void(* finish_pass)(j_decompress_ptr cinfo)
Definition: jpegint.h:285
boolean needs_zeroed
Definition: jquant2.c:182
hist3d histogram
Definition: jquant2.c:180
int * error_limiter
Definition: jquant2.c:187
FSERRPTR fserrors[MAX_Q_COMPS]
Definition: jquant1.c:163
boolean on_odd_row
Definition: jquant1.c:164
struct jpeg_color_quantizer pub
Definition: jquant1.c:143
JSAMPARRAY sv_colormap
Definition: jquant1.c:146