170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * jdcolor.c
370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Copyright (C) 1991-1997, Thomas G. Lane.
570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file is part of the Independent JPEG Group's software.
670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * For conditions of distribution and use, see the accompanying README file.
770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file contains output colorspace conversion routines.
970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
1070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
1170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define JPEG_INTERNALS
1270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "jinclude.h"
1370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "jpeglib.h"
1470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
1570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
1670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Private subobject */
1770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
1870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef struct {
1970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  struct jpeg_color_deconverter pub; /* public fields */
2070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
2170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Private state for YCC->RGB conversion */
2270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int * Cr_r_tab;		/* => table for Cr to R conversion */
2370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int * Cb_b_tab;		/* => table for Cb to B conversion */
2470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  INT32 * Cr_g_tab;		/* => table for Cr to G conversion */
2570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  INT32 * Cb_g_tab;		/* => table for Cb to G conversion */
2670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} my_color_deconverter;
2770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
2870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef my_color_deconverter * my_cconvert_ptr;
2970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
3070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
3170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_RGB
3270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
3370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Declarations for ordered dithering.
3470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
3570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * We use 4x4 ordered dither array packed into 32 bits. This array is
3670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * sufficent for dithering RGB_888 to RGB_565.
3770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
3870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
3970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define DITHER_MASK         0x3
4070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define DITHER_ROTATE(x)    (((x)<<24) | (((x)>>8)&0x00FFFFFF))
4170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinestatic const INT32 dither_matrix[4] = {
4270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  0x0008020A,
4370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  0x0C040E06,
4470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  0x030B0109,
4570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  0x0F070D05
4670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine};
4770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
4870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
4970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
5070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
5170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/**************** YCbCr -> RGB conversion: most common case **************/
5270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
5370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
5470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * YCbCr is defined per CCIR 601-1, except that Cb and Cr are
5570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
5670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The conversion equations to be implemented are therefore
5770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *	R = Y                + 1.40200 * Cr
5870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *	G = Y - 0.34414 * Cb - 0.71414 * Cr
5970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *	B = Y + 1.77200 * Cb
6070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * where Cb and Cr represent the incoming values less CENTERJSAMPLE.
6170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
6270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
6370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * To avoid floating-point arithmetic, we represent the fractional constants
6470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * as integers scaled up by 2^16 (about 4 digits precision); we have to divide
6570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * the products by 2^16, with appropriate rounding, to get the correct answer.
6670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Notice that Y, being an integral input, does not contribute any fraction
6770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * so it need not participate in the rounding.
6870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
6970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * For even more speed, we avoid doing any multiplications in the inner loop
7070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * by precalculating the constants times Cb and Cr for all possible values.
7170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
7270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * for 12-bit samples it is still acceptable.  It's not very reasonable for
7370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 16-bit samples, but if you want lossless storage you shouldn't be changing
7470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * colorspace anyway.
7570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The Cr=>R and Cb=>B values can be rounded to integers in advance; the
7670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * values for the G calculation are left scaled up, since we must add them
7770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * together before rounding.
7870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
7970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
8070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define SCALEBITS	16	/* speediest right-shift on some machines */
8170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define ONE_HALF	((INT32) 1 << (SCALEBITS-1))
8270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define FIX(x)		((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
8370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
8470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
8570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
8670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Initialize tables for YCC->RGB colorspace conversion.
8770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
8870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
8970a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(void)
9070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinebuild_ycc_rgb_table (j_decompress_ptr cinfo)
9170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
9270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
9370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int i;
9470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  INT32 x;
9570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  SHIFT_TEMPS
9670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
9770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cconvert->Cr_r_tab = (int *)
9870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
9970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine                                (MAXJSAMPLE+1) * SIZEOF(int));
10070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cconvert->Cb_b_tab = (int *)
10170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
10270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine                                (MAXJSAMPLE+1) * SIZEOF(int));
10370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cconvert->Cr_g_tab = (INT32 *)
10470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
10570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine                                (MAXJSAMPLE+1) * SIZEOF(INT32));
10670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cconvert->Cb_g_tab = (INT32 *)
10770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
10870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine                                (MAXJSAMPLE+1) * SIZEOF(INT32));
10970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
11070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
11170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
11270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
11370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Cr=>R value is nearest int to 1.40200 * x */
11470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cconvert->Cr_r_tab[i] = (int)
11570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine                    RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);
11670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Cb=>B value is nearest int to 1.77200 * x */
11770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cconvert->Cb_b_tab[i] = (int)
11870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine                    RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);
11970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Cr=>G value is scaled-up -0.71414 * x */
12070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cconvert->Cr_g_tab[i] = (- FIX(0.71414)) * x;
12170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Cb=>G value is scaled-up -0.34414 * x */
12270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* We also add in ONE_HALF so that need not do it in inner loop */
12370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cconvert->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;
12470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
12570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
12670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
12770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
12870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Convert some rows of samples to the output colorspace.
12970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
13070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Note that we change from noninterleaved, one-plane-per-component format
13170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * to interleaved-pixel format.  The output buffer is therefore three times
13270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * as wide as the input buffer.
13370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * A starting row offset is provided only for the input buffer.  The caller
13470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * can easily adjust the passed output_buf value to accommodate any row
13570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * offset required on that side.
13670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
13770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
13870a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
13970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineycc_rgb_convert (j_decompress_ptr cinfo,
14070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		 JSAMPIMAGE input_buf, JDIMENSION input_row,
14170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		 JSAMPARRAY output_buf, int num_rows)
14270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
14370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
14470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int y, cb, cr;
14570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW outptr;
14670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW inptr0, inptr1, inptr2;
14770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JDIMENSION col;
14870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JDIMENSION num_cols = cinfo->output_width;
14970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* copy these pointers into registers if possible */
15070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPLE * range_limit = cinfo->sample_range_limit;
15170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int * Crrtab = cconvert->Cr_r_tab;
15270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int * Cbbtab = cconvert->Cb_b_tab;
15370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register INT32 * Crgtab = cconvert->Cr_g_tab;
15470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register INT32 * Cbgtab = cconvert->Cb_g_tab;
15570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  SHIFT_TEMPS
15670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
15770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  while (--num_rows >= 0) {
15870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr0 = input_buf[0][input_row];
15970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr1 = input_buf[1][input_row];
16070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr2 = input_buf[2][input_row];
16170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    input_row++;
16270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    outptr = *output_buf++;
16370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    for (col = 0; col < num_cols; col++) {
16470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      y  = GETJSAMPLE(inptr0[col]);
16570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cb = GETJSAMPLE(inptr1[col]);
16670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cr = GETJSAMPLE(inptr2[col]);
16770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Range-limiting is essential due to noise introduced by DCT losses. */
16870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr[RGB_RED] =   range_limit[y + Crrtab[cr]];
16970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr[RGB_GREEN] = range_limit[y +
17070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine                              ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
17170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine                                                 SCALEBITS))];
17270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr[RGB_BLUE] =  range_limit[y + Cbbtab[cb]];
17370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr += RGB_PIXELSIZE;
17470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
17570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
17670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
17770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
17870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_RGB
17970a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
18070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineycc_rgba_8888_convert (j_decompress_ptr cinfo,
18170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine         JSAMPIMAGE input_buf, JDIMENSION input_row,
18270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine         JSAMPARRAY output_buf, int num_rows)
18370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
18470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
18570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int y, cb, cr;
18670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW outptr;
18770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW inptr0, inptr1, inptr2;
18870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JDIMENSION col;
18970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JDIMENSION num_cols = cinfo->output_width;
19070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* copy these pointers into registers if possible */
19170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPLE * range_limit = cinfo->sample_range_limit;
19270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int * Crrtab = cconvert->Cr_r_tab;
19370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int * Cbbtab = cconvert->Cb_b_tab;
19470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register INT32 * Crgtab = cconvert->Cr_g_tab;
19570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register INT32 * Cbgtab = cconvert->Cb_g_tab;
19670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  SHIFT_TEMPS
19770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
19870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  while (--num_rows >= 0) {
19970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr0 = input_buf[0][input_row];
20070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr1 = input_buf[1][input_row];
20170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr2 = input_buf[2][input_row];
20270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    input_row++;
20370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    outptr = *output_buf++;
20470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    for (col = 0; col < num_cols; col++) {
20570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      y  = GETJSAMPLE(inptr0[col]);
20670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cb = GETJSAMPLE(inptr1[col]);
20770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cr = GETJSAMPLE(inptr2[col]);
20870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Range-limiting is essential due to noise introduced by DCT losses. */
20970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr[RGB_RED] =   range_limit[y + Crrtab[cr]];
21070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr[RGB_GREEN] = range_limit[y +
21170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine                              ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
21270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine                                                 SCALEBITS))];
21370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr[RGB_BLUE] =  range_limit[y + Cbbtab[cb]];
21470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr[RGB_ALPHA] =  0xFF;
21570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr += 4;
21670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
21770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
21870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
21970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
22070a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
22170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineycc_rgb_565_convert (j_decompress_ptr cinfo,
22270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine         JSAMPIMAGE input_buf, JDIMENSION input_row,
22370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine         JSAMPARRAY output_buf, int num_rows)
22470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
22570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
22670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int y, cb, cr;
22770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW outptr;
22870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW inptr0, inptr1, inptr2;
22970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JDIMENSION col;
23070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JDIMENSION num_cols = cinfo->output_width;
23170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* copy these pointers into registers if possible */
23270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPLE * range_limit = cinfo->sample_range_limit;
23370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int * Crrtab = cconvert->Cr_r_tab;
23470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int * Cbbtab = cconvert->Cb_b_tab;
23570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register INT32 * Crgtab = cconvert->Cr_g_tab;
23670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register INT32 * Cbgtab = cconvert->Cb_g_tab;
23770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  SHIFT_TEMPS
23870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
23970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  while (--num_rows >= 0) {
24070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    INT32 rgb;
24170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    unsigned int r, g, b;
24270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr0 = input_buf[0][input_row];
24370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr1 = input_buf[1][input_row];
24470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr2 = input_buf[2][input_row];
24570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    input_row++;
24670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    outptr = *output_buf++;
24770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
24870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (PACK_NEED_ALIGNMENT(outptr)) {
24970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        y  = GETJSAMPLE(*inptr0++);
25070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        cb = GETJSAMPLE(*inptr1++);
25170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        cr = GETJSAMPLE(*inptr2++);
25270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        r = range_limit[y + Crrtab[cr]];
25370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb]+Crgtab[cr], SCALEBITS))];
25470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        b = range_limit[y + Cbbtab[cb]];
25570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        rgb = PACK_SHORT_565(r,g,b);
25670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        *(INT16*)outptr = rgb;
25770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        outptr += 2;
25870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        num_cols--;
25970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
26070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    for (col = 0; col < (num_cols>>1); col++) {
26170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      y  = GETJSAMPLE(*inptr0++);
26270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cb = GETJSAMPLE(*inptr1++);
26370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cr = GETJSAMPLE(*inptr2++);
26470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      r = range_limit[y + Crrtab[cr]];
26570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb]+Crgtab[cr], SCALEBITS))];
26670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      b = range_limit[y + Cbbtab[cb]];
26770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      rgb = PACK_SHORT_565(r,g,b);
26870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
26970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      y  = GETJSAMPLE(*inptr0++);
27070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cb = GETJSAMPLE(*inptr1++);
27170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cr = GETJSAMPLE(*inptr2++);
27270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      r = range_limit[y + Crrtab[cr]];
27370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb]+Crgtab[cr], SCALEBITS))];
27470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      b = range_limit[y + Cbbtab[cb]];
27570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r,g,b));
27670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);
27770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr += 4;
27870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
27970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (num_cols&1) {
28070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      y  = GETJSAMPLE(*inptr0);
28170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cb = GETJSAMPLE(*inptr1);
28270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cr = GETJSAMPLE(*inptr2);
28370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      r = range_limit[y + Crrtab[cr]];
28470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb]+Crgtab[cr], SCALEBITS))];
28570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      b = range_limit[y + Cbbtab[cb]];
28670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      rgb = PACK_SHORT_565(r,g,b);
28770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      *(INT16*)outptr = rgb;
28870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
28970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
29070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
29170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
29270a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
29370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineycc_rgb_565D_convert (j_decompress_ptr cinfo,
29470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine         JSAMPIMAGE input_buf, JDIMENSION input_row,
29570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine         JSAMPARRAY output_buf, int num_rows)
29670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
29770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
29870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int y, cb, cr;
29970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW outptr;
30070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW inptr0, inptr1, inptr2;
30170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JDIMENSION col;
30270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JDIMENSION num_cols = cinfo->output_width;
30370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* copy these pointers into registers if possible */
30470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPLE * range_limit = cinfo->sample_range_limit;
30570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int * Crrtab = cconvert->Cr_r_tab;
30670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int * Cbbtab = cconvert->Cb_b_tab;
30770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register INT32 * Crgtab = cconvert->Cr_g_tab;
30870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register INT32 * Cbgtab = cconvert->Cb_g_tab;
30970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  INT32 d0 = dither_matrix[cinfo->output_scanline & DITHER_MASK];
31070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  SHIFT_TEMPS
31170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
31270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  while (--num_rows >= 0) {
31370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    INT32 rgb;
31470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    unsigned int r, g, b;
31570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr0 = input_buf[0][input_row];
31670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr1 = input_buf[1][input_row];
31770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr2 = input_buf[2][input_row];
31870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    input_row++;
31970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    outptr = *output_buf++;
32070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (PACK_NEED_ALIGNMENT(outptr)) {
32170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        y  = GETJSAMPLE(*inptr0++);
32270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        cb = GETJSAMPLE(*inptr1++);
32370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        cr = GETJSAMPLE(*inptr2++);
32470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];
32570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        g = range_limit[DITHER_565_G(y + ((int)RIGHT_SHIFT(Cbgtab[cb]+Crgtab[cr], SCALEBITS)), d0)];
32670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        b = range_limit[DITHER_565_B(y + Cbbtab[cb], d0)];
32770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        rgb = PACK_SHORT_565(r,g,b);
32870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        *(INT16*)outptr = rgb;
32970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        outptr += 2;
33070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        num_cols--;
33170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
33270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    for (col = 0; col < (num_cols>>1); col++) {
33370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      y  = GETJSAMPLE(*inptr0++);
33470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cb = GETJSAMPLE(*inptr1++);
33570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cr = GETJSAMPLE(*inptr2++);
33670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];
33770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = range_limit[DITHER_565_G(y + ((int)RIGHT_SHIFT(Cbgtab[cb]+Crgtab[cr], SCALEBITS)), d0)];
33870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      b = range_limit[DITHER_565_B(y + Cbbtab[cb], d0)];
33970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      d0 = DITHER_ROTATE(d0);
34070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      rgb = PACK_SHORT_565(r,g,b);
34170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      y  = GETJSAMPLE(*inptr0++);
34270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cb = GETJSAMPLE(*inptr1++);
34370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cr = GETJSAMPLE(*inptr2++);
34470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];
34570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = range_limit[DITHER_565_G(y + ((int)RIGHT_SHIFT(Cbgtab[cb]+Crgtab[cr], SCALEBITS)), d0)];
34670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      b = range_limit[DITHER_565_B(y + Cbbtab[cb], d0)];
34770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      d0 = DITHER_ROTATE(d0);
34870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r,g,b));
34970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);
35070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr += 4;
35170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
35270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (num_cols&1) {
35370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      y  = GETJSAMPLE(*inptr0);
35470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cb = GETJSAMPLE(*inptr1);
35570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cr = GETJSAMPLE(*inptr2);
35670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];
35770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = range_limit[DITHER_565_G(y + ((int)RIGHT_SHIFT(Cbgtab[cb]+Crgtab[cr], SCALEBITS)), d0)];
35870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      b = range_limit[DITHER_565_B(y + Cbbtab[cb], d0)];
35970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      rgb = PACK_SHORT_565(r,g,b);
36070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      *(INT16*)outptr = rgb;
36170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
36270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
36370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
36470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
36570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
36670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
36770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/**************** Cases other than YCbCr -> RGB(A) **************/
36870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
36970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_RGB
37070a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
37170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinergb_rgba_8888_convert (j_decompress_ptr cinfo,
37270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine         JSAMPIMAGE input_buf, JDIMENSION input_row,
37370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine         JSAMPARRAY output_buf, int num_rows)
37470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
37570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW outptr;
37670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW inptr0, inptr1, inptr2;
37770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JDIMENSION col;
37870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JDIMENSION num_cols = cinfo->output_width;
37970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  SHIFT_TEMPS
38070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
38170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  while (--num_rows >= 0) {
38270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr0 = input_buf[0][input_row];
38370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr1 = input_buf[1][input_row];
38470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr2 = input_buf[2][input_row];
38570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    input_row++;
38670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    outptr = *output_buf++;
38770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    for (col = 0; col < num_cols; col++) {
38870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      *outptr++ = *inptr0++;
38970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      *outptr++ = *inptr1++;
39070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      *outptr++ = *inptr2++;
39170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      *outptr++ = 0xFF;
39270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
39370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
39470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
39570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
39670a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
39770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinergb_rgb_565_convert (j_decompress_ptr cinfo,
39870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine         JSAMPIMAGE input_buf, JDIMENSION input_row,
39970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine         JSAMPARRAY output_buf, int num_rows)
40070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
40170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW outptr;
40270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW inptr0, inptr1, inptr2;
40370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JDIMENSION col;
40470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JDIMENSION num_cols = cinfo->output_width;
40570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  SHIFT_TEMPS
40670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
40770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  while (--num_rows >= 0) {
40870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    INT32 rgb;
40970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    unsigned int r, g, b;
41070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr0 = input_buf[0][input_row];
41170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr1 = input_buf[1][input_row];
41270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr2 = input_buf[2][input_row];
41370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    input_row++;
41470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    outptr = *output_buf++;
41570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (PACK_NEED_ALIGNMENT(outptr)) {
41670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        r = GETJSAMPLE(*inptr0++);
41770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        g = GETJSAMPLE(*inptr1++);
41870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        b = GETJSAMPLE(*inptr2++);
41970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        rgb = PACK_SHORT_565(r,g,b);
42070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        *(INT16*)outptr = rgb;
42170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        outptr += 2;
42270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        num_cols--;
42370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
42470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    for (col = 0; col < (num_cols>>1); col++) {
42570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      r = GETJSAMPLE(*inptr0++);
42670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = GETJSAMPLE(*inptr1++);
42770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      b = GETJSAMPLE(*inptr2++);
42870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      rgb = PACK_SHORT_565(r,g,b);
42970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      r = GETJSAMPLE(*inptr0++);
43070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = GETJSAMPLE(*inptr1++);
43170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      b = GETJSAMPLE(*inptr2++);
43270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r,g,b));
43370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);
43470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr += 4;
43570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
43670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (num_cols&1) {
43770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      r = GETJSAMPLE(*inptr0);
43870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = GETJSAMPLE(*inptr1);
43970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      b = GETJSAMPLE(*inptr2);
44070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      rgb = PACK_SHORT_565(r,g,b);
44170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      *(INT16*)outptr = rgb;
44270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
44370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
44470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
44570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
44670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
44770a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
44870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinergb_rgb_565D_convert (j_decompress_ptr cinfo,
44970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine         JSAMPIMAGE input_buf, JDIMENSION input_row,
45070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine         JSAMPARRAY output_buf, int num_rows)
45170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
45270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW outptr;
45370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW inptr0, inptr1, inptr2;
45470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JDIMENSION col;
45570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPLE * range_limit = cinfo->sample_range_limit;
45670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JDIMENSION num_cols = cinfo->output_width;
45770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  INT32 d0 = dither_matrix[cinfo->output_scanline & DITHER_MASK];
45870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  SHIFT_TEMPS
45970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
46070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  while (--num_rows >= 0) {
46170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    INT32 rgb;
46270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    unsigned int r, g, b;
46370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr0 = input_buf[0][input_row];
46470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr1 = input_buf[1][input_row];
46570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr2 = input_buf[2][input_row];
46670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    input_row++;
46770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    outptr = *output_buf++;
46870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (PACK_NEED_ALIGNMENT(outptr)) {
46970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        r = range_limit[DITHER_565_R(GETJSAMPLE(*inptr0++), d0)];
47070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        g = range_limit[DITHER_565_G(GETJSAMPLE(*inptr1++), d0)];
47170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        b = range_limit[DITHER_565_B(GETJSAMPLE(*inptr2++), d0)];
47270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        rgb = PACK_SHORT_565(r,g,b);
47370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        *(INT16*)outptr = rgb;
47470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        outptr += 2;
47570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        num_cols--;
47670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
47770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    for (col = 0; col < (num_cols>>1); col++) {
47870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      r = range_limit[DITHER_565_R(GETJSAMPLE(*inptr0++), d0)];
47970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = range_limit[DITHER_565_G(GETJSAMPLE(*inptr1++), d0)];
48070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      b = range_limit[DITHER_565_B(GETJSAMPLE(*inptr2++), d0)];
48170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      d0 = DITHER_ROTATE(d0);
48270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      rgb = PACK_SHORT_565(r,g,b);
48370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      r = range_limit[DITHER_565_R(GETJSAMPLE(*inptr0++), d0)];
48470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = range_limit[DITHER_565_G(GETJSAMPLE(*inptr1++), d0)];
48570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      b = range_limit[DITHER_565_B(GETJSAMPLE(*inptr2++), d0)];
48670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      d0 = DITHER_ROTATE(d0);
48770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r,g,b));
48870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);
48970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr += 4;
49070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
49170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (num_cols&1) {
49270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      r = range_limit[DITHER_565_R(GETJSAMPLE(*inptr0), d0)];
49370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = range_limit[DITHER_565_G(GETJSAMPLE(*inptr1), d0)];
49470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      b = range_limit[DITHER_565_B(GETJSAMPLE(*inptr2), d0)];
49570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      rgb = PACK_SHORT_565(r,g,b);
49670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      *(INT16*)outptr = rgb;
49770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
49870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
49970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
50070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
50170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
50270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
50370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
50470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Color conversion for no colorspace change: just copy the data,
50570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * converting from separate-planes to interleaved representation.
50670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
50770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
50870a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
50970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinenull_convert (j_decompress_ptr cinfo,
51070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	      JSAMPIMAGE input_buf, JDIMENSION input_row,
51170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	      JSAMPARRAY output_buf, int num_rows)
51270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
51370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW inptr, outptr;
51470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JDIMENSION count;
51570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int num_components = cinfo->num_components;
51670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JDIMENSION num_cols = cinfo->output_width;
51770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int ci;
51870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
51970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  while (--num_rows >= 0) {
52070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    for (ci = 0; ci < num_components; ci++) {
52170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      inptr = input_buf[ci][input_row];
52270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr = output_buf[0] + ci;
52370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      for (count = num_cols; count > 0; count--) {
52470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	*outptr = *inptr++;	/* needn't bother with GETJSAMPLE() here */
52570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	outptr += num_components;
52670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      }
52770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
52870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    input_row++;
52970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    output_buf++;
53070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
53170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
53270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
53370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
53470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
53570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Color conversion for grayscale: just copy the data.
53670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This also works for YCbCr -> grayscale conversion, in which
53770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * we just copy the Y (luminance) component and ignore chrominance.
53870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
53970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
54070a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
54170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinegrayscale_convert (j_decompress_ptr cinfo,
54270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		   JSAMPIMAGE input_buf, JDIMENSION input_row,
54370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		   JSAMPARRAY output_buf, int num_rows)
54470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
54570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  jcopy_sample_rows(input_buf[0], (int) input_row, output_buf, 0,
54670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		    num_rows, cinfo->output_width);
54770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
54870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
54970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
55070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
55170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Convert grayscale to RGB: just duplicate the graylevel three times.
55270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This is provided to support applications that don't want to cope
55370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * with grayscale as a separate case.
55470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
55570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
55670a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
55770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinegray_rgb_convert (j_decompress_ptr cinfo,
55870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		  JSAMPIMAGE input_buf, JDIMENSION input_row,
55970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		  JSAMPARRAY output_buf, int num_rows)
56070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
56170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW inptr, outptr;
56270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JDIMENSION col;
56370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JDIMENSION num_cols = cinfo->output_width;
56470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
56570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  while (--num_rows >= 0) {
56670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr = input_buf[0][input_row++];
56770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    outptr = *output_buf++;
56870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    for (col = 0; col < num_cols; col++) {
56970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* We can dispense with GETJSAMPLE() here */
57070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr[RGB_RED] = outptr[RGB_GREEN] = outptr[RGB_BLUE] = inptr[col];
57170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr += RGB_PIXELSIZE;
57270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
57370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
57470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
57570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
57670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_RGB
57770a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
57870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinegray_rgba_8888_convert (j_decompress_ptr cinfo,
57970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine          JSAMPIMAGE input_buf, JDIMENSION input_row,
58070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine          JSAMPARRAY output_buf, int num_rows)
58170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
58270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW inptr, outptr;
58370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JDIMENSION col;
58470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JDIMENSION num_cols = cinfo->output_width;
58570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
58670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  while (--num_rows >= 0) {
58770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr = input_buf[0][input_row++];
58870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    outptr = *output_buf++;
58970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    for (col = 0; col < num_cols; col++) {
59070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* We can dispense with GETJSAMPLE() here */
59170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr[RGB_RED] = outptr[RGB_GREEN] = outptr[RGB_BLUE] = inptr[col];
59270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr[RGB_ALPHA] = 0xff;
59370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr += 4;
59470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
59570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
59670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
59770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
59870a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
59970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinegray_rgb_565_convert (j_decompress_ptr cinfo,
60070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine          JSAMPIMAGE input_buf, JDIMENSION input_row,
60170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine          JSAMPARRAY output_buf, int num_rows)
60270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
60370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW inptr, outptr;
60470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JDIMENSION col;
60570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JDIMENSION num_cols = cinfo->output_width;
60670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
60770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  while (--num_rows >= 0) {
60870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    INT32 rgb;
60970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    unsigned int g;
61070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr = input_buf[0][input_row++];
61170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    outptr = *output_buf++;
61270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (PACK_NEED_ALIGNMENT(outptr)) {
61370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        g = *inptr++;
61470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        rgb = PACK_SHORT_565(g, g, g);
61570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        *(INT16*)outptr = rgb;
61670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        outptr += 2;
61770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        num_cols--;
61870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
61970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    for (col = 0; col < (num_cols>>1); col++) {
62070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = *inptr++;
62170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      rgb = PACK_SHORT_565(g, g, g);
62270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = *inptr++;
62370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(g, g, g));
62470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);
62570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr += 4;
62670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
62770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (num_cols&1) {
62870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = *inptr;
62970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      rgb = PACK_SHORT_565(g, g, g);
63070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      *(INT16*)outptr = rgb;
63170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
63270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
63370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
63470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
63570a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
63670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinegray_rgb_565D_convert (j_decompress_ptr cinfo,
63770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine          JSAMPIMAGE input_buf, JDIMENSION input_row,
63870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine          JSAMPARRAY output_buf, int num_rows)
63970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
64070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW inptr, outptr;
64170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JDIMENSION col;
64270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPLE * range_limit = cinfo->sample_range_limit;
64370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JDIMENSION num_cols = cinfo->output_width;
64470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  INT32 d0 = dither_matrix[cinfo->output_scanline & DITHER_MASK];
64570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
64670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  while (--num_rows >= 0) {
64770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    INT32 rgb;
64870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    unsigned int g;
64970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr = input_buf[0][input_row++];
65070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    outptr = *output_buf++;
65170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (PACK_NEED_ALIGNMENT(outptr)) {
65270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        g = *inptr++;
65370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        g = range_limit[DITHER_565_R(g, d0)];
65470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        rgb = PACK_SHORT_565(g, g, g);
65570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        *(INT16*)outptr = rgb;
65670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        outptr += 2;
65770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        num_cols--;
65870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
65970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    for (col = 0; col < (num_cols>>1); col++) {
66070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = *inptr++;
66170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = range_limit[DITHER_565_R(g, d0)];
66270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      rgb = PACK_SHORT_565(g, g, g);
66370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      d0 = DITHER_ROTATE(d0);
66470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = *inptr++;
66570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = range_limit[DITHER_565_R(g, d0)];
66670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(g, g, g));
66770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      d0 = DITHER_ROTATE(d0);
66870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);
66970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr += 4;
67070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
67170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (num_cols&1) {
67270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = *inptr;
67370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = range_limit[DITHER_565_R(g, d0)];
67470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      rgb = PACK_SHORT_565(g, g, g);
67570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      *(INT16*)outptr = rgb;
67670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
67770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
67870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
67970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
68070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
68170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
68270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Adobe-style YCCK->CMYK conversion.
68370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * We convert YCbCr to R=1-C, G=1-M, and B=1-Y using the same
68470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * conversion as above, while passing K (black) unchanged.
68570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * We assume build_ycc_rgb_table has been called.
68670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
68770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
68870a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
68970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineycck_cmyk_convert (j_decompress_ptr cinfo,
69070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		   JSAMPIMAGE input_buf, JDIMENSION input_row,
69170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		   JSAMPARRAY output_buf, int num_rows)
69270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
69370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
69470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int y, cb, cr;
69570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW outptr;
69670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW inptr0, inptr1, inptr2, inptr3;
69770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JDIMENSION col;
69870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JDIMENSION num_cols = cinfo->output_width;
69970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* copy these pointers into registers if possible */
70070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPLE * range_limit = cinfo->sample_range_limit;
70170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int * Crrtab = cconvert->Cr_r_tab;
70270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int * Cbbtab = cconvert->Cb_b_tab;
70370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register INT32 * Crgtab = cconvert->Cr_g_tab;
70470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register INT32 * Cbgtab = cconvert->Cb_g_tab;
70570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  SHIFT_TEMPS
70670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
70770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  while (--num_rows >= 0) {
70870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr0 = input_buf[0][input_row];
70970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr1 = input_buf[1][input_row];
71070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr2 = input_buf[2][input_row];
71170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr3 = input_buf[3][input_row];
71270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    input_row++;
71370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    outptr = *output_buf++;
71470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    for (col = 0; col < num_cols; col++) {
71570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      y  = GETJSAMPLE(inptr0[col]);
71670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cb = GETJSAMPLE(inptr1[col]);
71770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cr = GETJSAMPLE(inptr2[col]);
71870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Range-limiting is essential due to noise introduced by DCT losses. */
71970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr[0] = range_limit[MAXJSAMPLE - (y + Crrtab[cr])];   /* red */
72070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr[1] = range_limit[MAXJSAMPLE - (y +                 /* green */
72170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine                              ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
72270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine                                                 SCALEBITS)))];
72370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr[2] = range_limit[MAXJSAMPLE - (y + Cbbtab[cb])];   /* blue */
72470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* K passes through unchanged */
72570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr[3] = inptr3[col];	/* don't need GETJSAMPLE here */
72670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr += 4;
72770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
72870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
72970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
73070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
73170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
73270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
73370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Empty method for start_pass.
73470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
73570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
73670a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
73770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinestart_pass_dcolor (j_decompress_ptr cinfo)
73870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
73970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* no work needed */
74070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
74170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
74270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
74370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
74470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Module initialization routine for output colorspace conversion.
74570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
74670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
74770a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(void)
74870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejinit_color_deconverter (j_decompress_ptr cinfo)
74970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
75070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  my_cconvert_ptr cconvert;
75170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int ci;
75270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
75370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cconvert = (my_cconvert_ptr)
75470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
75570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine				SIZEOF(my_color_deconverter));
75670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cinfo->cconvert = (struct jpeg_color_deconverter *) cconvert;
75770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cconvert->pub.start_pass = start_pass_dcolor;
75870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
75970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Make sure num_components agrees with jpeg_color_space */
76070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  switch (cinfo->jpeg_color_space) {
76170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  case JCS_GRAYSCALE:
76270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->num_components != 1)
76370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
76470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    break;
76570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
76670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  case JCS_RGB:
76770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  case JCS_YCbCr:
76870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->num_components != 3)
76970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
77070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    break;
77170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
77270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  case JCS_CMYK:
77370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  case JCS_YCCK:
77470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->num_components != 4)
77570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
77670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    break;
77770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
77870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  default:			/* JCS_UNKNOWN can be anything */
77970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->num_components < 1)
78070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
78170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    break;
78270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
78370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
78470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Set out_color_components and conversion method based on requested space.
78570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * Also clear the component_needed flags for any unused components,
78670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * so that earlier pipeline stages can avoid useless computation.
78770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   */
78870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
78970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  switch (cinfo->out_color_space) {
79070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  case JCS_GRAYSCALE:
79170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cinfo->out_color_components = 1;
79270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->jpeg_color_space == JCS_GRAYSCALE ||
79370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	cinfo->jpeg_color_space == JCS_YCbCr) {
79470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cconvert->pub.color_convert = grayscale_convert;
79570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* For color->grayscale conversion, only the Y (0) component is needed */
79670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      for (ci = 1; ci < cinfo->num_components; ci++)
79770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	cinfo->comp_info[ci].component_needed = FALSE;
79870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    } else
79970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
80070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    break;
80170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
80270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  case JCS_RGB:
80370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cinfo->out_color_components = RGB_PIXELSIZE;
80470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->jpeg_color_space == JCS_YCbCr) {
80570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cconvert->pub.color_convert = ycc_rgb_convert;
80670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      build_ycc_rgb_table(cinfo);
80770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) {
80870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cconvert->pub.color_convert = gray_rgb_convert;
80970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    } else if (cinfo->jpeg_color_space == JCS_RGB && RGB_PIXELSIZE == 3) {
81070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cconvert->pub.color_convert = null_convert;
81170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    } else
81270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
81370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    break;
81470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
81570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_RGB
81670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  case JCS_RGBA_8888:
81770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cinfo->out_color_components = 4;
81870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->jpeg_color_space == JCS_YCbCr) {
81970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cconvert->pub.color_convert = ycc_rgba_8888_convert;
82070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      build_ycc_rgb_table(cinfo);
82170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) {
82270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cconvert->pub.color_convert = gray_rgba_8888_convert;
82370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    } else if (cinfo->jpeg_color_space == JCS_RGB) {
82470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cconvert->pub.color_convert = rgb_rgba_8888_convert;
82570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    } else
82670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
82770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    break;
82870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
82970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  case JCS_RGB_565:
83070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cinfo->out_color_components = RGB_PIXELSIZE;
83170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->dither_mode == JDITHER_NONE) {
83270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      if (cinfo->jpeg_color_space == JCS_YCbCr) {
83370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        cconvert->pub.color_convert = ycc_rgb_565_convert;
83470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        build_ycc_rgb_table(cinfo);
83570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) {
83670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        cconvert->pub.color_convert = gray_rgb_565_convert;
83770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      } else if (cinfo->jpeg_color_space == JCS_RGB) {
83870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        cconvert->pub.color_convert = rgb_rgb_565_convert;
83970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      } else
84070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
84170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    } else {
84270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* only ordered dither is supported */
84370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      if (cinfo->jpeg_color_space == JCS_YCbCr) {
84470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        cconvert->pub.color_convert = ycc_rgb_565D_convert;
84570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        build_ycc_rgb_table(cinfo);
84670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) {
84770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        cconvert->pub.color_convert = gray_rgb_565D_convert;
84870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      } else if (cinfo->jpeg_color_space == JCS_RGB) {
84970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        cconvert->pub.color_convert = rgb_rgb_565D_convert;
85070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      } else
85170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
85270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
85370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    break;
85470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
85570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
85670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  case JCS_CMYK:
85770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cinfo->out_color_components = 4;
85870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->jpeg_color_space == JCS_YCCK) {
85970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cconvert->pub.color_convert = ycck_cmyk_convert;
86070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      build_ycc_rgb_table(cinfo);
86170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    } else if (cinfo->jpeg_color_space == JCS_CMYK) {
86270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cconvert->pub.color_convert = null_convert;
86370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    } else
86470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
86570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    break;
86670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
86770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  default:
86870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Permit null conversion to same output space */
86970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->out_color_space == cinfo->jpeg_color_space) {
87070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cinfo->out_color_components = cinfo->num_components;
87170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cconvert->pub.color_convert = null_convert;
87270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    } else			/* unsupported non-null conversion */
87370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
87470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    break;
87570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
87670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
87770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (cinfo->quantize_colors)
87870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cinfo->output_components = 1; /* single colormapped output component */
87970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  else
88070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cinfo->output_components = cinfo->out_color_components;
88170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
882