The Independent JPEG Group's JPEG software v5a

This commit is contained in:
Thomas G. Lane
1994-12-07 00:00:00 +00:00
committed by DRC
parent 36a4ccccd3
commit 9ba2f5ed36
37 changed files with 1734 additions and 1032 deletions

118
jquant1.c
View File

@@ -52,7 +52,7 @@
/* Declarations for ordered dithering.
*
* We use a standard 4x4 ordered dither array. The basic concept of ordered
* We use a standard 16x16 ordered dither array. The basic concept of ordered
* dithering is described in many references, for instance Dale Schumacher's
* chapter II.2 of Graphics Gems II (James Arvo, ed. Academic Press, 1991).
* In place of Schumacher's comparisons against a "threshold" value, we add a
@@ -68,11 +68,36 @@
* table in both directions.
*/
#define ODITHER_SIZE 4 /* dimension of dither matrix */
#define ODITHER_CELLS (4*4) /* number of cells in dither matrix */
#define ODITHER_MASK 3 /* mask for wrapping around dither counters */
#define ODITHER_SIZE 16 /* dimension of dither matrix */
/* NB: if ODITHER_SIZE is not a power of 2, ODITHER_MASK uses will break */
#define ODITHER_CELLS (ODITHER_SIZE*ODITHER_SIZE) /* # cells in matrix */
#define ODITHER_MASK (ODITHER_SIZE-1) /* mask for wrapping around counters */
typedef int ODITHER_MATRIX[ODITHER_SIZE][ODITHER_SIZE];
typedef int (*ODITHER_MATRIX_PTR)[ODITHER_SIZE];
static const UINT8 base_dither_matrix[ODITHER_SIZE][ODITHER_SIZE] = {
/* Bayer's order-4 dither array. Generated by the code given in
* Stephen Hawley's article "Ordered Dithering" in Graphics Gems I.
* The values in this array must range from 0 to ODITHER_CELLS-1.
*/
0,192, 48,240, 12,204, 60,252, 3,195, 51,243, 15,207, 63,255,
128, 64,176,112,140, 76,188,124,131, 67,179,115,143, 79,191,127,
32,224, 16,208, 44,236, 28,220, 35,227, 19,211, 47,239, 31,223,
160, 96,144, 80,172,108,156, 92,163, 99,147, 83,175,111,159, 95,
8,200, 56,248, 4,196, 52,244, 11,203, 59,251, 7,199, 55,247,
136, 72,184,120,132, 68,180,116,139, 75,187,123,135, 71,183,119,
40,232, 24,216, 36,228, 20,212, 43,235, 27,219, 39,231, 23,215,
168,104,152, 88,164,100,148, 84,171,107,155, 91,167,103,151, 87,
2,194, 50,242, 14,206, 62,254, 1,193, 49,241, 13,205, 61,253,
130, 66,178,114,142, 78,190,126,129, 65,177,113,141, 77,189,125,
34,226, 18,210, 46,238, 30,222, 33,225, 17,209, 45,237, 29,221,
162, 98,146, 82,174,110,158, 94,161, 97,145, 81,173,109,157, 93,
10,202, 58,250, 6,198, 54,246, 9,201, 57,249, 5,197, 53,245,
138, 74,186,122,134, 70,182,118,137, 73,185,121,133, 69,181,117,
42,234, 26,218, 38,230, 22,214, 41,233, 25,217, 37,229, 21,213,
170,106,154, 90,166,102,150, 86,169,105,153, 89,165,101,149, 85
};
/* Declarations for Floyd-Steinberg dithering.
@@ -125,7 +150,7 @@ typedef struct {
/* Variables for ordered dithering */
int row_index; /* cur row's vertical index in dither matrix */
ODITHER_MATRIX *odither; /* one dither array per component */
ODITHER_MATRIX_PTR odither[MAX_Q_COMPS]; /* one dither array per component */
/* Variables for Floyd-Steinberg dithering */
FSERRPTR fserrors[MAX_Q_COMPS]; /* accumulated errors */
@@ -226,6 +251,41 @@ largest_input_value (j_decompress_ptr cinfo, int ci, int j, int maxj)
}
/*
* Create an ordered-dither array for a component having ncolors
* distinct output values.
*/
LOCAL ODITHER_MATRIX_PTR
make_odither_array (j_decompress_ptr cinfo, int ncolors)
{
ODITHER_MATRIX_PTR odither;
int j,k;
INT32 num,den;
odither = (ODITHER_MATRIX_PTR)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(ODITHER_MATRIX));
/* The inter-value distance for this color is MAXJSAMPLE/(ncolors-1).
* Hence the dither value for the matrix cell with fill order f
* (f=0..N-1) should be (N-1-2*f)/(2*N) * MAXJSAMPLE/(ncolors-1).
* On 16-bit-int machine, be careful to avoid overflow.
*/
den = 2 * ODITHER_CELLS * ((INT32) (ncolors - 1));
for (j = 0; j < ODITHER_SIZE; j++) {
for (k = 0; k < ODITHER_SIZE; k++) {
num = ((INT32) (ODITHER_CELLS-1 - 2*((int)base_dither_matrix[j][k])))
* MAXJSAMPLE;
/* Ensure round towards zero despite C's lack of consistency
* about rounding negative values in integer division...
*/
odither[j][k] = (int) (num<0 ? -((-num)/den) : num/den);
}
}
return odither;
}
/*
* Create the colormap and color index table.
* Also creates the ordered-dither tables, if required.
@@ -239,7 +299,7 @@ create_colormap (j_decompress_ptr cinfo)
JSAMPROW indexptr;
int total_colors; /* Number of distinct output colors */
int Ncolors[MAX_Q_COMPS]; /* # of values alloced to each component */
ODITHER_MATRIX *odither;
ODITHER_MATRIX_PTR odither;
int i,j,k, nci, blksize, blkdist, ptr, val, pad;
/* Select number of colors for each component */
@@ -319,41 +379,21 @@ create_colormap (j_decompress_ptr cinfo)
cinfo->actual_number_of_colors = total_colors;
if (cinfo->dither_mode == JDITHER_ORDERED) {
/* Allocate and fill in the ordered-dither tables. */
odither = (ODITHER_MATRIX *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
cinfo->out_color_components * SIZEOF(ODITHER_MATRIX));
cquantize->odither = odither;
/* Allocate and fill in the ordered-dither tables. Components having
* the same number of representative colors may share a dither table.
*/
for (i = 0; i < cinfo->out_color_components; i++) {
nci = Ncolors[i]; /* # of distinct values for this color */
/* The inter-value distance for this color is MAXJSAMPLE/(nci-1).
* Hence the dither value for the matrix cell with fill order j
* (j=1..N) should be (N+1-2*j)/(2*(N+1)) * MAXJSAMPLE/(nci-1).
*/
val = 2 * (ODITHER_CELLS + 1) * (nci - 1); /* denominator */
/* Macro is coded to ensure round towards zero despite C's
* lack of consistency in integer division...
*/
#define ODITHER_DIV(num,den) ((num)<0 ? -((-(num))/(den)) : (num)/(den))
#define ODITHER_VAL(j) ODITHER_DIV((ODITHER_CELLS+1-2*j)*MAXJSAMPLE, val)
/* Traditional fill order for 4x4 dither; see Schumacher's figure 4. */
odither[0][0][0] = ODITHER_VAL(1);
odither[0][0][1] = ODITHER_VAL(9);
odither[0][0][2] = ODITHER_VAL(3);
odither[0][0][3] = ODITHER_VAL(11);
odither[0][1][0] = ODITHER_VAL(13);
odither[0][1][1] = ODITHER_VAL(5);
odither[0][1][2] = ODITHER_VAL(15);
odither[0][1][3] = ODITHER_VAL(7);
odither[0][2][0] = ODITHER_VAL(4);
odither[0][2][1] = ODITHER_VAL(12);
odither[0][2][2] = ODITHER_VAL(2);
odither[0][2][3] = ODITHER_VAL(10);
odither[0][3][0] = ODITHER_VAL(16);
odither[0][3][1] = ODITHER_VAL(8);
odither[0][3][2] = ODITHER_VAL(14);
odither[0][3][3] = ODITHER_VAL(6);
odither++; /* advance to next matrix */
odither = NULL; /* search for matching prior component */
for (j = 0; j < i; j++) {
if (nci == Ncolors[j]) {
odither = cquantize->odither[j];
break;
}
}
if (odither == NULL) /* need a new table? */
odither = make_odither_array(cinfo, nci);
cquantize->odither[i] = odither;
}
}
}