public jpeg_color_converter(jpeg_compress_struct cinfo)
{
m_cinfo = cinfo;
/* set start_pass to null method until we find out differently */
m_useNullStart = true;
/* Make sure input_components agrees with in_color_space */
switch (cinfo.m_in_color_space)
{
case J_COLOR_SPACE.JCS_GRAYSCALE:
if (cinfo.m_input_components != 1)
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_BAD_IN_COLORSPACE);
break;
case J_COLOR_SPACE.JCS_RGB:
case J_COLOR_SPACE.JCS_BG_RGB:
if (cinfo.m_input_components != JpegConstants.RGB_PIXELSIZE)
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_BAD_IN_COLORSPACE);
break;
case J_COLOR_SPACE.JCS_YCbCr:
case J_COLOR_SPACE.JCS_BG_YCC:
if (cinfo.m_input_components != 3)
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_BAD_IN_COLORSPACE);
break;
case J_COLOR_SPACE.JCS_CMYK:
case J_COLOR_SPACE.JCS_YCCK:
if (cinfo.m_input_components != 4)
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_BAD_IN_COLORSPACE);
break;
default:
/* JCS_UNKNOWN can be anything */
if (cinfo.m_input_components < 1)
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_BAD_IN_COLORSPACE);
break;
}
/* Support color transform only for RGB colorspaces */
if (cinfo.color_transform != J_COLOR_TRANSFORM.JCT_NONE &&
cinfo.Jpeg_color_space != J_COLOR_SPACE.JCS_RGB &&
cinfo.Jpeg_color_space != J_COLOR_SPACE.JCS_BG_RGB)
{
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_CONVERSION_NOTIMPL);
}
/* Check num_components, set conversion method based on requested space */
switch (cinfo.m_jpeg_color_space)
{
case J_COLOR_SPACE.JCS_GRAYSCALE:
if (cinfo.m_num_components != 1)
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_BAD_J_COLORSPACE);
switch (cinfo.m_in_color_space)
{
case J_COLOR_SPACE.JCS_GRAYSCALE:
case J_COLOR_SPACE.JCS_YCbCr:
case J_COLOR_SPACE.JCS_BG_YCC:
color_convert = grayscale_convert;
break;
case J_COLOR_SPACE.JCS_RGB:
m_useNullStart = false; // use rgb_ycc_start
color_convert = rgb_gray_convert;
break;
default:
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_CONVERSION_NOTIMPL);
break;
}
break;
case J_COLOR_SPACE.JCS_RGB:
case J_COLOR_SPACE.JCS_BG_RGB:
if (cinfo.m_num_components != 3)
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_BAD_J_COLORSPACE);
if (cinfo.m_in_color_space == cinfo.Jpeg_color_space)
{
switch (cinfo.color_transform)
{
case J_COLOR_TRANSFORM.JCT_NONE:
color_convert = rgb_convert;
break;
case J_COLOR_TRANSFORM.JCT_SUBTRACT_GREEN:
color_convert = rgb_rgb1_convert;
break;
default:
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_CONVERSION_NOTIMPL);
break;
}
}
else
{
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_CONVERSION_NOTIMPL);
}
break;
case J_COLOR_SPACE.JCS_YCbCr:
if (cinfo.m_num_components != 3)
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_BAD_J_COLORSPACE);
switch (cinfo.m_in_color_space)
{
case J_COLOR_SPACE.JCS_RGB:
m_useNullStart = false; // use rgb_ycc_start
color_convert = rgb_ycc_convert;
break;
case J_COLOR_SPACE.JCS_YCbCr:
color_convert = null_convert;
break;
default:
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_CONVERSION_NOTIMPL);
break;
}
break;
case J_COLOR_SPACE.JCS_BG_YCC:
if (cinfo.m_num_components != 3)
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_BAD_J_COLORSPACE);
switch (cinfo.m_in_color_space)
{
case J_COLOR_SPACE.JCS_RGB:
/* For conversion from normal RGB input to BG_YCC representation,
* the Cb/Cr values are first computed as usual, and then
* quantized further after DCT processing by a factor of
* 2 in reference to the nominal quantization factor.
*/
/* need quantization scale by factor of 2 after DCT */
cinfo.Component_info[1].component_needed = true;
cinfo.Component_info[2].component_needed = true;
/* compute normal YCC first */
m_useNullStart = false; // use rgb_ycc_start
color_convert = rgb_ycc_convert;
break;
case J_COLOR_SPACE.JCS_YCbCr:
/* need quantization scale by factor of 2 after DCT */
cinfo.Component_info[1].component_needed = true;
cinfo.Component_info[2].component_needed = true;
color_convert = null_convert;
break;
case J_COLOR_SPACE.JCS_BG_YCC:
/* Pass through for BG_YCC input */
color_convert = null_convert;
break;
default:
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_BAD_J_COLORSPACE);
break;
}
break;
case J_COLOR_SPACE.JCS_CMYK:
if (cinfo.m_num_components != 4)
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_BAD_J_COLORSPACE);
if (cinfo.m_in_color_space == J_COLOR_SPACE.JCS_CMYK)
color_convert = null_convert;
else
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_CONVERSION_NOTIMPL);
break;
case J_COLOR_SPACE.JCS_YCCK:
if (cinfo.m_num_components != 4)
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_BAD_J_COLORSPACE);
switch (cinfo.m_in_color_space)
{
case J_COLOR_SPACE.JCS_CMYK:
m_useNullStart = false; // use rgb_ycc_start
color_convert = cmyk_ycck_convert;
break;
case J_COLOR_SPACE.JCS_YCCK:
color_convert = null_convert;
break;
default:
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_CONVERSION_NOTIMPL);
break;
}
break;
default:
/* allow null conversion of JCS_UNKNOWN */
if (cinfo.m_jpeg_color_space != cinfo.m_in_color_space || cinfo.m_num_components != cinfo.m_input_components)
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_CONVERSION_NOTIMPL);
color_convert = null_convert;
break;
}
}