170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * jccolor.c
370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Copyright (C) 1991-1996, 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 input 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// this enables unrolling null_convert's loop, and reading/write ints for speed
1670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define ENABLE_ANDROID_NULL_CONVERT
1770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
1870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Private subobject */
1970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
2070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef struct {
2170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  struct jpeg_color_converter pub; /* public fields */
2270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
2370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Private state for RGB->YCC conversion */
2470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  INT32 * rgb_ycc_tab;		/* => table for RGB to YCbCr conversion */
2570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} my_color_converter;
2670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
2770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef my_color_converter * my_cconvert_ptr;
2870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
2970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
3070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/**************** RGB -> YCbCr conversion: most common case **************/
3170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
3270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
3370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * YCbCr is defined per CCIR 601-1, except that Cb and Cr are
3470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
3570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The conversion equations to be implemented are therefore
3670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *	Y  =  0.29900 * R + 0.58700 * G + 0.11400 * B
3770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *	Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B  + CENTERJSAMPLE
3870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *	Cr =  0.50000 * R - 0.41869 * G - 0.08131 * B  + CENTERJSAMPLE
3970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
4070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Note: older versions of the IJG code used a zero offset of MAXJSAMPLE/2,
4170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * rather than CENTERJSAMPLE, for Cb and Cr.  This gave equal positive and
4270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * negative swings for Cb/Cr, but meant that grayscale values (Cb=Cr=0)
4370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * were not represented exactly.  Now we sacrifice exact representation of
4470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * maximum red and maximum blue in order to get exact grayscales.
4570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
4670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * To avoid floating-point arithmetic, we represent the fractional constants
4770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * as integers scaled up by 2^16 (about 4 digits precision); we have to divide
4870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * the products by 2^16, with appropriate rounding, to get the correct answer.
4970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
5070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * For even more speed, we avoid doing any multiplications in the inner loop
5170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * by precalculating the constants times R,G,B for all possible values.
5270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
5370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * for 12-bit samples it is still acceptable.  It's not very reasonable for
5470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 16-bit samples, but if you want lossless storage you shouldn't be changing
5570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * colorspace anyway.
5670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The CENTERJSAMPLE offsets and the rounding fudge-factor of 0.5 are included
5770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * in the tables to save adding them separately in the inner loop.
5870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
5970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
6070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define SCALEBITS	16	/* speediest right-shift on some machines */
6170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define CBCR_OFFSET	((INT32) CENTERJSAMPLE << SCALEBITS)
6270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define ONE_HALF	((INT32) 1 << (SCALEBITS-1))
6370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define FIX(x)		((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
6470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
6570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* We allocate one big table and divide it up into eight parts, instead of
6670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * doing eight alloc_small requests.  This lets us use a single table base
6770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * address, which can be held in a register in the inner loops on many
6870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * machines (more than can hold all eight addresses, anyway).
6970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
7070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
7170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define R_Y_OFF		0			/* offset to R => Y section */
7270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define G_Y_OFF		(1*(MAXJSAMPLE+1))	/* offset to G => Y section */
7370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define B_Y_OFF		(2*(MAXJSAMPLE+1))	/* etc. */
7470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define R_CB_OFF	(3*(MAXJSAMPLE+1))
7570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define G_CB_OFF	(4*(MAXJSAMPLE+1))
7670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define B_CB_OFF	(5*(MAXJSAMPLE+1))
7770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define R_CR_OFF	B_CB_OFF		/* B=>Cb, R=>Cr are the same */
7870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define G_CR_OFF	(6*(MAXJSAMPLE+1))
7970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define B_CR_OFF	(7*(MAXJSAMPLE+1))
8070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define TABLE_SIZE	(8*(MAXJSAMPLE+1))
8170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
8270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
8370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
8470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Initialize for RGB->YCC colorspace conversion.
8570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
8670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
8770a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
8870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinergb_ycc_start (j_compress_ptr cinfo)
8970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
9070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
9170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  INT32 * rgb_ycc_tab;
9270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  INT32 i;
9370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
9470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Allocate and fill in the conversion tables. */
9570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cconvert->rgb_ycc_tab = rgb_ycc_tab = (INT32 *)
9670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
9770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine				(TABLE_SIZE * SIZEOF(INT32)));
9870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
9970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  for (i = 0; i <= MAXJSAMPLE; i++) {
10070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    rgb_ycc_tab[i+R_Y_OFF] = FIX(0.29900) * i;
10170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    rgb_ycc_tab[i+G_Y_OFF] = FIX(0.58700) * i;
10270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    rgb_ycc_tab[i+B_Y_OFF] = FIX(0.11400) * i     + ONE_HALF;
10370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.16874)) * i;
10470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.33126)) * i;
10570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr.
10670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     * This ensures that the maximum output will round to MAXJSAMPLE
10770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     * not MAXJSAMPLE+1, and thus that we don't have to range-limit.
10870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     */
10970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    rgb_ycc_tab[i+B_CB_OFF] = FIX(0.50000) * i    + CBCR_OFFSET + ONE_HALF-1;
11070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*  B=>Cb and R=>Cr tables are the same
11170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    rgb_ycc_tab[i+R_CR_OFF] = FIX(0.50000) * i    + CBCR_OFFSET + ONE_HALF-1;
11270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine*/
11370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.41869)) * i;
11470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.08131)) * i;
11570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
11670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
11770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
11870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
11970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
12070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Convert some rows of samples to the JPEG colorspace.
12170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
12270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Note that we change from the application's interleaved-pixel format
12370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * to our internal noninterleaved, one-plane-per-component format.
12470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The input buffer is therefore three times as wide as the output buffer.
12570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
12670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * A starting row offset is provided only for the output buffer.  The caller
12770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * can easily adjust the passed input_buf value to accommodate any row
12870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * offset required on that side.
12970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
13070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
13170a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
13270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinergb_ycc_convert (j_compress_ptr cinfo,
13370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		 JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
13470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		 JDIMENSION output_row, int num_rows)
13570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
13670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
13770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int r, g, b;
13870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register INT32 * ctab = cconvert->rgb_ycc_tab;
13970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW inptr;
14070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW outptr0, outptr1, outptr2;
14170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JDIMENSION col;
14270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JDIMENSION num_cols = cinfo->image_width;
14370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
14470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  while (--num_rows >= 0) {
14570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr = *input_buf++;
14670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    outptr0 = output_buf[0][output_row];
14770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    outptr1 = output_buf[1][output_row];
14870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    outptr2 = output_buf[2][output_row];
14970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    output_row++;
15070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    for (col = 0; col < num_cols; col++) {
15170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      r = GETJSAMPLE(inptr[RGB_RED]);
15270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = GETJSAMPLE(inptr[RGB_GREEN]);
15370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      b = GETJSAMPLE(inptr[RGB_BLUE]);
15470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      inptr += RGB_PIXELSIZE;
15570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
15670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine       * must be too; we do not need an explicit range-limiting operation.
15770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine       * Hence the value being shifted is never negative, and we don't
15870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine       * need the general RIGHT_SHIFT macro.
15970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine       */
16070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Y */
16170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr0[col] = (JSAMPLE)
16270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
16370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		 >> SCALEBITS);
16470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Cb */
16570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr1[col] = (JSAMPLE)
16670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])
16770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		 >> SCALEBITS);
16870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Cr */
16970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr2[col] = (JSAMPLE)
17070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
17170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		 >> SCALEBITS);
17270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
17370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
17470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
17570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
1764a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine#ifdef ANDROID_RGB
1774a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine/* Converts RGB565 row into YCbCr */
1784a795dda3d916c591206d2c37d6b583098204108Vladimir ChtchetkineMETHODDEF(void)
1794a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkinergb565_ycc_convert (j_compress_ptr cinfo,
1804a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine		 JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
1814a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine		 JDIMENSION output_row, int num_rows)
1824a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine{
1834a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
1844a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine  register int r, g, b;
1854a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine  register INT32 * ctab = cconvert->rgb_ycc_tab;
1864a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine  register unsigned short* inptr;
1874a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine  register JSAMPROW outptr0, outptr1, outptr2;
1884a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine  register JDIMENSION col;
1894a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine  JDIMENSION num_cols = cinfo->image_width;
1904a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine
1914a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine  while (--num_rows >= 0) {
1924a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine    inptr = (unsigned short*)(*input_buf++);
1934a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine    outptr0 = output_buf[0][output_row];
1944a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine    outptr1 = output_buf[1][output_row];
1954a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine    outptr2 = output_buf[2][output_row];
1964a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine    output_row++;
1974a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine    for (col = 0; col < num_cols; col++) {
1984a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine      register const unsigned short color = inptr[col];
1994a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine      r = ((color & 0xf800) >> 8) | ((color & 0xf800) >> 14);
2004a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine      g = ((color & 0x7e0) >> 3) | ((color & 0x7e0) >> 9);
2014a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine      b = ((color & 0x1f) << 3) | ((color & 0x1f) >> 2);
2024a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine      /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
2034a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine       * must be too; we do not need an explicit range-limiting operation.
2044a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine       * Hence the value being shifted is never negative, and we don't
2054a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine       * need the general RIGHT_SHIFT macro.
2064a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine       */
2074a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine      /* Y */
2084a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine      outptr0[col] = (JSAMPLE)
2094a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine		((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
2104a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine		 >> SCALEBITS);
2114a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine      /* Cb */
2124a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine      outptr1[col] = (JSAMPLE)
2134a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine		((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])
2144a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine		 >> SCALEBITS);
2154a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine      /* Cr */
2164a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine      outptr2[col] = (JSAMPLE)
2174a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine		((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
2184a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine		 >> SCALEBITS);
2194a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine    }
2204a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine  }
2214a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine}
2221a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine
2231a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine/* Converts RGBA8888 row into YCbCr */
2241a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir ChtchetkineMETHODDEF(void)
2251a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkinergba8888_ycc_convert (j_compress_ptr cinfo,
2261a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine		 JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
2271a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine		 JDIMENSION output_row, int num_rows)
2281a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine{
2291a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
2301a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine  register int r, g, b;
2311a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine  register INT32 * ctab = cconvert->rgb_ycc_tab;
2321a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine  register INT32* inptr;
2331a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine  register JSAMPROW outptr0, outptr1, outptr2;
2341a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine  register JDIMENSION col;
2351a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine  JDIMENSION num_cols = cinfo->image_width;
2361a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine
2371a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine  while (--num_rows >= 0) {
2381a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine    inptr = (INT32*)(*input_buf++);
2391a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine    outptr0 = output_buf[0][output_row];
2401a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine    outptr1 = output_buf[1][output_row];
2411a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine    outptr2 = output_buf[2][output_row];
2421a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine    output_row++;
2431a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine    for (col = 0; col < num_cols; col++) {
2441a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine      register const unsigned char* color = (unsigned char*)(inptr + col);
2451a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine      r = (*color) & 0xff; color++;
2461a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine      g = (*color) & 0xff; color++;
2471a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine      b = (*color) & 0xff; color++;
2481a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine      /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
2491a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine       * must be too; we do not need an explicit range-limiting operation.
2501a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine       * Hence the value being shifted is never negative, and we don't
2511a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine       * need the general RIGHT_SHIFT macro.
2521a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine       */
2531a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine      /* Y */
2541a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine      outptr0[col] = (JSAMPLE)
2551a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine		((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
2561a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine		 >> SCALEBITS);
2571a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine      /* Cb */
2581a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine      outptr1[col] = (JSAMPLE)
2591a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine		((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])
2601a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine		 >> SCALEBITS);
2611a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine      /* Cr */
2621a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine      outptr2[col] = (JSAMPLE)
2631a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine		((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
2641a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine		 >> SCALEBITS);
2651a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine    }
2661a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine  }
2671a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine}
2684a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine#endif  /* ANDROID_RGB */
26970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
27070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/**************** Cases other than RGB -> YCbCr **************/
27170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
27270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
27370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
27470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Convert some rows of samples to the JPEG colorspace.
27570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This version handles RGB->grayscale conversion, which is the same
27670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * as the RGB->Y portion of RGB->YCbCr.
27770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * We assume rgb_ycc_start has been called (we only use the Y tables).
27870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
27970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
28070a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
28170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinergb_gray_convert (j_compress_ptr cinfo,
28270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		  JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
28370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		  JDIMENSION output_row, int num_rows)
28470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
28570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
28670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int r, g, b;
28770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register INT32 * ctab = cconvert->rgb_ycc_tab;
28870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW inptr;
28970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW outptr;
29070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JDIMENSION col;
29170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JDIMENSION num_cols = cinfo->image_width;
29270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
29370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  while (--num_rows >= 0) {
29470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr = *input_buf++;
29570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    outptr = output_buf[0][output_row];
29670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    output_row++;
29770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    for (col = 0; col < num_cols; col++) {
29870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      r = GETJSAMPLE(inptr[RGB_RED]);
29970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = GETJSAMPLE(inptr[RGB_GREEN]);
30070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      b = GETJSAMPLE(inptr[RGB_BLUE]);
30170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      inptr += RGB_PIXELSIZE;
30270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Y */
30370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr[col] = (JSAMPLE)
30470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
30570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		 >> SCALEBITS);
30670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
30770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
30870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
30970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
31070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
31170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
31270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Convert some rows of samples to the JPEG colorspace.
31370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This version handles Adobe-style CMYK->YCCK conversion,
31470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * where we convert R=1-C, G=1-M, and B=1-Y to YCbCr using the same
31570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * conversion as above, while passing K (black) unchanged.
31670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * We assume rgb_ycc_start has been called.
31770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
31870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
31970a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
32070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinecmyk_ycck_convert (j_compress_ptr cinfo,
32170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		   JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
32270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		   JDIMENSION output_row, int num_rows)
32370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
32470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
32570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int r, g, b;
32670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register INT32 * ctab = cconvert->rgb_ycc_tab;
32770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW inptr;
32870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW outptr0, outptr1, outptr2, outptr3;
32970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JDIMENSION col;
33070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JDIMENSION num_cols = cinfo->image_width;
33170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
33270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  while (--num_rows >= 0) {
33370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr = *input_buf++;
33470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    outptr0 = output_buf[0][output_row];
33570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    outptr1 = output_buf[1][output_row];
33670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    outptr2 = output_buf[2][output_row];
33770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    outptr3 = output_buf[3][output_row];
33870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    output_row++;
33970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    for (col = 0; col < num_cols; col++) {
34070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      r = MAXJSAMPLE - GETJSAMPLE(inptr[0]);
34170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      g = MAXJSAMPLE - GETJSAMPLE(inptr[1]);
34270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      b = MAXJSAMPLE - GETJSAMPLE(inptr[2]);
34370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* K passes through as-is */
34470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr3[col] = inptr[3];	/* don't need GETJSAMPLE here */
34570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      inptr += 4;
34670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
34770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine       * must be too; we do not need an explicit range-limiting operation.
34870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine       * Hence the value being shifted is never negative, and we don't
34970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine       * need the general RIGHT_SHIFT macro.
35070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine       */
35170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Y */
35270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr0[col] = (JSAMPLE)
35370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
35470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		 >> SCALEBITS);
35570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Cb */
35670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr1[col] = (JSAMPLE)
35770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])
35870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		 >> SCALEBITS);
35970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Cr */
36070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr2[col] = (JSAMPLE)
36170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
36270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		 >> SCALEBITS);
36370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
36470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
36570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
36670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
36770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
36870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
36970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Convert some rows of samples to the JPEG colorspace.
37070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This version handles grayscale output with no conversion.
37170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The source can be either plain grayscale or YCbCr (since Y == gray).
37270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
37370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
37470a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
37570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinegrayscale_convert (j_compress_ptr cinfo,
37670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		   JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
37770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		   JDIMENSION output_row, int num_rows)
37870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
37970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW inptr;
38070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW outptr;
38170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JDIMENSION col;
38270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JDIMENSION num_cols = cinfo->image_width;
38370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int instride = cinfo->input_components;
38470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
38570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  while (--num_rows >= 0) {
38670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    inptr = *input_buf++;
38770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    outptr = output_buf[0][output_row];
38870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    output_row++;
38970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    for (col = 0; col < num_cols; col++) {
39070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr[col] = inptr[0];	/* don't need GETJSAMPLE() here */
39170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      inptr += instride;
39270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
39370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
39470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
39570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
39670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ENABLE_ANDROID_NULL_CONVERT
39770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
39870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef unsigned long UINT32;
39970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
40070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define B0(n)   ((n) & 0xFF)
40170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define B1(n)   (((n) >> 8) & 0xFF)
40270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define B2(n)   (((n) >> 16) & 0xFF)
40370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define B3(n)   ((n) >> 24)
40470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
40570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define PACK(a, b, c, d)    ((a) | ((b) << 8) | ((c) << 16) | ((d) << 24))
40670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
40770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinestatic int ptr_is_quad(const void* p)
40870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
40970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    return (((const char*)p - (const char*)0) & 3) == 0;
41070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
41170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
41270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinestatic void copyquads(const UINT32 in[], UINT32 out0[], UINT32 out1[], UINT32 out2[], int col4)
41370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
41470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    do {
41570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        UINT32 src0 = *in++;
41670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        UINT32 src1 = *in++;
41770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        UINT32 src2 = *in++;
41870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        // LEndian
41970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        *out0++ = PACK(B0(src0), B3(src0), B2(src1), B1(src2));
42070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        *out1++ = PACK(B1(src0), B0(src1), B3(src1), B2(src2));
42170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        *out2++ = PACK(B2(src0), B1(src1), B0(src2), B3(src2));
42270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    } while (--col4 != 0);
42370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
42470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
42570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
42670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
42770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
42870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Convert some rows of samples to the JPEG colorspace.
42970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This version handles multi-component colorspaces without conversion.
43070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * We assume input_components == num_components.
43170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
43270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
43370a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
43470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinenull_convert (j_compress_ptr cinfo,
43570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	      JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
43670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	      JDIMENSION output_row, int num_rows)
43770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
43870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW inptr;
43970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JSAMPROW outptr;
44070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register JDIMENSION col;
44170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int ci;
44270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int nc = cinfo->num_components;
44370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JDIMENSION num_cols = cinfo->image_width;
44470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
44570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ENABLE_ANDROID_NULL_CONVERT
44670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (1 == num_rows && 3 == nc && num_cols > 0) {
44770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        JSAMPROW inptr = *input_buf;
44870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        JSAMPROW outptr0 = output_buf[0][output_row];
44970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        JSAMPROW outptr1 = output_buf[1][output_row];
45070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        JSAMPROW outptr2 = output_buf[2][output_row];
4514a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine
45270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        int col = num_cols;
45370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        int col4 = col >> 2;
45470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        if (col4 > 0 && ptr_is_quad(inptr) && ptr_is_quad(outptr0) &&
45570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine                        ptr_is_quad(outptr1) && ptr_is_quad(outptr2)) {
4564a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine
45770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine            const UINT32* in = (const UINT32*)inptr;
45870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine            UINT32* out0 = (UINT32*)outptr0;
45970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine            UINT32* out1 = (UINT32*)outptr1;
46070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine            UINT32* out2 = (UINT32*)outptr2;
46170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine            copyquads(in, out0, out1, out2, col4);
46270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine            col &= 3;
46370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine            if (0 == col)
46470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine                return;
46570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine            col4 <<= 2;
46670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine            inptr += col4 * 3;  /* we read this 3 times per in copyquads */
46770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine            outptr0 += col4;
46870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine            outptr1 += col4;
46970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine            outptr2 += col4;
47070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine            /* fall through to while-loop */
47170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        }
47270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        do {
47370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine            *outptr0++ = *inptr++;
47470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine            *outptr1++ = *inptr++;
47570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine            *outptr2++ = *inptr++;
47670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        } while (--col != 0);
47770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        return;
47870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
47970a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineSLOW:
48070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
48170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  while (--num_rows >= 0) {
48270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* It seems fastest to make a separate pass for each component. */
48370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    for (ci = 0; ci < nc; ci++) {
48470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      inptr = *input_buf;
48570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      outptr = output_buf[ci][output_row];
48670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      for (col = 0; col < num_cols; col++) {
48770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	outptr[col] = inptr[ci]; /* don't need GETJSAMPLE() here */
48870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	inptr += nc;
48970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      }
49070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
49170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    input_buf++;
49270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    output_row++;
49370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
49470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
49570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
49670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
49770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
49870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Empty method for start_pass.
49970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
50070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
50170a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
50270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinenull_method (j_compress_ptr cinfo)
50370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
50470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* no work needed */
50570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
50670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
50770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
50870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
50970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Module initialization routine for input colorspace conversion.
51070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
51170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
51270a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(void)
51370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejinit_color_converter (j_compress_ptr cinfo)
51470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
51570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  my_cconvert_ptr cconvert;
51670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
51770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cconvert = (my_cconvert_ptr)
51870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
51970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine				SIZEOF(my_color_converter));
52070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cinfo->cconvert = (struct jpeg_color_converter *) cconvert;
52170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* set start_pass to null method until we find out differently */
52270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cconvert->pub.start_pass = null_method;
52370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
52470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Make sure input_components agrees with in_color_space */
52570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  switch (cinfo->in_color_space) {
52670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  case JCS_GRAYSCALE:
52770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->input_components != 1)
52870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
52970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    break;
53070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
53170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  case JCS_RGB:
53270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#if RGB_PIXELSIZE != 3
53370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->input_components != RGB_PIXELSIZE)
53470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
53570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    break;
53670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif /* else share code with YCbCr */
53770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
53870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  case JCS_YCbCr:
53970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->input_components != 3)
54070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
54170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    break;
54270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
54370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  case JCS_CMYK:
54470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  case JCS_YCCK:
54570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->input_components != 4)
54670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
54770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    break;
54870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
5494a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine#ifdef ANDROID_RGB
5504a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine  case JCS_RGB_565:
5514a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine    if (cinfo->input_components != 2)
5524a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
5534a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine    break;
5541a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine  case JCS_RGBA_8888:
5551a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine    if (cinfo->input_components != 4)
5561a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
5571a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine    break;
5584a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine#endif  /* ANDROID_RGB */
5594a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine
56070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  default:			/* JCS_UNKNOWN can be anything */
56170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->input_components < 1)
56270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
56370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    break;
56470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
56570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
56670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Check num_components, set conversion method based on requested space */
56770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  switch (cinfo->jpeg_color_space) {
56870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  case JCS_GRAYSCALE:
56970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->num_components != 1)
57070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
57170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->in_color_space == JCS_GRAYSCALE)
57270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cconvert->pub.color_convert = grayscale_convert;
57370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    else if (cinfo->in_color_space == JCS_RGB) {
57470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cconvert->pub.start_pass = rgb_ycc_start;
57570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cconvert->pub.color_convert = rgb_gray_convert;
57670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    } else if (cinfo->in_color_space == JCS_YCbCr)
57770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cconvert->pub.color_convert = grayscale_convert;
57870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    else
57970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
58070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    break;
58170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
58270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  case JCS_RGB:
58370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->num_components != 3)
58470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
58570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->in_color_space == JCS_RGB && RGB_PIXELSIZE == 3)
58670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cconvert->pub.color_convert = null_convert;
58770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    else
58870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
58970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    break;
59070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
59170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  case JCS_YCbCr:
59270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->num_components != 3)
59370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
59470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->in_color_space == JCS_RGB) {
59570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cconvert->pub.start_pass = rgb_ycc_start;
59670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cconvert->pub.color_convert = rgb_ycc_convert;
5974a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine    } else if (cinfo->in_color_space == JCS_YCbCr) {
59870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cconvert->pub.color_convert = null_convert;
5994a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine    }
6004a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine#ifdef ANDROID_RGB
6014a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine    else if (cinfo->in_color_space == JCS_RGB_565) {
6024a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine      cconvert->pub.start_pass = rgb_ycc_start;
6034a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine      cconvert->pub.color_convert = rgb565_ycc_convert;
6041a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine    } else if (cinfo->in_color_space == JCS_RGBA_8888) {
6051a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine      cconvert->pub.start_pass = rgb_ycc_start;
6061a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine      cconvert->pub.color_convert = rgba8888_ycc_convert;
6074a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine    }
6084a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine#endif  /* ANDROID_RGB */
60970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    else
61070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
61170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    break;
61270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
61370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  case JCS_CMYK:
61470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->num_components != 4)
61570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
61670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->in_color_space == JCS_CMYK)
61770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cconvert->pub.color_convert = null_convert;
61870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    else
61970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
62070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    break;
62170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
62270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  case JCS_YCCK:
62370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->num_components != 4)
62470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
62570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->in_color_space == JCS_CMYK) {
62670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cconvert->pub.start_pass = rgb_ycc_start;
62770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cconvert->pub.color_convert = cmyk_ycck_convert;
62870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    } else if (cinfo->in_color_space == JCS_YCCK)
62970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      cconvert->pub.color_convert = null_convert;
63070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    else
63170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
63270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    break;
63370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
63470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  default:			/* allow null conversion of JCS_UNKNOWN */
63570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->jpeg_color_space != cinfo->in_color_space ||
63670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	cinfo->num_components != cinfo->input_components)
63770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
63870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cconvert->pub.color_convert = null_convert;
63970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    break;
64070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
64170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
642