1c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org/* 2c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * jdcolext.c 3c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * 43395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org * This file was part of the Independent JPEG Group's software: 5c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * Copyright (C) 1991-1997, Thomas G. Lane. 63395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org * libjpeg-turbo Modifications: 7c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * Copyright (C) 2009, 2011, D. R. Commander. 8c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * For conditions of distribution and use, see the accompanying README file. 9c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * 10c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * This file contains output colorspace conversion routines. 11c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org */ 12c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org 13c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org 14c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org/* This file is included by jdcolor.c */ 15c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org 16c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org 17c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org/* 18c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * Convert some rows of samples to the output colorspace. 19c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * 20c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * Note that we change from noninterleaved, one-plane-per-component format 21c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * to interleaved-pixel format. The output buffer is therefore three times 22c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * as wide as the input buffer. 23c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * A starting row offset is provided only for the input buffer. The caller 24c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * can easily adjust the passed output_buf value to accommodate any row 25c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * offset required on that side. 26c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org */ 27c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org 28c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.orgINLINE 29c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.orgLOCAL(void) 30c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.orgycc_rgb_convert_internal (j_decompress_ptr cinfo, 31c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org JSAMPIMAGE input_buf, JDIMENSION input_row, 32c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org JSAMPARRAY output_buf, int num_rows) 33c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org{ 34c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; 35c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org register int y, cb, cr; 36c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org register JSAMPROW outptr; 37c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org register JSAMPROW inptr0, inptr1, inptr2; 38c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org register JDIMENSION col; 39c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org JDIMENSION num_cols = cinfo->output_width; 40c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org /* copy these pointers into registers if possible */ 41c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org register JSAMPLE * range_limit = cinfo->sample_range_limit; 42c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org register int * Crrtab = cconvert->Cr_r_tab; 43c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org register int * Cbbtab = cconvert->Cb_b_tab; 44c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org register INT32 * Crgtab = cconvert->Cr_g_tab; 45c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org register INT32 * Cbgtab = cconvert->Cb_g_tab; 46c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org SHIFT_TEMPS 47c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org 48c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org while (--num_rows >= 0) { 49c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org inptr0 = input_buf[0][input_row]; 50c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org inptr1 = input_buf[1][input_row]; 51c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org inptr2 = input_buf[2][input_row]; 52c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org input_row++; 53c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr = *output_buf++; 54c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org for (col = 0; col < num_cols; col++) { 55c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org y = GETJSAMPLE(inptr0[col]); 56c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org cb = GETJSAMPLE(inptr1[col]); 57c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org cr = GETJSAMPLE(inptr2[col]); 58c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org /* Range-limiting is essential due to noise introduced by DCT losses. */ 59c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr[RGB_RED] = range_limit[y + Crrtab[cr]]; 60c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr[RGB_GREEN] = range_limit[y + 61c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], 62c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org SCALEBITS))]; 63c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr[RGB_BLUE] = range_limit[y + Cbbtab[cb]]; 64c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org /* Set unused byte to 0xFF so it can be interpreted as an opaque */ 65c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org /* alpha channel value */ 66c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org#ifdef RGB_ALPHA 67c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr[RGB_ALPHA] = 0xFF; 68c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org#endif 69c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr += RGB_PIXELSIZE; 70c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org } 71c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org } 72c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org} 73c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org 74c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org 75c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org/* 76c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * Convert grayscale to RGB: just duplicate the graylevel three times. 77c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * This is provided to support applications that don't want to cope 78c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * with grayscale as a separate case. 79c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org */ 80c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org 81c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.orgINLINE 82c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.orgLOCAL(void) 83c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.orggray_rgb_convert_internal (j_decompress_ptr cinfo, 84c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org JSAMPIMAGE input_buf, JDIMENSION input_row, 85c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org JSAMPARRAY output_buf, int num_rows) 86c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org{ 87c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org register JSAMPROW inptr, outptr; 88c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org register JDIMENSION col; 89c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org JDIMENSION num_cols = cinfo->output_width; 90c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org 91c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org while (--num_rows >= 0) { 92c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org inptr = input_buf[0][input_row++]; 93c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr = *output_buf++; 94c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org for (col = 0; col < num_cols; col++) { 95c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org /* We can dispense with GETJSAMPLE() here */ 96c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr[RGB_RED] = outptr[RGB_GREEN] = outptr[RGB_BLUE] = inptr[col]; 97c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org /* Set unused byte to 0xFF so it can be interpreted as an opaque */ 98c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org /* alpha channel value */ 99c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org#ifdef RGB_ALPHA 100c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr[RGB_ALPHA] = 0xFF; 101c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org#endif 102c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr += RGB_PIXELSIZE; 103c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org } 104c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org } 105c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org} 106df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org 107df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org 108df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org/* 109df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org * Convert RGB to extended RGB: just swap the order of source pixels 110df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org */ 111df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org 112df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.orgINLINE 113df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.orgLOCAL(void) 114df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.orgrgb_rgb_convert_internal (j_decompress_ptr cinfo, 115df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org JSAMPIMAGE input_buf, JDIMENSION input_row, 116df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org JSAMPARRAY output_buf, int num_rows) 117df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org{ 118df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org register JSAMPROW inptr0, inptr1, inptr2; 119df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org register JSAMPROW outptr; 120df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org register JDIMENSION col; 121df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org JDIMENSION num_cols = cinfo->output_width; 122df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org 123df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org while (--num_rows >= 0) { 124df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org inptr0 = input_buf[0][input_row]; 125df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org inptr1 = input_buf[1][input_row]; 126df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org inptr2 = input_buf[2][input_row]; 127df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org input_row++; 128df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org outptr = *output_buf++; 129df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org for (col = 0; col < num_cols; col++) { 130df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org /* We can dispense with GETJSAMPLE() here */ 131df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org outptr[RGB_RED] = inptr0[col]; 132df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org outptr[RGB_GREEN] = inptr1[col]; 133df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org outptr[RGB_BLUE] = inptr2[col]; 134df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org /* Set unused byte to 0xFF so it can be interpreted as an opaque */ 135df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org /* alpha channel value */ 136df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org#ifdef RGB_ALPHA 137df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org outptr[RGB_ALPHA] = 0xFF; 138df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org#endif 139df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org outptr += RGB_PIXELSIZE; 140df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org } 141df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org } 142df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org} 143