tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

jquant1.c (32887B)


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