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