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