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