libjpeg-turbo has never really supported such compilers, since (AFAIK) they are non-existent on any modern computing platform and thus impossible for us to test. (Also, the TurboJPEG API would break without unsigned chars.) Furthermore, the unified CMake-based build system introduced in 2.0 always defines HAVE_UNSIGNED_CHAR, so retaining other code paths is pointless. Eliminating support for compilers without unsigned char eliminates the need for the GETJSAMPLE() macro, which improves the readability of many parts of the code as well as improving the performance of writing Targa and Windows BMP files. Fixes #317
145 lines
4.4 KiB
C
145 lines
4.4 KiB
C
/*
|
|
* jccolext.c
|
|
*
|
|
* This file was part of the Independent JPEG Group's software:
|
|
* Copyright (C) 1991-1996, Thomas G. Lane.
|
|
* libjpeg-turbo Modifications:
|
|
* Copyright (C) 2009-2012, 2015, D. R. Commander.
|
|
* For conditions of distribution and use, see the accompanying README.ijg
|
|
* file.
|
|
*
|
|
* This file contains input colorspace conversion routines.
|
|
*/
|
|
|
|
|
|
/* This file is included by jccolor.c */
|
|
|
|
|
|
/*
|
|
* Convert some rows of samples to the JPEG colorspace.
|
|
*
|
|
* Note that we change from the application's interleaved-pixel format
|
|
* to our internal noninterleaved, one-plane-per-component format.
|
|
* The input buffer is therefore three times as wide as the output buffer.
|
|
*
|
|
* A starting row offset is provided only for the output buffer. The caller
|
|
* can easily adjust the passed input_buf value to accommodate any row
|
|
* offset required on that side.
|
|
*/
|
|
|
|
INLINE
|
|
LOCAL(void)
|
|
rgb_ycc_convert_internal(j_compress_ptr cinfo, JSAMPARRAY input_buf,
|
|
JSAMPIMAGE output_buf, JDIMENSION output_row,
|
|
int num_rows)
|
|
{
|
|
my_cconvert_ptr cconvert = (my_cconvert_ptr)cinfo->cconvert;
|
|
register int r, g, b;
|
|
register JLONG *ctab = cconvert->rgb_ycc_tab;
|
|
register JSAMPROW inptr;
|
|
register JSAMPROW outptr0, outptr1, outptr2;
|
|
register JDIMENSION col;
|
|
JDIMENSION num_cols = cinfo->image_width;
|
|
|
|
while (--num_rows >= 0) {
|
|
inptr = *input_buf++;
|
|
outptr0 = output_buf[0][output_row];
|
|
outptr1 = output_buf[1][output_row];
|
|
outptr2 = output_buf[2][output_row];
|
|
output_row++;
|
|
for (col = 0; col < num_cols; col++) {
|
|
r = inptr[RGB_RED];
|
|
g = inptr[RGB_GREEN];
|
|
b = inptr[RGB_BLUE];
|
|
inptr += RGB_PIXELSIZE;
|
|
/* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
|
|
* must be too; we do not need an explicit range-limiting operation.
|
|
* Hence the value being shifted is never negative, and we don't
|
|
* need the general RIGHT_SHIFT macro.
|
|
*/
|
|
/* Y */
|
|
outptr0[col] = (JSAMPLE)((ctab[r + R_Y_OFF] + ctab[g + G_Y_OFF] +
|
|
ctab[b + B_Y_OFF]) >> SCALEBITS);
|
|
/* Cb */
|
|
outptr1[col] = (JSAMPLE)((ctab[r + R_CB_OFF] + ctab[g + G_CB_OFF] +
|
|
ctab[b + B_CB_OFF]) >> SCALEBITS);
|
|
/* Cr */
|
|
outptr2[col] = (JSAMPLE)((ctab[r + R_CR_OFF] + ctab[g + G_CR_OFF] +
|
|
ctab[b + B_CR_OFF]) >> SCALEBITS);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**************** Cases other than RGB -> YCbCr **************/
|
|
|
|
|
|
/*
|
|
* Convert some rows of samples to the JPEG colorspace.
|
|
* This version handles RGB->grayscale conversion, which is the same
|
|
* as the RGB->Y portion of RGB->YCbCr.
|
|
* We assume rgb_ycc_start has been called (we only use the Y tables).
|
|
*/
|
|
|
|
INLINE
|
|
LOCAL(void)
|
|
rgb_gray_convert_internal(j_compress_ptr cinfo, JSAMPARRAY input_buf,
|
|
JSAMPIMAGE output_buf, JDIMENSION output_row,
|
|
int num_rows)
|
|
{
|
|
my_cconvert_ptr cconvert = (my_cconvert_ptr)cinfo->cconvert;
|
|
register int r, g, b;
|
|
register JLONG *ctab = cconvert->rgb_ycc_tab;
|
|
register JSAMPROW inptr;
|
|
register JSAMPROW outptr;
|
|
register JDIMENSION col;
|
|
JDIMENSION num_cols = cinfo->image_width;
|
|
|
|
while (--num_rows >= 0) {
|
|
inptr = *input_buf++;
|
|
outptr = output_buf[0][output_row];
|
|
output_row++;
|
|
for (col = 0; col < num_cols; col++) {
|
|
r = inptr[RGB_RED];
|
|
g = inptr[RGB_GREEN];
|
|
b = inptr[RGB_BLUE];
|
|
inptr += RGB_PIXELSIZE;
|
|
/* Y */
|
|
outptr[col] = (JSAMPLE)((ctab[r + R_Y_OFF] + ctab[g + G_Y_OFF] +
|
|
ctab[b + B_Y_OFF]) >> SCALEBITS);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* Convert some rows of samples to the JPEG colorspace.
|
|
* This version handles extended RGB->plain RGB conversion
|
|
*/
|
|
|
|
INLINE
|
|
LOCAL(void)
|
|
rgb_rgb_convert_internal(j_compress_ptr cinfo, JSAMPARRAY input_buf,
|
|
JSAMPIMAGE output_buf, JDIMENSION output_row,
|
|
int num_rows)
|
|
{
|
|
register JSAMPROW inptr;
|
|
register JSAMPROW outptr0, outptr1, outptr2;
|
|
register JDIMENSION col;
|
|
JDIMENSION num_cols = cinfo->image_width;
|
|
|
|
while (--num_rows >= 0) {
|
|
inptr = *input_buf++;
|
|
outptr0 = output_buf[0][output_row];
|
|
outptr1 = output_buf[1][output_row];
|
|
outptr2 = output_buf[2][output_row];
|
|
output_row++;
|
|
for (col = 0; col < num_cols; col++) {
|
|
outptr0[col] = inptr[RGB_RED];
|
|
outptr1[col] = inptr[RGB_GREEN];
|
|
outptr2[col] = inptr[RGB_BLUE];
|
|
inptr += RGB_PIXELSIZE;
|
|
}
|
|
}
|
|
}
|