| Index: jdcolor.c
|
| ===================================================================
|
| --- jdcolor.c (revision 106486)
|
| +++ jdcolor.c (working copy)
|
| @@ -3,7 +3,7 @@
|
| *
|
| * Copyright (C) 1991-1997, Thomas G. Lane.
|
| * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
|
| - * Copyright (C) 2009, D. R. Commander.
|
| + * Copyright (C) 2009, 2011, D. R. Commander.
|
| * This file is part of the Independent JPEG Group's software.
|
| * For conditions of distribution and use, see the accompanying README file.
|
| *
|
| @@ -65,6 +65,107 @@
|
| #define FIX(x) ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
|
|
|
|
|
| +/* Include inline routines for colorspace extensions */
|
| +
|
| +#include "jdcolext.c"
|
| +#undef RGB_RED
|
| +#undef RGB_GREEN
|
| +#undef RGB_BLUE
|
| +#undef RGB_PIXELSIZE
|
| +
|
| +#define RGB_RED EXT_RGB_RED
|
| +#define RGB_GREEN EXT_RGB_GREEN
|
| +#define RGB_BLUE EXT_RGB_BLUE
|
| +#define RGB_PIXELSIZE EXT_RGB_PIXELSIZE
|
| +#define ycc_rgb_convert_internal ycc_extrgb_convert_internal
|
| +#define gray_rgb_convert_internal gray_extrgb_convert_internal
|
| +#include "jdcolext.c"
|
| +#undef RGB_RED
|
| +#undef RGB_GREEN
|
| +#undef RGB_BLUE
|
| +#undef RGB_PIXELSIZE
|
| +#undef ycc_rgb_convert_internal
|
| +#undef gray_rgb_convert_internal
|
| +
|
| +#define RGB_RED EXT_RGBX_RED
|
| +#define RGB_GREEN EXT_RGBX_GREEN
|
| +#define RGB_BLUE EXT_RGBX_BLUE
|
| +#define RGB_ALPHA 3
|
| +#define RGB_PIXELSIZE EXT_RGBX_PIXELSIZE
|
| +#define ycc_rgb_convert_internal ycc_extrgbx_convert_internal
|
| +#define gray_rgb_convert_internal gray_extrgbx_convert_internal
|
| +#include "jdcolext.c"
|
| +#undef RGB_RED
|
| +#undef RGB_GREEN
|
| +#undef RGB_BLUE
|
| +#undef RGB_ALPHA
|
| +#undef RGB_PIXELSIZE
|
| +#undef ycc_rgb_convert_internal
|
| +#undef gray_rgb_convert_internal
|
| +
|
| +#define RGB_RED EXT_BGR_RED
|
| +#define RGB_GREEN EXT_BGR_GREEN
|
| +#define RGB_BLUE EXT_BGR_BLUE
|
| +#define RGB_PIXELSIZE EXT_BGR_PIXELSIZE
|
| +#define ycc_rgb_convert_internal ycc_extbgr_convert_internal
|
| +#define gray_rgb_convert_internal gray_extbgr_convert_internal
|
| +#include "jdcolext.c"
|
| +#undef RGB_RED
|
| +#undef RGB_GREEN
|
| +#undef RGB_BLUE
|
| +#undef RGB_PIXELSIZE
|
| +#undef ycc_rgb_convert_internal
|
| +#undef gray_rgb_convert_internal
|
| +
|
| +#define RGB_RED EXT_BGRX_RED
|
| +#define RGB_GREEN EXT_BGRX_GREEN
|
| +#define RGB_BLUE EXT_BGRX_BLUE
|
| +#define RGB_ALPHA 3
|
| +#define RGB_PIXELSIZE EXT_BGRX_PIXELSIZE
|
| +#define ycc_rgb_convert_internal ycc_extbgrx_convert_internal
|
| +#define gray_rgb_convert_internal gray_extbgrx_convert_internal
|
| +#include "jdcolext.c"
|
| +#undef RGB_RED
|
| +#undef RGB_GREEN
|
| +#undef RGB_BLUE
|
| +#undef RGB_ALPHA
|
| +#undef RGB_PIXELSIZE
|
| +#undef ycc_rgb_convert_internal
|
| +#undef gray_rgb_convert_internal
|
| +
|
| +#define RGB_RED EXT_XBGR_RED
|
| +#define RGB_GREEN EXT_XBGR_GREEN
|
| +#define RGB_BLUE EXT_XBGR_BLUE
|
| +#define RGB_ALPHA 0
|
| +#define RGB_PIXELSIZE EXT_XBGR_PIXELSIZE
|
| +#define ycc_rgb_convert_internal ycc_extxbgr_convert_internal
|
| +#define gray_rgb_convert_internal gray_extxbgr_convert_internal
|
| +#include "jdcolext.c"
|
| +#undef RGB_RED
|
| +#undef RGB_GREEN
|
| +#undef RGB_BLUE
|
| +#undef RGB_ALPHA
|
| +#undef RGB_PIXELSIZE
|
| +#undef ycc_rgb_convert_internal
|
| +#undef gray_rgb_convert_internal
|
| +
|
| +#define RGB_RED EXT_XRGB_RED
|
| +#define RGB_GREEN EXT_XRGB_GREEN
|
| +#define RGB_BLUE EXT_XRGB_BLUE
|
| +#define RGB_ALPHA 0
|
| +#define RGB_PIXELSIZE EXT_XRGB_PIXELSIZE
|
| +#define ycc_rgb_convert_internal ycc_extxrgb_convert_internal
|
| +#define gray_rgb_convert_internal gray_extxrgb_convert_internal
|
| +#include "jdcolext.c"
|
| +#undef RGB_RED
|
| +#undef RGB_GREEN
|
| +#undef RGB_BLUE
|
| +#undef RGB_ALPHA
|
| +#undef RGB_PIXELSIZE
|
| +#undef ycc_rgb_convert_internal
|
| +#undef gray_rgb_convert_internal
|
| +
|
| +
|
| /*
|
| * Initialize tables for YCC->RGB colorspace conversion.
|
| */
|
| @@ -110,13 +211,6 @@
|
|
|
| /*
|
| * Convert some rows of samples to the output colorspace.
|
| - *
|
| - * Note that we change from noninterleaved, one-plane-per-component format
|
| - * to interleaved-pixel format. The output buffer is therefore three times
|
| - * as wide as the input buffer.
|
| - * A starting row offset is provided only for the input buffer. The caller
|
| - * can easily adjust the passed output_buf value to accommodate any row
|
| - * offset required on that side.
|
| */
|
|
|
| METHODDEF(void)
|
| @@ -124,42 +218,35 @@
|
| JSAMPIMAGE input_buf, JDIMENSION input_row,
|
| JSAMPARRAY output_buf, int num_rows)
|
| {
|
| - my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
| - register int y, cb, cr;
|
| - register JSAMPROW outptr;
|
| - register JSAMPROW inptr0, inptr1, inptr2;
|
| - register JDIMENSION col;
|
| - JDIMENSION num_cols = cinfo->output_width;
|
| - int rindex = rgb_red[cinfo->out_color_space];
|
| - int gindex = rgb_green[cinfo->out_color_space];
|
| - int bindex = rgb_blue[cinfo->out_color_space];
|
| - int rgbstride = rgb_pixelsize[cinfo->out_color_space];
|
| - /* copy these pointers into registers if possible */
|
| - register JSAMPLE * range_limit = cinfo->sample_range_limit;
|
| - register int * Crrtab = cconvert->Cr_r_tab;
|
| - register int * Cbbtab = cconvert->Cb_b_tab;
|
| - register INT32 * Crgtab = cconvert->Cr_g_tab;
|
| - register INT32 * Cbgtab = cconvert->Cb_g_tab;
|
| - SHIFT_TEMPS
|
| -
|
| - while (--num_rows >= 0) {
|
| - inptr0 = input_buf[0][input_row];
|
| - inptr1 = input_buf[1][input_row];
|
| - inptr2 = input_buf[2][input_row];
|
| - input_row++;
|
| - outptr = *output_buf++;
|
| - for (col = 0; col < num_cols; col++) {
|
| - y = GETJSAMPLE(inptr0[col]);
|
| - cb = GETJSAMPLE(inptr1[col]);
|
| - cr = GETJSAMPLE(inptr2[col]);
|
| - /* Range-limiting is essential due to noise introduced by DCT losses. */
|
| - outptr[rindex] = range_limit[y + Crrtab[cr]];
|
| - outptr[gindex] = range_limit[y +
|
| - ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
|
| - SCALEBITS))];
|
| - outptr[bindex] = range_limit[y + Cbbtab[cb]];
|
| - outptr += rgbstride;
|
| - }
|
| + switch (cinfo->out_color_space) {
|
| + case JCS_EXT_RGB:
|
| + ycc_extrgb_convert_internal(cinfo, input_buf, input_row, output_buf,
|
| + num_rows);
|
| + break;
|
| + case JCS_EXT_RGBX:
|
| + ycc_extrgbx_convert_internal(cinfo, input_buf, input_row, output_buf,
|
| + num_rows);
|
| + break;
|
| + case JCS_EXT_BGR:
|
| + ycc_extbgr_convert_internal(cinfo, input_buf, input_row, output_buf,
|
| + num_rows);
|
| + break;
|
| + case JCS_EXT_BGRX:
|
| + ycc_extbgrx_convert_internal(cinfo, input_buf, input_row, output_buf,
|
| + num_rows);
|
| + break;
|
| + case JCS_EXT_XBGR:
|
| + ycc_extxbgr_convert_internal(cinfo, input_buf, input_row, output_buf,
|
| + num_rows);
|
| + break;
|
| + case JCS_EXT_XRGB:
|
| + ycc_extxrgb_convert_internal(cinfo, input_buf, input_row, output_buf,
|
| + num_rows);
|
| + break;
|
| + default:
|
| + ycc_rgb_convert_internal(cinfo, input_buf, input_row, output_buf,
|
| + num_rows);
|
| + break;
|
| }
|
| }
|
|
|
| @@ -215,9 +302,7 @@
|
|
|
|
|
| /*
|
| - * Convert grayscale to RGB: just duplicate the graylevel three times.
|
| - * This is provided to support applications that don't want to cope
|
| - * with grayscale as a separate case.
|
| + * Convert grayscale to RGB
|
| */
|
|
|
| METHODDEF(void)
|
| @@ -225,22 +310,35 @@
|
| JSAMPIMAGE input_buf, JDIMENSION input_row,
|
| JSAMPARRAY output_buf, int num_rows)
|
| {
|
| - register JSAMPROW inptr, outptr;
|
| - JSAMPLE *maxinptr;
|
| - JDIMENSION num_cols = cinfo->output_width;
|
| - int rindex = rgb_red[cinfo->out_color_space];
|
| - int gindex = rgb_green[cinfo->out_color_space];
|
| - int bindex = rgb_blue[cinfo->out_color_space];
|
| - int rgbstride = rgb_pixelsize[cinfo->out_color_space];
|
| -
|
| - while (--num_rows >= 0) {
|
| - inptr = input_buf[0][input_row++];
|
| - maxinptr = &inptr[num_cols];
|
| - outptr = *output_buf++;
|
| - for (; inptr < maxinptr; inptr++, outptr += rgbstride) {
|
| - /* We can dispense with GETJSAMPLE() here */
|
| - outptr[rindex] = outptr[gindex] = outptr[bindex] = *inptr;
|
| - }
|
| + switch (cinfo->out_color_space) {
|
| + case JCS_EXT_RGB:
|
| + gray_extrgb_convert_internal(cinfo, input_buf, input_row, output_buf,
|
| + num_rows);
|
| + break;
|
| + case JCS_EXT_RGBX:
|
| + gray_extrgbx_convert_internal(cinfo, input_buf, input_row, output_buf,
|
| + num_rows);
|
| + break;
|
| + case JCS_EXT_BGR:
|
| + gray_extbgr_convert_internal(cinfo, input_buf, input_row, output_buf,
|
| + num_rows);
|
| + break;
|
| + case JCS_EXT_BGRX:
|
| + gray_extbgrx_convert_internal(cinfo, input_buf, input_row, output_buf,
|
| + num_rows);
|
| + break;
|
| + case JCS_EXT_XBGR:
|
| + gray_extxbgr_convert_internal(cinfo, input_buf, input_row, output_buf,
|
| + num_rows);
|
| + break;
|
| + case JCS_EXT_XRGB:
|
| + gray_extxrgb_convert_internal(cinfo, input_buf, input_row, output_buf,
|
| + num_rows);
|
| + break;
|
| + default:
|
| + gray_rgb_convert_internal(cinfo, input_buf, input_row, output_buf,
|
| + num_rows);
|
| + break;
|
| }
|
| }
|
|
|
|
|