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-2015, 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 
    190 typedef my_cquantizer *my_cquantize_ptr;
    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)
    203 prescan_quantize (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
    204                   JSAMPARRAY output_buf, int num_rows)
    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[GETJSAMPLE(ptr[0]) >> C0_SHIFT]
    219                          [GETJSAMPLE(ptr[1]) >> C1_SHIFT]
    220                          [GETJSAMPLE(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 */
    243   JLONG volume;
    244   /* The number of nonzero histogram cells within this box */
    245   long colorcount;
    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)
    292 update_box (j_decompress_ptr cinfo, boxptr boxp)
    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     }
    441     else {
    442       cmax = c1; n = 1;
    443       if (c2 > cmax) { cmax = c2; n = 2; }
    444       if (c0 > cmax) { n = 0; }
    445     }
    446     /* Choose split point along selected axis, and update box bounds.
    447      * Current algorithm: split at halfway point.
    448      * (Since the box has been shrunk to minimum volume,
    449      * any split will produce two nonempty subboxes.)
    450      * Note that lb value is max for lower box, so must be < old max.
    451      */
    452     switch (n) {
    453     case 0:
    454       lb = (b1->c0max + b1->c0min) / 2;
    455       b1->c0max = lb;
    456       b2->c0min = lb+1;
    457       break;
    458     case 1:
    459       lb = (b1->c1max + b1->c1min) / 2;
    460       b1->c1max = lb;
    461       b2->c1min = lb+1;
    462       break;
    463     case 2:
    464       lb = (b1->c2max + b1->c2min) / 2;
    465       b1->c2max = lb;
    466       b2->c2min = lb+1;
    467       break;
    468     }
    469     /* Update stats for boxes */
    470     update_box(cinfo, b1);
    471     update_box(cinfo, b2);
    472     numboxes++;
    473   }
    474   return numboxes;
    475 }
    476 
    477 
    478 LOCAL(void)
    479 compute_color (j_decompress_ptr cinfo, boxptr boxp, int icolor)
    480 /* Compute representative color for a box, put it in colormap[icolor] */
    481 {
    482   /* Current algorithm: mean weighted by pixels (not colors) */
    483   /* Note it is important to get the rounding correct! */
    484   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
    485   hist3d histogram = cquantize->histogram;
    486   histptr histp;
    487   int c0,c1,c2;
    488   int c0min,c0max,c1min,c1max,c2min,c2max;
    489   long count;
    490   long total = 0;
    491   long c0total = 0;
    492   long c1total = 0;
    493   long c2total = 0;
    494 
    495   c0min = boxp->c0min;  c0max = boxp->c0max;
    496   c1min = boxp->c1min;  c1max = boxp->c1max;
    497   c2min = boxp->c2min;  c2max = boxp->c2max;
    498 
    499   for (c0 = c0min; c0 <= c0max; c0++)
    500     for (c1 = c1min; c1 <= c1max; c1++) {
    501       histp = & histogram[c0][c1][c2min];
    502       for (c2 = c2min; c2 <= c2max; c2++) {
    503         if ((count = *histp++) != 0) {
    504           total += count;
    505           c0total += ((c0 << C0_SHIFT) + ((1<<C0_SHIFT)>>1)) * count;
    506           c1total += ((c1 << C1_SHIFT) + ((1<<C1_SHIFT)>>1)) * count;
    507           c2total += ((c2 << C2_SHIFT) + ((1<<C2_SHIFT)>>1)) * count;
    508         }
    509       }
    510     }
    511 
    512   cinfo->colormap[0][icolor] = (JSAMPLE) ((c0total + (total>>1)) / total);
    513   cinfo->colormap[1][icolor] = (JSAMPLE) ((c1total + (total>>1)) / total);
    514   cinfo->colormap[2][icolor] = (JSAMPLE) ((c2total + (total>>1)) / total);
    515 }
    516 
    517 
    518 LOCAL(void)
    519 select_colors (j_decompress_ptr cinfo, int desired_colors)
    520 /* Master routine for color selection */
    521 {
    522   boxptr boxlist;
    523   int numboxes;
    524   int i;
    525 
    526   /* Allocate workspace for box list */
    527   boxlist = (boxptr) (*cinfo->mem->alloc_small)
    528     ((j_common_ptr) cinfo, JPOOL_IMAGE, desired_colors * sizeof(box));
    529   /* Initialize one box containing whole space */
    530   numboxes = 1;
    531   boxlist[0].c0min = 0;
    532   boxlist[0].c0max = MAXJSAMPLE >> C0_SHIFT;
    533   boxlist[0].c1min = 0;
    534   boxlist[0].c1max = MAXJSAMPLE >> C1_SHIFT;
    535   boxlist[0].c2min = 0;
    536   boxlist[0].c2max = MAXJSAMPLE >> C2_SHIFT;
    537   /* Shrink it to actually-used volume and set its statistics */
    538   update_box(cinfo, & boxlist[0]);
    539   /* Perform median-cut to produce final box list */
    540   numboxes = median_cut(cinfo, boxlist, numboxes, desired_colors);
    541   /* Compute the representative color for each box, fill colormap */
    542   for (i = 0; i < numboxes; i++)
    543     compute_color(cinfo, & boxlist[i], i);
    544   cinfo->actual_number_of_colors = numboxes;
    545   TRACEMS1(cinfo, 1, JTRC_QUANT_SELECTED, numboxes);
    546 }
    547 
    548 
    549 /*
    550  * These routines are concerned with the time-critical task of mapping input
    551  * colors to the nearest color in the selected colormap.
    552  *
    553  * We re-use the histogram space as an "inverse color map", essentially a
    554  * cache for the results of nearest-color searches.  All colors within a
    555  * histogram cell will be mapped to the same colormap entry, namely the one
    556  * closest to the cell's center.  This may not be quite the closest entry to
    557  * the actual input color, but it's almost as good.  A zero in the cache
    558  * indicates we haven't found the nearest color for that cell yet; the array
    559  * is cleared to zeroes before starting the mapping pass.  When we find the
    560  * nearest color for a cell, its colormap index plus one is recorded in the
    561  * cache for future use.  The pass2 scanning routines call fill_inverse_cmap
    562  * when they need to use an unfilled entry in the cache.
    563  *
    564  * Our method of efficiently finding nearest colors is based on the "locally
    565  * sorted search" idea described by Heckbert and on the incremental distance
    566  * calculation described by Spencer W. Thomas in chapter III.1 of Graphics
    567  * Gems II (James Arvo, ed.  Academic Press, 1991).  Thomas points out that
    568  * the distances from a given colormap entry to each cell of the histogram can
    569  * be computed quickly using an incremental method: the differences between
    570  * distances to adjacent cells themselves differ by a constant.  This allows a
    571  * fairly fast implementation of the "brute force" approach of computing the
    572  * distance from every colormap entry to every histogram cell.  Unfortunately,
    573  * it needs a work array to hold the best-distance-so-far for each histogram
    574  * cell (because the inner loop has to be over cells, not colormap entries).
    575  * The work array elements have to be JLONGs, so the work array would need
    576  * 256Kb at our recommended precision.  This is not feasible in DOS machines.
    577  *
    578  * To get around these problems, we apply Thomas' method to compute the
    579  * nearest colors for only the cells within a small subbox of the histogram.
    580  * The work array need be only as big as the subbox, so the memory usage
    581  * problem is solved.  Furthermore, we need not fill subboxes that are never
    582  * referenced in pass2; many images use only part of the color gamut, so a
    583  * fair amount of work is saved.  An additional advantage of this
    584  * approach is that we can apply Heckbert's locality criterion to quickly
    585  * eliminate colormap entries that are far away from the subbox; typically
    586  * three-fourths of the colormap entries are rejected by Heckbert's criterion,
    587  * and we need not compute their distances to individual cells in the subbox.
    588  * The speed of this approach is heavily influenced by the subbox size: too
    589  * small means too much overhead, too big loses because Heckbert's criterion
    590  * can't eliminate as many colormap entries.  Empirically the best subbox
    591  * size seems to be about 1/512th of the histogram (1/8th in each direction).
    592  *
    593  * Thomas' article also describes a refined method which is asymptotically
    594  * faster than the brute-force method, but it is also far more complex and
    595  * cannot efficiently be applied to small subboxes.  It is therefore not
    596  * useful for programs intended to be portable to DOS machines.  On machines
    597  * with plenty of memory, filling the whole histogram in one shot with Thomas'
    598  * refined method might be faster than the present code --- but then again,
    599  * it might not be any faster, and it's certainly more complicated.
    600  */
    601 
    602 
    603 /* log2(histogram cells in update box) for each axis; this can be adjusted */
    604 #define BOX_C0_LOG  (HIST_C0_BITS-3)
    605 #define BOX_C1_LOG  (HIST_C1_BITS-3)
    606 #define BOX_C2_LOG  (HIST_C2_BITS-3)
    607 
    608 #define BOX_C0_ELEMS  (1<<BOX_C0_LOG) /* # of hist cells in update box */
    609 #define BOX_C1_ELEMS  (1<<BOX_C1_LOG)
    610 #define BOX_C2_ELEMS  (1<<BOX_C2_LOG)
    611 
    612 #define BOX_C0_SHIFT  (C0_SHIFT + BOX_C0_LOG)
    613 #define BOX_C1_SHIFT  (C1_SHIFT + BOX_C1_LOG)
    614 #define BOX_C2_SHIFT  (C2_SHIFT + BOX_C2_LOG)
    615 
    616 
    617 /*
    618  * The next three routines implement inverse colormap filling.  They could
    619  * all be folded into one big routine, but splitting them up this way saves
    620  * some stack space (the mindist[] and bestdist[] arrays need not coexist)
    621  * and may allow some compilers to produce better code by registerizing more
    622  * inner-loop variables.
    623  */
    624 
    625 LOCAL(int)
    626 find_nearby_colors (j_decompress_ptr cinfo, int minc0, int minc1, int minc2,
    627                     JSAMPLE colorlist[])
    628 /* Locate the colormap entries close enough to an update box to be candidates
    629  * for the nearest entry to some cell(s) in the update box.  The update box
    630  * is specified by the center coordinates of its first cell.  The number of
    631  * candidate colormap entries is returned, and their colormap indexes are
    632  * placed in colorlist[].
    633  * This routine uses Heckbert's "locally sorted search" criterion to select
    634  * the colors that need further consideration.
    635  */
    636 {
    637   int numcolors = cinfo->actual_number_of_colors;
    638   int maxc0, maxc1, maxc2;
    639   int centerc0, centerc1, centerc2;
    640   int i, x, ncolors;
    641   JLONG minmaxdist, min_dist, max_dist, tdist;
    642   JLONG mindist[MAXNUMCOLORS];  /* min distance to colormap entry i */
    643 
    644   /* Compute true coordinates of update box's upper corner and center.
    645    * Actually we compute the coordinates of the center of the upper-corner
    646    * histogram cell, which are the upper bounds of the volume we care about.
    647    * Note that since ">>" rounds down, the "center" values may be closer to
    648    * min than to max; hence comparisons to them must be "<=", not "<".
    649    */
    650   maxc0 = minc0 + ((1 << BOX_C0_SHIFT) - (1 << C0_SHIFT));
    651   centerc0 = (minc0 + maxc0) >> 1;
    652   maxc1 = minc1 + ((1 << BOX_C1_SHIFT) - (1 << C1_SHIFT));
    653   centerc1 = (minc1 + maxc1) >> 1;
    654   maxc2 = minc2 + ((1 << BOX_C2_SHIFT) - (1 << C2_SHIFT));
    655   centerc2 = (minc2 + maxc2) >> 1;
    656 
    657   /* For each color in colormap, find:
    658    *  1. its minimum squared-distance to any point in the update box
    659    *     (zero if color is within update box);
    660    *  2. its maximum squared-distance to any point in the update box.
    661    * Both of these can be found by considering only the corners of the box.
    662    * We save the minimum distance for each color in mindist[];
    663    * only the smallest maximum distance is of interest.
    664    */
    665   minmaxdist = 0x7FFFFFFFL;
    666 
    667   for (i = 0; i < numcolors; i++) {
    668     /* We compute the squared-c0-distance term, then add in the other two. */
    669     x = GETJSAMPLE(cinfo->colormap[0][i]);
    670     if (x < minc0) {
    671       tdist = (x - minc0) * C0_SCALE;
    672       min_dist = tdist*tdist;
    673       tdist = (x - maxc0) * C0_SCALE;
    674       max_dist = tdist*tdist;
    675     } else if (x > maxc0) {
    676       tdist = (x - maxc0) * C0_SCALE;
    677       min_dist = tdist*tdist;
    678       tdist = (x - minc0) * C0_SCALE;
    679       max_dist = tdist*tdist;
    680     } else {
    681       /* within cell range so no contribution to min_dist */
    682       min_dist = 0;
    683       if (x <= centerc0) {
    684         tdist = (x - maxc0) * C0_SCALE;
    685         max_dist = tdist*tdist;
    686       } else {
    687         tdist = (x - minc0) * C0_SCALE;
    688         max_dist = tdist*tdist;
    689       }
    690     }
    691 
    692     x = GETJSAMPLE(cinfo->colormap[1][i]);
    693     if (x < minc1) {
    694       tdist = (x - minc1) * C1_SCALE;
    695       min_dist += tdist*tdist;
    696       tdist = (x - maxc1) * C1_SCALE;
    697       max_dist += tdist*tdist;
    698     } else if (x > maxc1) {
    699       tdist = (x - maxc1) * C1_SCALE;
    700       min_dist += tdist*tdist;
    701       tdist = (x - minc1) * C1_SCALE;
    702       max_dist += tdist*tdist;
    703     } else {
    704       /* within cell range so no contribution to min_dist */
    705       if (x <= centerc1) {
    706         tdist = (x - maxc1) * C1_SCALE;
    707         max_dist += tdist*tdist;
    708       } else {
    709         tdist = (x - minc1) * C1_SCALE;
    710         max_dist += tdist*tdist;
    711       }
    712     }
    713 
    714     x = GETJSAMPLE(cinfo->colormap[2][i]);
    715     if (x < minc2) {
    716       tdist = (x - minc2) * C2_SCALE;
    717       min_dist += tdist*tdist;
    718       tdist = (x - maxc2) * C2_SCALE;
    719       max_dist += tdist*tdist;
    720     } else if (x > maxc2) {
    721       tdist = (x - maxc2) * C2_SCALE;
    722       min_dist += tdist*tdist;
    723       tdist = (x - minc2) * C2_SCALE;
    724       max_dist += tdist*tdist;
    725     } else {
    726       /* within cell range so no contribution to min_dist */
    727       if (x <= centerc2) {
    728         tdist = (x - maxc2) * C2_SCALE;
    729         max_dist += tdist*tdist;
    730       } else {
    731         tdist = (x - minc2) * C2_SCALE;
    732         max_dist += tdist*tdist;
    733       }
    734     }
    735 
    736     mindist[i] = min_dist;      /* save away the results */
    737     if (max_dist < minmaxdist)
    738       minmaxdist = max_dist;
    739   }
    740 
    741   /* Now we know that no cell in the update box is more than minmaxdist
    742    * away from some colormap entry.  Therefore, only colors that are
    743    * within minmaxdist of some part of the box need be considered.
    744    */
    745   ncolors = 0;
    746   for (i = 0; i < numcolors; i++) {
    747     if (mindist[i] <= minmaxdist)
    748       colorlist[ncolors++] = (JSAMPLE) i;
    749   }
    750   return ncolors;
    751 }
    752 
    753 
    754 LOCAL(void)
    755 find_best_colors (j_decompress_ptr cinfo, int minc0, int minc1, int minc2,
    756                   int numcolors, JSAMPLE colorlist[], JSAMPLE bestcolor[])
    757 /* Find the closest colormap entry for each cell in the update box,
    758  * given the list of candidate colors prepared by find_nearby_colors.
    759  * Return the indexes of the closest entries in the bestcolor[] array.
    760  * This routine uses Thomas' incremental distance calculation method to
    761  * find the distance from a colormap entry to successive cells in the box.
    762  */
    763 {
    764   int ic0, ic1, ic2;
    765   int i, icolor;
    766   register JLONG *bptr;         /* pointer into bestdist[] array */
    767   JSAMPLE *cptr;                /* pointer into bestcolor[] array */
    768   JLONG dist0, dist1;           /* initial distance values */
    769   register JLONG dist2;         /* current distance in inner loop */
    770   JLONG xx0, xx1;               /* distance increments */
    771   register JLONG xx2;
    772   JLONG inc0, inc1, inc2;       /* initial values for increments */
    773   /* This array holds the distance to the nearest-so-far color for each cell */
    774   JLONG bestdist[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS];
    775 
    776   /* Initialize best-distance for each cell of the update box */
    777   bptr = bestdist;
    778   for (i = BOX_C0_ELEMS*BOX_C1_ELEMS*BOX_C2_ELEMS-1; i >= 0; i--)
    779     *bptr++ = 0x7FFFFFFFL;
    780 
    781   /* For each color selected by find_nearby_colors,
    782    * compute its distance to the center of each cell in the box.
    783    * If that's less than best-so-far, update best distance and color number.
    784    */
    785 
    786   /* Nominal steps between cell centers ("x" in Thomas article) */
    787 #define STEP_C0  ((1 << C0_SHIFT) * C0_SCALE)
    788 #define STEP_C1  ((1 << C1_SHIFT) * C1_SCALE)
    789 #define STEP_C2  ((1 << C2_SHIFT) * C2_SCALE)
    790 
    791   for (i = 0; i < numcolors; i++) {
    792     icolor = GETJSAMPLE(colorlist[i]);
    793     /* Compute (square of) distance from minc0/c1/c2 to this color */
    794     inc0 = (minc0 - GETJSAMPLE(cinfo->colormap[0][icolor])) * C0_SCALE;
    795     dist0 = inc0*inc0;
    796     inc1 = (minc1 - GETJSAMPLE(cinfo->colormap[1][icolor])) * C1_SCALE;
    797     dist0 += inc1*inc1;
    798     inc2 = (minc2 - GETJSAMPLE(cinfo->colormap[2][icolor])) * C2_SCALE;
    799     dist0 += inc2*inc2;
    800     /* Form the initial difference increments */
    801     inc0 = inc0 * (2 * STEP_C0) + STEP_C0 * STEP_C0;
    802     inc1 = inc1 * (2 * STEP_C1) + STEP_C1 * STEP_C1;
    803     inc2 = inc2 * (2 * STEP_C2) + STEP_C2 * STEP_C2;
    804     /* Now loop over all cells in box, updating distance per Thomas method */
    805     bptr = bestdist;
    806     cptr = bestcolor;
    807     xx0 = inc0;
    808     for (ic0 = BOX_C0_ELEMS-1; ic0 >= 0; ic0--) {
    809       dist1 = dist0;
    810       xx1 = inc1;
    811       for (ic1 = BOX_C1_ELEMS-1; ic1 >= 0; ic1--) {
    812         dist2 = dist1;
    813         xx2 = inc2;
    814         for (ic2 = BOX_C2_ELEMS-1; ic2 >= 0; ic2--) {
    815           if (dist2 < *bptr) {
    816             *bptr = dist2;
    817             *cptr = (JSAMPLE) icolor;
    818           }
    819           dist2 += xx2;
    820           xx2 += 2 * STEP_C2 * STEP_C2;
    821           bptr++;
    822           cptr++;
    823         }
    824         dist1 += xx1;
    825         xx1 += 2 * STEP_C1 * STEP_C1;
    826       }
    827       dist0 += xx0;
    828       xx0 += 2 * STEP_C0 * STEP_C0;
    829     }
    830   }
    831 }
    832 
    833 
    834 LOCAL(void)
    835 fill_inverse_cmap (j_decompress_ptr cinfo, int c0, int c1, int c2)
    836 /* Fill the inverse-colormap entries in the update box that contains */
    837 /* histogram cell c0/c1/c2.  (Only that one cell MUST be filled, but */
    838 /* we can fill as many others as we wish.) */
    839 {
    840   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
    841   hist3d histogram = cquantize->histogram;
    842   int minc0, minc1, minc2;      /* lower left corner of update box */
    843   int ic0, ic1, ic2;
    844   register JSAMPLE *cptr;       /* pointer into bestcolor[] array */
    845   register histptr cachep;      /* pointer into main cache array */
    846   /* This array lists the candidate colormap indexes. */
    847   JSAMPLE colorlist[MAXNUMCOLORS];
    848   int numcolors;                /* number of candidate colors */
    849   /* This array holds the actually closest colormap index for each cell. */
    850   JSAMPLE bestcolor[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS];
    851 
    852   /* Convert cell coordinates to update box ID */
    853   c0 >>= BOX_C0_LOG;
    854   c1 >>= BOX_C1_LOG;
    855   c2 >>= BOX_C2_LOG;
    856 
    857   /* Compute true coordinates of update box's origin corner.
    858    * Actually we compute the coordinates of the center of the corner
    859    * histogram cell, which are the lower bounds of the volume we care about.
    860    */
    861   minc0 = (c0 << BOX_C0_SHIFT) + ((1 << C0_SHIFT) >> 1);
    862   minc1 = (c1 << BOX_C1_SHIFT) + ((1 << C1_SHIFT) >> 1);
    863   minc2 = (c2 << BOX_C2_SHIFT) + ((1 << C2_SHIFT) >> 1);
    864 
    865   /* Determine which colormap entries are close enough to be candidates
    866    * for the nearest entry to some cell in the update box.
    867    */
    868   numcolors = find_nearby_colors(cinfo, minc0, minc1, minc2, colorlist);
    869 
    870   /* Determine the actually nearest colors. */
    871   find_best_colors(cinfo, minc0, minc1, minc2, numcolors, colorlist,
    872                    bestcolor);
    873 
    874   /* Save the best color numbers (plus 1) in the main cache array */
    875   c0 <<= BOX_C0_LOG;            /* convert ID back to base cell indexes */
    876   c1 <<= BOX_C1_LOG;
    877   c2 <<= BOX_C2_LOG;
    878   cptr = bestcolor;
    879   for (ic0 = 0; ic0 < BOX_C0_ELEMS; ic0++) {
    880     for (ic1 = 0; ic1 < BOX_C1_ELEMS; ic1++) {
    881       cachep = & histogram[c0+ic0][c1+ic1][c2];
    882       for (ic2 = 0; ic2 < BOX_C2_ELEMS; ic2++) {
    883         *cachep++ = (histcell) (GETJSAMPLE(*cptr++) + 1);
    884       }
    885     }
    886   }
    887 }
    888 
    889 
    890 /*
    891  * Map some rows of pixels to the output colormapped representation.
    892  */
    893 
    894 METHODDEF(void)
    895 pass2_no_dither (j_decompress_ptr cinfo,
    896                  JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows)
    897 /* This version performs no dithering */
    898 {
    899   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
    900   hist3d histogram = cquantize->histogram;
    901   register JSAMPROW inptr, outptr;
    902   register histptr cachep;
    903   register int c0, c1, c2;
    904   int row;
    905   JDIMENSION col;
    906   JDIMENSION width = cinfo->output_width;
    907 
    908   for (row = 0; row < num_rows; row++) {
    909     inptr = input_buf[row];
    910     outptr = output_buf[row];
    911     for (col = width; col > 0; col--) {
    912       /* get pixel value and index into the cache */
    913       c0 = GETJSAMPLE(*inptr++) >> C0_SHIFT;
    914       c1 = GETJSAMPLE(*inptr++) >> C1_SHIFT;
    915       c2 = GETJSAMPLE(*inptr++) >> C2_SHIFT;
    916       cachep = & histogram[c0][c1][c2];
    917       /* If we have not seen this color before, find nearest colormap entry */
    918       /* and update the cache */
    919       if (*cachep == 0)
    920         fill_inverse_cmap(cinfo, c0,c1,c2);
    921       /* Now emit the colormap index for this cell */
    922       *outptr++ = (JSAMPLE) (*cachep - 1);
    923     }
    924   }
    925 }
    926 
    927 
    928 METHODDEF(void)
    929 pass2_fs_dither (j_decompress_ptr cinfo,
    930                  JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows)
    931 /* This version performs Floyd-Steinberg dithering */
    932 {
    933   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
    934   hist3d histogram = cquantize->histogram;
    935   register LOCFSERROR cur0, cur1, cur2; /* current error or pixel value */
    936   LOCFSERROR belowerr0, belowerr1, belowerr2; /* error for pixel below cur */
    937   LOCFSERROR bpreverr0, bpreverr1, bpreverr2; /* error for below/prev col */
    938   register FSERRPTR errorptr;   /* => fserrors[] at column before current */
    939   JSAMPROW inptr;               /* => current input pixel */
    940   JSAMPROW outptr;              /* => current output pixel */
    941   histptr cachep;
    942   int dir;                      /* +1 or -1 depending on direction */
    943   int dir3;                     /* 3*dir, for advancing inptr & errorptr */
    944   int row;
    945   JDIMENSION col;
    946   JDIMENSION width = cinfo->output_width;
    947   JSAMPLE *range_limit = cinfo->sample_range_limit;
    948   int *error_limit = cquantize->error_limiter;
    949   JSAMPROW colormap0 = cinfo->colormap[0];
    950   JSAMPROW colormap1 = cinfo->colormap[1];
    951   JSAMPROW colormap2 = cinfo->colormap[2];
    952   SHIFT_TEMPS
    953 
    954   for (row = 0; row < num_rows; row++) {
    955     inptr = input_buf[row];
    956     outptr = output_buf[row];
    957     if (cquantize->on_odd_row) {
    958       /* work right to left in this row */
    959       inptr += (width-1) * 3;   /* so point to rightmost pixel */
    960       outptr += width-1;
    961       dir = -1;
    962       dir3 = -3;
    963       errorptr = cquantize->fserrors + (width+1)*3; /* => entry after last column */
    964       cquantize->on_odd_row = FALSE; /* flip for next time */
    965     } else {
    966       /* work left to right in this row */
    967       dir = 1;
    968       dir3 = 3;
    969       errorptr = cquantize->fserrors; /* => entry before first real column */
    970       cquantize->on_odd_row = TRUE; /* flip for next time */
    971     }
    972     /* Preset error values: no error propagated to first pixel from left */
    973     cur0 = cur1 = cur2 = 0;
    974     /* and no error propagated to row below yet */
    975     belowerr0 = belowerr1 = belowerr2 = 0;
    976     bpreverr0 = bpreverr1 = bpreverr2 = 0;
    977 
    978     for (col = width; col > 0; col--) {
    979       /* curN holds the error propagated from the previous pixel on the
    980        * current line.  Add the error propagated from the previous line
    981        * to form the complete error correction term for this pixel, and
    982        * round the error term (which is expressed * 16) to an integer.
    983        * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct
    984        * for either sign of the error value.
    985        * Note: errorptr points to *previous* column's array entry.
    986        */
    987       cur0 = RIGHT_SHIFT(cur0 + errorptr[dir3+0] + 8, 4);
    988       cur1 = RIGHT_SHIFT(cur1 + errorptr[dir3+1] + 8, 4);
    989       cur2 = RIGHT_SHIFT(cur2 + errorptr[dir3+2] + 8, 4);
    990       /* Limit the error using transfer function set by init_error_limit.
    991        * See comments with init_error_limit for rationale.
    992        */
    993       cur0 = error_limit[cur0];
    994       cur1 = error_limit[cur1];
    995       cur2 = error_limit[cur2];
    996       /* Form pixel value + error, and range-limit to 0..MAXJSAMPLE.
    997        * The maximum error is +- MAXJSAMPLE (or less with error limiting);
    998        * this sets the required size of the range_limit array.
    999        */
   1000       cur0 += GETJSAMPLE(inptr[0]);
   1001       cur1 += GETJSAMPLE(inptr[1]);
   1002       cur2 += GETJSAMPLE(inptr[2]);
   1003       cur0 = GETJSAMPLE(range_limit[cur0]);
   1004       cur1 = GETJSAMPLE(range_limit[cur1]);
   1005       cur2 = GETJSAMPLE(range_limit[cur2]);
   1006       /* Index into the cache with adjusted pixel value */
   1007       cachep = & 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,cur2>>C2_SHIFT);
   1012       /* Now emit the colormap index for this cell */
   1013       { register int pixcode = *cachep - 1;
   1014         *outptr = (JSAMPLE) pixcode;
   1015         /* Compute representation error for this pixel */
   1016         cur0 -= GETJSAMPLE(colormap0[pixcode]);
   1017         cur1 -= GETJSAMPLE(colormap1[pixcode]);
   1018         cur2 -= GETJSAMPLE(colormap2[pixcode]);
   1019       }
   1020       /* Compute error fractions to be propagated to adjacent pixels.
   1021        * Add these into the running sums, and simultaneously shift the
   1022        * next-line error sums left by 1 column.
   1023        */
   1024       { register LOCFSERROR bnexterr;
   1025 
   1026         bnexterr = cur0;        /* Process component 0 */
   1027         errorptr[0] = (FSERROR) (bpreverr0 + cur0 * 3);
   1028         bpreverr0 = belowerr0 + cur0 * 5;
   1029         belowerr0 = bnexterr;
   1030         cur0 *= 7;
   1031         bnexterr = cur1;        /* Process component 1 */
   1032         errorptr[1] = (FSERROR) (bpreverr1 + cur1 * 3);
   1033         bpreverr1 = belowerr1 + cur1 * 5;
   1034         belowerr1 = bnexterr;
   1035         cur1 *= 7;
   1036         bnexterr = cur2;        /* Process component 2 */
   1037         errorptr[2] = (FSERROR) (bpreverr2 + cur2 * 3);
   1038         bpreverr2 = belowerr2 + cur2 * 5;
   1039         belowerr2 = bnexterr;
   1040         cur2 *= 7;
   1041       }
   1042       /* At this point curN contains the 7/16 error value to be propagated
   1043        * to the next pixel on the current line, and all the errors for the
   1044        * next line have been shifted over.  We are therefore ready to move on.
   1045        */
   1046       inptr += dir3;            /* Advance pixel pointers to next column */
   1047       outptr += dir;
   1048       errorptr += dir3;         /* advance errorptr to current column */
   1049     }
   1050     /* Post-loop cleanup: we must unload the final error values into the
   1051      * final fserrors[] entry.  Note we need not unload belowerrN because
   1052      * it is for the dummy column before or after the actual array.
   1053      */
   1054     errorptr[0] = (FSERROR) bpreverr0; /* unload prev errs into array */
   1055     errorptr[1] = (FSERROR) bpreverr1;
   1056     errorptr[2] = (FSERROR) bpreverr2;
   1057   }
   1058 }
   1059 
   1060 
   1061 /*
   1062  * Initialize the error-limiting transfer function (lookup table).
   1063  * The raw F-S error computation can potentially compute error values of up to
   1064  * +- MAXJSAMPLE.  But we want the maximum correction applied to a pixel to be
   1065  * much less, otherwise obviously wrong pixels will be created.  (Typical
   1066  * effects include weird fringes at color-area boundaries, isolated bright
   1067  * pixels in a dark area, etc.)  The standard advice for avoiding this problem
   1068  * is to ensure that the "corners" of the color cube are allocated as output
   1069  * colors; then repeated errors in the same direction cannot cause cascading
   1070  * error buildup.  However, that only prevents the error from getting
   1071  * completely out of hand; Aaron Giles reports that error limiting improves
   1072  * the results even with corner colors allocated.
   1073  * A simple clamping of the error values to about +- MAXJSAMPLE/8 works pretty
   1074  * well, but the smoother transfer function used below is even better.  Thanks
   1075  * to Aaron Giles for this idea.
   1076  */
   1077 
   1078 LOCAL(void)
   1079 init_error_limit (j_decompress_ptr cinfo)
   1080 /* Allocate and fill in the error_limiter table */
   1081 {
   1082   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
   1083   int *table;
   1084   int in, out;
   1085 
   1086   table = (int *) (*cinfo->mem->alloc_small)
   1087     ((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE*2+1) * sizeof(int));
   1088   table += MAXJSAMPLE;          /* so can index -MAXJSAMPLE .. +MAXJSAMPLE */
   1089   cquantize->error_limiter = table;
   1090 
   1091 #define STEPSIZE ((MAXJSAMPLE+1)/16)
   1092   /* Map errors 1:1 up to +- MAXJSAMPLE/16 */
   1093   out = 0;
   1094   for (in = 0; in < STEPSIZE; in++, out++) {
   1095     table[in] = out; table[-in] = -out;
   1096   }
   1097   /* Map errors 1:2 up to +- 3*MAXJSAMPLE/16 */
   1098   for (; in < STEPSIZE*3; in++, out += (in&1) ? 0 : 1) {
   1099     table[in] = out; table[-in] = -out;
   1100   }
   1101   /* Clamp the rest to final out value (which is (MAXJSAMPLE+1)/8) */
   1102   for (; in <= MAXJSAMPLE; in++) {
   1103     table[in] = out; table[-in] = -out;
   1104   }
   1105 #undef STEPSIZE
   1106 }
   1107 
   1108 
   1109 /*
   1110  * Finish up at the end of each pass.
   1111  */
   1112 
   1113 METHODDEF(void)
   1114 finish_pass1 (j_decompress_ptr cinfo)
   1115 {
   1116   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
   1117 
   1118   /* Select the representative colors and fill in cinfo->colormap */
   1119   cinfo->colormap = cquantize->sv_colormap;
   1120   select_colors(cinfo, cquantize->desired);
   1121   /* Force next pass to zero the color index table */
   1122   cquantize->needs_zeroed = TRUE;
   1123 }
   1124 
   1125 
   1126 METHODDEF(void)
   1127 finish_pass2 (j_decompress_ptr cinfo)
   1128 {
   1129   /* no work */
   1130 }
   1131 
   1132 
   1133 /*
   1134  * Initialize for each processing pass.
   1135  */
   1136 
   1137 METHODDEF(void)
   1138 start_pass_2_quant (j_decompress_ptr cinfo, boolean is_pre_scan)
   1139 {
   1140   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
   1141   hist3d histogram = cquantize->histogram;
   1142   int i;
   1143 
   1144   /* Only F-S dithering or no dithering is supported. */
   1145   /* If user asks for ordered dither, give him F-S. */
   1146   if (cinfo->dither_mode != JDITHER_NONE)
   1147     cinfo->dither_mode = JDITHER_FS;
   1148 
   1149   if (is_pre_scan) {
   1150     /* Set up method pointers */
   1151     cquantize->pub.color_quantize = prescan_quantize;
   1152     cquantize->pub.finish_pass = finish_pass1;
   1153     cquantize->needs_zeroed = TRUE; /* Always zero histogram */
   1154   } else {
   1155     /* Set up method pointers */
   1156     if (cinfo->dither_mode == JDITHER_FS)
   1157       cquantize->pub.color_quantize = pass2_fs_dither;
   1158     else
   1159       cquantize->pub.color_quantize = pass2_no_dither;
   1160     cquantize->pub.finish_pass = finish_pass2;
   1161 
   1162     /* Make sure color count is acceptable */
   1163     i = cinfo->actual_number_of_colors;
   1164     if (i < 1)
   1165       ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 1);
   1166     if (i > MAXNUMCOLORS)
   1167       ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS);
   1168 
   1169     if (cinfo->dither_mode == JDITHER_FS) {
   1170       size_t arraysize = (size_t) ((cinfo->output_width + 2) *
   1171                                    (3 * sizeof(FSERROR)));
   1172       /* Allocate Floyd-Steinberg workspace if we didn't already. */
   1173       if (cquantize->fserrors == NULL)
   1174         cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large)
   1175           ((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize);
   1176       /* Initialize the propagated errors to zero. */
   1177       jzero_far((void *) cquantize->fserrors, arraysize);
   1178       /* Make the error-limit table if we didn't already. */
   1179       if (cquantize->error_limiter == NULL)
   1180         init_error_limit(cinfo);
   1181       cquantize->on_odd_row = FALSE;
   1182     }
   1183 
   1184   }
   1185   /* Zero the histogram or inverse color map, if necessary */
   1186   if (cquantize->needs_zeroed) {
   1187     for (i = 0; i < HIST_C0_ELEMS; i++) {
   1188       jzero_far((void *) histogram[i],
   1189                 HIST_C1_ELEMS*HIST_C2_ELEMS * sizeof(histcell));
   1190     }
   1191     cquantize->needs_zeroed = FALSE;
   1192   }
   1193 }
   1194 
   1195 
   1196 /*
   1197  * Switch to a new external colormap between output passes.
   1198  */
   1199 
   1200 METHODDEF(void)
   1201 new_color_map_2_quant (j_decompress_ptr cinfo)
   1202 {
   1203   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
   1204 
   1205   /* Reset the inverse color map */
   1206   cquantize->needs_zeroed = TRUE;
   1207 }
   1208 
   1209 
   1210 /*
   1211  * Module initialization routine for 2-pass color quantization.
   1212  */
   1213 
   1214 GLOBAL(void)
   1215 jinit_2pass_quantizer (j_decompress_ptr cinfo)
   1216 {
   1217   my_cquantize_ptr cquantize;
   1218   int i;
   1219 
   1220   cquantize = (my_cquantize_ptr)
   1221     (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
   1222                                 sizeof(my_cquantizer));
   1223   cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize;
   1224   cquantize->pub.start_pass = start_pass_2_quant;
   1225   cquantize->pub.new_color_map = new_color_map_2_quant;
   1226   cquantize->fserrors = NULL;   /* flag optional arrays not allocated */
   1227   cquantize->error_limiter = NULL;
   1228 
   1229   /* Make sure jdmaster didn't give me a case I can't handle */
   1230   if (cinfo->out_color_components != 3)
   1231     ERREXIT(cinfo, JERR_NOTIMPL);
   1232 
   1233   /* Allocate the histogram/inverse colormap storage */
   1234   cquantize->histogram = (hist3d) (*cinfo->mem->alloc_small)
   1235     ((j_common_ptr) cinfo, JPOOL_IMAGE, HIST_C0_ELEMS * sizeof(hist2d));
   1236   for (i = 0; i < HIST_C0_ELEMS; i++) {
   1237     cquantize->histogram[i] = (hist2d) (*cinfo->mem->alloc_large)
   1238       ((j_common_ptr) cinfo, JPOOL_IMAGE,
   1239        HIST_C1_ELEMS*HIST_C2_ELEMS * sizeof(histcell));
   1240   }
   1241   cquantize->needs_zeroed = TRUE; /* histogram is garbage now */
   1242 
   1243   /* Allocate storage for the completed colormap, if required.
   1244    * We do this now since it may affect the memory manager's space
   1245    * calculations.
   1246    */
   1247   if (cinfo->enable_2pass_quant) {
   1248     /* Make sure color count is acceptable */
   1249     int desired = cinfo->desired_number_of_colors;
   1250     /* Lower bound on # of colors ... somewhat arbitrary as long as > 0 */
   1251     if (desired < 8)
   1252       ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 8);
   1253     /* Make sure colormap indexes can be represented by JSAMPLEs */
   1254     if (desired > MAXNUMCOLORS)
   1255       ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS);
   1256     cquantize->sv_colormap = (*cinfo->mem->alloc_sarray)
   1257       ((j_common_ptr) cinfo,JPOOL_IMAGE, (JDIMENSION) desired, (JDIMENSION) 3);
   1258     cquantize->desired = desired;
   1259   } else
   1260     cquantize->sv_colormap = NULL;
   1261 
   1262   /* Only F-S dithering or no dithering is supported. */
   1263   /* If user asks for ordered dither, give him F-S. */
   1264   if (cinfo->dither_mode != JDITHER_NONE)
   1265     cinfo->dither_mode = JDITHER_FS;
   1266 
   1267   /* Allocate Floyd-Steinberg workspace if necessary.
   1268    * This isn't really needed until pass 2, but again it may affect the memory
   1269    * manager's space calculations.  Although we will cope with a later change
   1270    * in dither_mode, we do not promise to honor max_memory_to_use if
   1271    * dither_mode changes.
   1272    */
   1273   if (cinfo->dither_mode == JDITHER_FS) {
   1274     cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large)
   1275       ((j_common_ptr) cinfo, JPOOL_IMAGE,
   1276        (size_t) ((cinfo->output_width + 2) * (3 * sizeof(FSERROR))));
   1277     /* Might as well create the error-limiting table too. */
   1278     init_error_limit(cinfo);
   1279   }
   1280 }
   1281 
   1282 #endif /* QUANT_2PASS_SUPPORTED */
   1283