Home | History | Annotate | Download | only in libjpeg-turbo
      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, D. R. Commander.
      8  * For conditions of distribution and use, see the accompanying README file.
      9  *
     10  * This file contains 2-pass color quantization (color mapping) routines.
     11  * These routines provide selection of a custom color map for an image,
     12  * followed by mapping of the image to that color map, with optional
     13  * Floyd-Steinberg dithering.
     14  * It is also possible to use just the second pass to map to an arbitrary
     15  * externally-given color map.
     16  *
     17  * Note: ordered dithering is not supported, since there isn't any fast
     18  * way to compute intercolor distances; it's unclear that ordered dither's
     19  * fundamental assumptions even hold with an irregularly spaced color map.
     20  */
     21 
     22 #define JPEG_INTERNALS
     23 #include "jinclude.h"
     24 #include "jpeglib.h"
     25 
     26 #ifdef QUANT_2PASS_SUPPORTED
     27 
     28 
     29 /*
     30  * This module implements the well-known Heckbert paradigm for color
     31  * quantization.  Most of the ideas used here can be traced back to
     32  * Heckbert's seminal paper
     33  *   Heckbert, Paul.  "Color Image Quantization for Frame Buffer Display",
     34  *   Proc. SIGGRAPH '82, Computer Graphics v.16 #3 (July 1982), pp 297-304.
     35  *
     36  * In the first pass over the image, we accumulate a histogram showing the
     37  * usage count of each possible color.  To keep the histogram to a reasonable
     38  * size, we reduce the precision of the input; typical practice is to retain
     39  * 5 or 6 bits per color, so that 8 or 4 different input values are counted
     40  * in the same histogram cell.
     41  *
     42  * Next, the color-selection step begins with a box representing the whole
     43  * color space, and repeatedly splits the "largest" remaining box until we
     44  * have as many boxes as desired colors.  Then the mean color in each
     45  * remaining box becomes one of the possible output colors.
     46  *
     47  * The second pass over the image maps each input pixel to the closest output
     48  * color (optionally after applying a Floyd-Steinberg dithering correction).
     49  * This mapping is logically trivial, but making it go fast enough requires
     50  * considerable care.
     51  *
     52  * Heckbert-style quantizers vary a good deal in their policies for choosing
     53  * the "largest" box and deciding where to cut it.  The particular policies
     54  * used here have proved out well in experimental comparisons, but better ones
     55  * may yet be found.
     56  *
     57  * In earlier versions of the IJG code, this module quantized in YCbCr color
     58  * space, processing the raw upsampled data without a color conversion step.
     59  * This allowed the color conversion math to be done only once per colormap
     60  * entry, not once per pixel.  However, that optimization precluded other
     61  * useful optimizations (such as merging color conversion with upsampling)
     62  * and it also interfered with desired capabilities such as quantizing to an
     63  * externally-supplied colormap.  We have therefore abandoned that approach.
     64  * The present code works in the post-conversion color space, typically RGB.
     65  *
     66  * To improve the visual quality of the results, we actually work in scaled
     67  * RGB space, giving G distances more weight than R, and R in turn more than
     68  * B.  To do everything in integer math, we must use integer scale factors.
     69  * The 2/3/1 scale factors used here correspond loosely to the relative
     70  * weights of the colors in the NTSC grayscale equation.
     71  * If you want to use this code to quantize a non-RGB color space, you'll
     72  * probably need to change these scale factors.
     73  */
     74 
     75 #define R_SCALE 2               /* scale R distances by this much */
     76 #define G_SCALE 3               /* scale G distances by this much */
     77 #define B_SCALE 1               /* and B by this much */
     78 
     79 static const int c_scales[3]={R_SCALE, G_SCALE, B_SCALE};
     80 #define C0_SCALE c_scales[rgb_red[cinfo->out_color_space]]
     81 #define C1_SCALE c_scales[rgb_green[cinfo->out_color_space]]
     82 #define C2_SCALE c_scales[rgb_blue[cinfo->out_color_space]]
     83 
     84 /*
     85  * First we have the histogram data structure and routines for creating it.
     86  *
     87  * The number of bits of precision can be adjusted by changing these symbols.
     88  * We recommend keeping 6 bits for G and 5 each for R and B.
     89  * If you have plenty of memory and cycles, 6 bits all around gives marginally
     90  * better results; if you are short of memory, 5 bits all around will save
     91  * some space but degrade the results.
     92  * To maintain a fully accurate histogram, we'd need to allocate a "long"
     93  * (preferably unsigned long) for each cell.  In practice this is overkill;
     94  * we can get by with 16 bits per cell.  Few of the cell counts will overflow,
     95  * and clamping those that do overflow to the maximum value will give close-
     96  * enough results.  This reduces the recommended histogram size from 256Kb
     97  * to 128Kb, which is a useful savings on PC-class machines.
     98  * (In the second pass the histogram space is re-used for pixel mapping data;
     99  * in that capacity, each cell must be able to store zero to the number of
    100  * desired colors.  16 bits/cell is plenty for that too.)
    101  * Since the JPEG code is intended to run in small memory model on 80x86
    102  * machines, we can't just allocate the histogram in one chunk.  Instead
    103  * of a true 3-D array, we use a row of pointers to 2-D arrays.  Each
    104  * pointer corresponds to a C0 value (typically 2^5 = 32 pointers) and
    105  * each 2-D array has 2^6*2^5 = 2048 or 2^6*2^6 = 4096 entries.
    106  */
    107 
    108 #define MAXNUMCOLORS  (MAXJSAMPLE+1) /* maximum size of colormap */
    109 
    110 /* These will do the right thing for either R,G,B or B,G,R color order,
    111  * but you may not like the results for other color orders.
    112  */
    113 #define HIST_C0_BITS  5         /* bits of precision in R/B histogram */
    114 #define HIST_C1_BITS  6         /* bits of precision in G histogram */
    115 #define HIST_C2_BITS  5         /* bits of precision in B/R histogram */
    116 
    117 /* Number of elements along histogram axes. */
    118 #define HIST_C0_ELEMS  (1<<HIST_C0_BITS)
    119 #define HIST_C1_ELEMS  (1<<HIST_C1_BITS)
    120 #define HIST_C2_ELEMS  (1<<HIST_C2_BITS)
    121 
    122 /* These are the amounts to shift an input value to get a histogram index. */
    123 #define C0_SHIFT  (BITS_IN_JSAMPLE-HIST_C0_BITS)
    124 #define C1_SHIFT  (BITS_IN_JSAMPLE-HIST_C1_BITS)
    125 #define C2_SHIFT  (BITS_IN_JSAMPLE-HIST_C2_BITS)
    126 
    127 
    128 typedef UINT16 histcell;        /* histogram cell; prefer an unsigned type */
    129 
    130 typedef histcell * histptr; /* for pointers to histogram cells */
    131 
    132 typedef histcell hist1d[HIST_C2_ELEMS]; /* typedefs for the array */
    133 typedef hist1d * hist2d;    /* type for the 2nd-level pointers */
    134 typedef hist2d * hist3d;        /* type for top-level pointer */
    135 
    136 
    137 /* Declarations for Floyd-Steinberg dithering.
    138  *
    139  * Errors are accumulated into the array fserrors[], at a resolution of
    140  * 1/16th of a pixel count.  The error at a given pixel is propagated
    141  * to its not-yet-processed neighbors using the standard F-S fractions,
    142  *              ...     (here)  7/16
    143  *              3/16    5/16    1/16
    144  * We work left-to-right on even rows, right-to-left on odd rows.
    145  *
    146  * We can get away with a single array (holding one row's worth of errors)
    147  * by using it to store the current row's errors at pixel columns not yet
    148  * processed, but the next row's errors at columns already processed.  We
    149  * need only a few extra variables to hold the errors immediately around the
    150  * current column.  (If we are lucky, those variables are in registers, but
    151  * even if not, they're probably cheaper to access than array elements are.)
    152  *
    153  * The fserrors[] array has (#columns + 2) entries; the extra entry at
    154  * each end saves us from special-casing the first and last pixels.
    155  * Each entry is three values long, one value for each color component.
    156  */
    157 
    158 #if BITS_IN_JSAMPLE == 8
    159 typedef INT16 FSERROR;          /* 16 bits should be enough */
    160 typedef int LOCFSERROR;         /* use 'int' for calculation temps */
    161 #else
    162 typedef INT32 FSERROR;          /* may need more than 16 bits */
    163 typedef INT32 LOCFSERROR;       /* be sure calculation temps are big enough */
    164 #endif
    165 
    166 typedef FSERROR *FSERRPTR;      /* pointer to error array */
    167 
    168 
    169 /* Private subobject */
    170 
    171 typedef struct {
    172   struct jpeg_color_quantizer pub; /* public fields */
    173 
    174   /* Space for the eventually created colormap is stashed here */
    175   JSAMPARRAY sv_colormap;       /* colormap allocated at init time */
    176   int desired;                  /* desired # of colors = size of colormap */
    177 
    178   /* Variables for accumulating image statistics */
    179   hist3d histogram;             /* pointer to the histogram */
    180 
    181   boolean needs_zeroed;         /* TRUE if next pass must zero histogram */
    182 
    183   /* Variables for Floyd-Steinberg dithering */
    184   FSERRPTR fserrors;            /* accumulated errors */
    185   boolean on_odd_row;           /* flag to remember which row we are on */
    186   int * error_limiter;          /* table for clamping the applied error */
    187 } my_cquantizer;
    188 
    189 typedef my_cquantizer * my_cquantize_ptr;
    190 
    191 
    192 /*
    193  * Prescan some rows of pixels.
    194  * In this module the prescan simply updates the histogram, which has been
    195  * initialized to zeroes by start_pass.
    196  * An output_buf parameter is required by the method signature, but no data
    197  * is actually output (in fact the buffer controller is probably passing a
    198  * NULL pointer).
    199  */
    200 
    201 METHODDEF(void)
    202 prescan_quantize (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
    203                   JSAMPARRAY output_buf, int num_rows)
    204 {
    205   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
    206   register JSAMPROW ptr;
    207   register histptr histp;
    208   register hist3d histogram = cquantize->histogram;
    209   int row;
    210   JDIMENSION col;
    211   JDIMENSION width = cinfo->output_width;
    212 
    213   for (row = 0; row < num_rows; row++) {
    214     ptr = input_buf[row];
    215     for (col = width; col > 0; col--) {
    216       /* get pixel value and index into the histogram */
    217       histp = & histogram[GETJSAMPLE(ptr[0]) >> C0_SHIFT]
    218                          [GETJSAMPLE(ptr[1]) >> C1_SHIFT]
    219                          [GETJSAMPLE(ptr[2]) >> C2_SHIFT];
    220       /* increment, check for overflow and undo increment if so. */
    221       if (++(*histp) <= 0)
    222         (*histp)--;
    223       ptr += 3;
    224     }
    225   }
    226 }
    227 
    228 
    229 /*
    230  * Next we have the really interesting routines: selection of a colormap
    231  * given the completed histogram.
    232  * These routines work with a list of "boxes", each representing a rectangular
    233  * subset of the input color space (to histogram precision).
    234  */
    235 
    236 typedef struct {
    237   /* The bounds of the box (inclusive); expressed as histogram indexes */
    238   int c0min, c0max;
    239   int c1min, c1max;
    240   int c2min, c2max;
    241   /* The volume (actually 2-norm) of the box */
    242   INT32 volume;
    243   /* The number of nonzero histogram cells within this box */
    244   long colorcount;
    245 } box;
    246 
    247 typedef box * boxptr;
    248 
    249 
    250 LOCAL(boxptr)
    251 find_biggest_color_pop (boxptr boxlist, int numboxes)
    252 /* Find the splittable box with the largest color population */
    253 /* Returns NULL if no splittable boxes remain */
    254 {
    255   register boxptr boxp;
    256   register int i;
    257   register long maxc = 0;
    258   boxptr which = NULL;
    259 
    260   for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) {
    261     if (boxp->colorcount > maxc && boxp->volume > 0) {
    262       which = boxp;
    263       maxc = boxp->colorcount;
    264     }
    265   }
    266   return which;
    267 }
    268 
    269 
    270 LOCAL(boxptr)
    271 find_biggest_volume (boxptr boxlist, int numboxes)
    272 /* Find the splittable box with the largest (scaled) volume */
    273 /* Returns NULL if no splittable boxes remain */
    274 {
    275   register boxptr boxp;
    276   register int i;
    277   register INT32 maxv = 0;
    278   boxptr which = NULL;
    279 
    280   for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) {
    281     if (boxp->volume > maxv) {
    282       which = boxp;
    283       maxv = boxp->volume;
    284     }
    285   }
    286   return which;
    287 }
    288 
    289 
    290 LOCAL(void)
    291 update_box (j_decompress_ptr cinfo, boxptr boxp)
    292 /* Shrink the min/max bounds of a box to enclose only nonzero elements, */
    293 /* and recompute its volume and population */
    294 {
    295   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
    296   hist3d histogram = cquantize->histogram;
    297   histptr histp;
    298   int c0,c1,c2;
    299   int c0min,c0max,c1min,c1max,c2min,c2max;
    300   INT32 dist0,dist1,dist2;
    301   long ccount;
    302 
    303   c0min = boxp->c0min;  c0max = boxp->c0max;
    304   c1min = boxp->c1min;  c1max = boxp->c1max;
    305   c2min = boxp->c2min;  c2max = boxp->c2max;
    306 
    307   if (c0max > c0min)
    308     for (c0 = c0min; c0 <= c0max; c0++)
    309       for (c1 = c1min; c1 <= c1max; c1++) {
    310         histp = & histogram[c0][c1][c2min];
    311         for (c2 = c2min; c2 <= c2max; c2++)
    312           if (*histp++ != 0) {
    313             boxp->c0min = c0min = c0;
    314             goto have_c0min;
    315           }
    316       }
    317  have_c0min:
    318   if (c0max > c0min)
    319     for (c0 = c0max; c0 >= c0min; c0--)
    320       for (c1 = c1min; c1 <= c1max; c1++) {
    321         histp = & histogram[c0][c1][c2min];
    322         for (c2 = c2min; c2 <= c2max; c2++)
    323           if (*histp++ != 0) {
    324             boxp->c0max = c0max = c0;
    325             goto have_c0max;
    326           }
    327       }
    328  have_c0max:
    329   if (c1max > c1min)
    330     for (c1 = c1min; c1 <= c1max; c1++)
    331       for (c0 = c0min; c0 <= c0max; c0++) {
    332         histp = & histogram[c0][c1][c2min];
    333         for (c2 = c2min; c2 <= c2max; c2++)
    334           if (*histp++ != 0) {
    335             boxp->c1min = c1min = c1;
    336             goto have_c1min;
    337           }
    338       }
    339  have_c1min:
    340   if (c1max > c1min)
    341     for (c1 = c1max; c1 >= c1min; c1--)
    342       for (c0 = c0min; c0 <= c0max; c0++) {
    343         histp = & histogram[c0][c1][c2min];
    344         for (c2 = c2min; c2 <= c2max; c2++)
    345           if (*histp++ != 0) {
    346             boxp->c1max = c1max = c1;
    347             goto have_c1max;
    348           }
    349       }
    350  have_c1max:
    351   if (c2max > c2min)
    352     for (c2 = c2min; c2 <= c2max; c2++)
    353       for (c0 = c0min; c0 <= c0max; c0++) {
    354         histp = & histogram[c0][c1min][c2];
    355         for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS)
    356           if (*histp != 0) {
    357             boxp->c2min = c2min = c2;
    358             goto have_c2min;
    359           }
    360       }
    361  have_c2min:
    362   if (c2max > c2min)
    363     for (c2 = c2max; c2 >= c2min; c2--)
    364       for (c0 = c0min; c0 <= c0max; c0++) {
    365         histp = & histogram[c0][c1min][c2];
    366         for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS)
    367           if (*histp != 0) {
    368             boxp->c2max = c2max = c2;
    369             goto have_c2max;
    370           }
    371       }
    372  have_c2max:
    373 
    374   /* Update box volume.
    375    * We use 2-norm rather than real volume here; this biases the method
    376    * against making long narrow boxes, and it has the side benefit that
    377    * a box is splittable iff norm > 0.
    378    * Since the differences are expressed in histogram-cell units,
    379    * we have to shift back to JSAMPLE units to get consistent distances;
    380    * after which, we scale according to the selected distance scale factors.
    381    */
    382   dist0 = ((c0max - c0min) << C0_SHIFT) * C0_SCALE;
    383   dist1 = ((c1max - c1min) << C1_SHIFT) * C1_SCALE;
    384   dist2 = ((c2max - c2min) << C2_SHIFT) * C2_SCALE;
    385   boxp->volume = dist0*dist0 + dist1*dist1 + dist2*dist2;
    386 
    387   /* Now scan remaining volume of box and compute population */
    388   ccount = 0;
    389   for (c0 = c0min; c0 <= c0max; c0++)
    390     for (c1 = c1min; c1 <= c1max; c1++) {
    391       histp = & histogram[c0][c1][c2min];
    392       for (c2 = c2min; c2 <= c2max; c2++, histp++)
    393         if (*histp != 0) {
    394           ccount++;
    395         }
    396     }
    397   boxp->colorcount = ccount;
    398 }
    399 
    400 
    401 LOCAL(int)
    402 median_cut (j_decompress_ptr cinfo, boxptr boxlist, int numboxes,
    403             int desired_colors)
    404 /* Repeatedly select and split the largest box until we have enough boxes */
    405 {
    406   int n,lb;
    407   int c0,c1,c2,cmax;
    408   register boxptr b1,b2;
    409 
    410   while (numboxes < desired_colors) {
    411     /* Select box to split.
    412      * Current algorithm: by population for first half, then by volume.
    413      */
    414     if (numboxes*2 <= desired_colors) {
    415       b1 = find_biggest_color_pop(boxlist, numboxes);
    416     } else {
    417       b1 = find_biggest_volume(boxlist, numboxes);
    418     }
    419     if (b1 == NULL)             /* no splittable boxes left! */
    420       break;
    421     b2 = &boxlist[numboxes];    /* where new box will go */
    422     /* Copy the color bounds to the new box. */
    423     b2->c0max = b1->c0max; b2->c1max = b1->c1max; b2->c2max = b1->c2max;
    424     b2->c0min = b1->c0min; b2->c1min = b1->c1min; b2->c2min = b1->c2min;
    425     /* Choose which axis to split the box on.
    426      * Current algorithm: longest scaled axis.
    427      * See notes in update_box about scaling distances.
    428      */
    429     c0 = ((b1->c0max - b1->c0min) << C0_SHIFT) * C0_SCALE;
    430     c1 = ((b1->c1max - b1->c1min) << C1_SHIFT) * C1_SCALE;
    431     c2 = ((b1->c2max - b1->c2min) << C2_SHIFT) * C2_SCALE;
    432     /* We want to break any ties in favor of green, then red, blue last.
    433      * This code does the right thing for R,G,B or B,G,R color orders only.
    434      */
    435     if (rgb_red[cinfo->out_color_space] == 0) {
    436       cmax = c1; n = 1;
    437       if (c0 > cmax) { cmax = c0; n = 0; }
    438       if (c2 > cmax) { n = 2; }
    439     }
    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 INT32s, 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   INT32 minmaxdist, min_dist, max_dist, tdist;
    641   INT32 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 = GETJSAMPLE(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 = GETJSAMPLE(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 = GETJSAMPLE(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 INT32 * bptr;        /* pointer into bestdist[] array */
    766   JSAMPLE * cptr;               /* pointer into bestcolor[] array */
    767   INT32 dist0, dist1;           /* initial distance values */
    768   register INT32 dist2;         /* current distance in inner loop */
    769   INT32 xx0, xx1;               /* distance increments */
    770   register INT32 xx2;
    771   INT32 inc0, inc1, inc2;       /* initial values for increments */
    772   /* This array holds the distance to the nearest-so-far color for each cell */
    773   INT32 bestdist[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS];
    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 = GETJSAMPLE(colorlist[i]);
    792     /* Compute (square of) distance from minc0/c1/c2 to this color */
    793     inc0 = (minc0 - GETJSAMPLE(cinfo->colormap[0][icolor])) * C0_SCALE;
    794     dist0 = inc0*inc0;
    795     inc1 = (minc1 - GETJSAMPLE(cinfo->colormap[1][icolor])) * C1_SCALE;
    796     dist0 += inc1*inc1;
    797     inc2 = (minc2 - GETJSAMPLE(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) (GETJSAMPLE(*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)
    894 pass2_no_dither (j_decompress_ptr cinfo,
    895                  JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows)
    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 = GETJSAMPLE(*inptr++) >> C0_SHIFT;
    913       c1 = GETJSAMPLE(*inptr++) >> C1_SHIFT;
    914       c2 = GETJSAMPLE(*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)
    928 pass2_fs_dither (j_decompress_ptr cinfo,
    929                  JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows)
    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];
    951   SHIFT_TEMPS
    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 += GETJSAMPLE(inptr[0]);
   1000       cur1 += GETJSAMPLE(inptr[1]);
   1001       cur2 += GETJSAMPLE(inptr[2]);
   1002       cur0 = GETJSAMPLE(range_limit[cur0]);
   1003       cur1 = GETJSAMPLE(range_limit[cur1]);
   1004       cur2 = GETJSAMPLE(range_limit[cur2]);
   1005       /* Index into the cache with adjusted pixel value */
   1006       cachep = & histogram[cur0>>C0_SHIFT][cur1>>C1_SHIFT][cur2>>C2_SHIFT];
   1007       /* If we have not seen this color before, find nearest colormap */
   1008       /* entry and update the cache */
   1009       if (*cachep == 0)
   1010         fill_inverse_cmap(cinfo, cur0>>C0_SHIFT,cur1>>C1_SHIFT,cur2>>C2_SHIFT);
   1011       /* Now emit the colormap index for this cell */
   1012       { register int pixcode = *cachep - 1;
   1013         *outptr = (JSAMPLE) pixcode;
   1014         /* Compute representation error for this pixel */
   1015         cur0 -= GETJSAMPLE(colormap0[pixcode]);
   1016         cur1 -= GETJSAMPLE(colormap1[pixcode]);
   1017         cur2 -= GETJSAMPLE(colormap2[pixcode]);
   1018       }
   1019       /* Compute error fractions to be propagated to adjacent pixels.
   1020        * Add these into the running sums, and simultaneously shift the
   1021        * next-line error sums left by 1 column.
   1022        */
   1023       { register LOCFSERROR bnexterr;
   1024 
   1025         bnexterr = cur0;        /* Process component 0 */
   1026         errorptr[0] = (FSERROR) (bpreverr0 + cur0 * 3);
   1027         bpreverr0 = belowerr0 + cur0 * 5;
   1028         belowerr0 = bnexterr;
   1029         cur0 *= 7;
   1030         bnexterr = cur1;        /* Process component 1 */
   1031         errorptr[1] = (FSERROR) (bpreverr1 + cur1 * 3);
   1032         bpreverr1 = belowerr1 + cur1 * 5;
   1033         belowerr1 = bnexterr;
   1034         cur1 *= 7;
   1035         bnexterr = cur2;        /* Process component 2 */
   1036         errorptr[2] = (FSERROR) (bpreverr2 + cur2 * 3);
   1037         bpreverr2 = belowerr2 + cur2 * 5;
   1038         belowerr2 = bnexterr;
   1039         cur2 *= 7;
   1040       }
   1041       /* At this point curN contains the 7/16 error value to be propagated
   1042        * to the next pixel on the current line, and all the errors for the
   1043        * next line have been shifted over.  We are therefore ready to move on.
   1044        */
   1045       inptr += dir3;            /* Advance pixel pointers to next column */
   1046       outptr += dir;
   1047       errorptr += dir3;         /* advance errorptr to current column */
   1048     }
   1049     /* Post-loop cleanup: we must unload the final error values into the
   1050      * final fserrors[] entry.  Note we need not unload belowerrN because
   1051      * it is for the dummy column before or after the actual array.
   1052      */
   1053     errorptr[0] = (FSERROR) bpreverr0; /* unload prev errs into array */
   1054     errorptr[1] = (FSERROR) bpreverr1;
   1055     errorptr[2] = (FSERROR) bpreverr2;
   1056   }
   1057 }
   1058 
   1059 
   1060 /*
   1061  * Initialize the error-limiting transfer function (lookup table).
   1062  * The raw F-S error computation can potentially compute error values of up to
   1063  * +- MAXJSAMPLE.  But we want the maximum correction applied to a pixel to be
   1064  * much less, otherwise obviously wrong pixels will be created.  (Typical
   1065  * effects include weird fringes at color-area boundaries, isolated bright
   1066  * pixels in a dark area, etc.)  The standard advice for avoiding this problem
   1067  * is to ensure that the "corners" of the color cube are allocated as output
   1068  * colors; then repeated errors in the same direction cannot cause cascading
   1069  * error buildup.  However, that only prevents the error from getting
   1070  * completely out of hand; Aaron Giles reports that error limiting improves
   1071  * the results even with corner colors allocated.
   1072  * A simple clamping of the error values to about +- MAXJSAMPLE/8 works pretty
   1073  * well, but the smoother transfer function used below is even better.  Thanks
   1074  * to Aaron Giles for this idea.
   1075  */
   1076 
   1077 LOCAL(void)
   1078 init_error_limit (j_decompress_ptr cinfo)
   1079 /* Allocate and fill in the error_limiter table */
   1080 {
   1081   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
   1082   int * table;
   1083   int in, out;
   1084 
   1085   table = (int *) (*cinfo->mem->alloc_small)
   1086     ((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE*2+1) * sizeof(int));
   1087   table += MAXJSAMPLE;          /* so can index -MAXJSAMPLE .. +MAXJSAMPLE */
   1088   cquantize->error_limiter = table;
   1089 
   1090 #define STEPSIZE ((MAXJSAMPLE+1)/16)
   1091   /* Map errors 1:1 up to +- MAXJSAMPLE/16 */
   1092   out = 0;
   1093   for (in = 0; in < STEPSIZE; in++, out++) {
   1094     table[in] = out; table[-in] = -out;
   1095   }
   1096   /* Map errors 1:2 up to +- 3*MAXJSAMPLE/16 */
   1097   for (; in < STEPSIZE*3; in++, out += (in&1) ? 0 : 1) {
   1098     table[in] = out; table[-in] = -out;
   1099   }
   1100   /* Clamp the rest to final out value (which is (MAXJSAMPLE+1)/8) */
   1101   for (; in <= MAXJSAMPLE; in++) {
   1102     table[in] = out; table[-in] = -out;
   1103   }
   1104 #undef STEPSIZE
   1105 }
   1106 
   1107 
   1108 /*
   1109  * Finish up at the end of each pass.
   1110  */
   1111 
   1112 METHODDEF(void)
   1113 finish_pass1 (j_decompress_ptr cinfo)
   1114 {
   1115   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
   1116 
   1117   /* Select the representative colors and fill in cinfo->colormap */
   1118   cinfo->colormap = cquantize->sv_colormap;
   1119   select_colors(cinfo, cquantize->desired);
   1120   /* Force next pass to zero the color index table */
   1121   cquantize->needs_zeroed = TRUE;
   1122 }
   1123 
   1124 
   1125 METHODDEF(void)
   1126 finish_pass2 (j_decompress_ptr cinfo)
   1127 {
   1128   /* no work */
   1129 }
   1130 
   1131 
   1132 /*
   1133  * Initialize for each processing pass.
   1134  */
   1135 
   1136 METHODDEF(void)
   1137 start_pass_2_quant (j_decompress_ptr cinfo, boolean is_pre_scan)
   1138 {
   1139   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
   1140   hist3d histogram = cquantize->histogram;
   1141   int i;
   1142 
   1143   /* Only F-S dithering or no dithering is supported. */
   1144   /* If user asks for ordered dither, give him F-S. */
   1145   if (cinfo->dither_mode != JDITHER_NONE)
   1146     cinfo->dither_mode = JDITHER_FS;
   1147 
   1148   if (is_pre_scan) {
   1149     /* Set up method pointers */
   1150     cquantize->pub.color_quantize = prescan_quantize;
   1151     cquantize->pub.finish_pass = finish_pass1;
   1152     cquantize->needs_zeroed = TRUE; /* Always zero histogram */
   1153   } else {
   1154     /* Set up method pointers */
   1155     if (cinfo->dither_mode == JDITHER_FS)
   1156       cquantize->pub.color_quantize = pass2_fs_dither;
   1157     else
   1158       cquantize->pub.color_quantize = pass2_no_dither;
   1159     cquantize->pub.finish_pass = finish_pass2;
   1160 
   1161     /* Make sure color count is acceptable */
   1162     i = cinfo->actual_number_of_colors;
   1163     if (i < 1)
   1164       ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 1);
   1165     if (i > MAXNUMCOLORS)
   1166       ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS);
   1167 
   1168     if (cinfo->dither_mode == JDITHER_FS) {
   1169       size_t arraysize = (size_t) ((cinfo->output_width + 2) *
   1170                                    (3 * sizeof(FSERROR)));
   1171       /* Allocate Floyd-Steinberg workspace if we didn't already. */
   1172       if (cquantize->fserrors == NULL)
   1173         cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large)
   1174           ((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize);
   1175       /* Initialize the propagated errors to zero. */
   1176       jzero_far((void *) cquantize->fserrors, arraysize);
   1177       /* Make the error-limit table if we didn't already. */
   1178       if (cquantize->error_limiter == NULL)
   1179         init_error_limit(cinfo);
   1180       cquantize->on_odd_row = FALSE;
   1181     }
   1182 
   1183   }
   1184   /* Zero the histogram or inverse color map, if necessary */
   1185   if (cquantize->needs_zeroed) {
   1186     for (i = 0; i < HIST_C0_ELEMS; i++) {
   1187       jzero_far((void *) histogram[i],
   1188                 HIST_C1_ELEMS*HIST_C2_ELEMS * sizeof(histcell));
   1189     }
   1190     cquantize->needs_zeroed = FALSE;
   1191   }
   1192 }
   1193 
   1194 
   1195 /*
   1196  * Switch to a new external colormap between output passes.
   1197  */
   1198 
   1199 METHODDEF(void)
   1200 new_color_map_2_quant (j_decompress_ptr cinfo)
   1201 {
   1202   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
   1203 
   1204   /* Reset the inverse color map */
   1205   cquantize->needs_zeroed = TRUE;
   1206 }
   1207 
   1208 
   1209 /*
   1210  * Module initialization routine for 2-pass color quantization.
   1211  */
   1212 
   1213 GLOBAL(void)
   1214 jinit_2pass_quantizer (j_decompress_ptr cinfo)
   1215 {
   1216   my_cquantize_ptr cquantize;
   1217   int i;
   1218 
   1219   cquantize = (my_cquantize_ptr)
   1220     (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
   1221                                 sizeof(my_cquantizer));
   1222   cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize;
   1223   cquantize->pub.start_pass = start_pass_2_quant;
   1224   cquantize->pub.new_color_map = new_color_map_2_quant;
   1225   cquantize->fserrors = NULL;   /* flag optional arrays not allocated */
   1226   cquantize->error_limiter = NULL;
   1227 
   1228   /* Make sure jdmaster didn't give me a case I can't handle */
   1229   if (cinfo->out_color_components != 3)
   1230     ERREXIT(cinfo, JERR_NOTIMPL);
   1231 
   1232   /* Allocate the histogram/inverse colormap storage */
   1233   cquantize->histogram = (hist3d) (*cinfo->mem->alloc_small)
   1234     ((j_common_ptr) cinfo, JPOOL_IMAGE, HIST_C0_ELEMS * sizeof(hist2d));
   1235   for (i = 0; i < HIST_C0_ELEMS; i++) {
   1236     cquantize->histogram[i] = (hist2d) (*cinfo->mem->alloc_large)
   1237       ((j_common_ptr) cinfo, JPOOL_IMAGE,
   1238        HIST_C1_ELEMS*HIST_C2_ELEMS * sizeof(histcell));
   1239   }
   1240   cquantize->needs_zeroed = TRUE; /* histogram is garbage now */
   1241 
   1242   /* Allocate storage for the completed colormap, if required.
   1243    * We do this now since it may affect the memory manager's space
   1244    * calculations.
   1245    */
   1246   if (cinfo->enable_2pass_quant) {
   1247     /* Make sure color count is acceptable */
   1248     int desired = cinfo->desired_number_of_colors;
   1249     /* Lower bound on # of colors ... somewhat arbitrary as long as > 0 */
   1250     if (desired < 8)
   1251       ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 8);
   1252     /* Make sure colormap indexes can be represented by JSAMPLEs */
   1253     if (desired > MAXNUMCOLORS)
   1254       ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS);
   1255     cquantize->sv_colormap = (*cinfo->mem->alloc_sarray)
   1256       ((j_common_ptr) cinfo,JPOOL_IMAGE, (JDIMENSION) desired, (JDIMENSION) 3);
   1257     cquantize->desired = desired;
   1258   } else
   1259     cquantize->sv_colormap = NULL;
   1260 
   1261   /* Only F-S dithering or no dithering is supported. */
   1262   /* If user asks for ordered dither, give him F-S. */
   1263   if (cinfo->dither_mode != JDITHER_NONE)
   1264     cinfo->dither_mode = JDITHER_FS;
   1265 
   1266   /* Allocate Floyd-Steinberg workspace if necessary.
   1267    * This isn't really needed until pass 2, but again it may affect the memory
   1268    * manager's space calculations.  Although we will cope with a later change
   1269    * in dither_mode, we do not promise to honor max_memory_to_use if
   1270    * dither_mode changes.
   1271    */
   1272   if (cinfo->dither_mode == JDITHER_FS) {
   1273     cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large)
   1274       ((j_common_ptr) cinfo, JPOOL_IMAGE,
   1275        (size_t) ((cinfo->output_width + 2) * (3 * sizeof(FSERROR))));
   1276     /* Might as well create the error-limiting table too. */
   1277     init_error_limit(cinfo);
   1278   }
   1279 }
   1280 
   1281 #endif /* QUANT_2PASS_SUPPORTED */
   1282