public jpeg_color_deconverter(jpeg_decompress_struct cinfo)
{
m_cinfo = cinfo;
/* Make sure num_components agrees with jpeg_color_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);
break;
case J_COLOR_SPACE.JCS_RGB:
case J_COLOR_SPACE.JCS_YCbCr:
case J_COLOR_SPACE.JCS_BG_RGB:
case J_COLOR_SPACE.JCS_BG_YCC:
if (cinfo.m_num_components != 3)
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_BAD_J_COLORSPACE);
break;
case J_COLOR_SPACE.JCS_CMYK:
case J_COLOR_SPACE.JCS_YCCK:
if (cinfo.m_num_components != 4)
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_BAD_J_COLORSPACE);
break;
case J_COLOR_SPACE.JCS_NCHANNEL:
if (cinfo.m_num_components < 1)
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_BAD_J_COLORSPACE);
break;
default:
/* JCS_UNKNOWN can be anything */
if (cinfo.m_num_components < 1)
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_BAD_J_COLORSPACE);
break;
}
/* Support color transform only for RGB colorspaces */
if (cinfo.color_transform != J_COLOR_TRANSFORM.JCT_NONE &&
cinfo.m_jpeg_color_space != J_COLOR_SPACE.JCS_RGB &&
cinfo.m_jpeg_color_space != J_COLOR_SPACE.JCS_BG_RGB)
{
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_CONVERSION_NOTIMPL);
}
/* Set out_color_components and conversion method based on requested space.
* Also clear the component_needed flags for any unused components,
* so that earlier pipeline stages can avoid useless computation.
*/
switch (cinfo.m_out_color_space)
{
case J_COLOR_SPACE.JCS_GRAYSCALE:
cinfo.m_out_color_components = 1;
switch (cinfo.m_jpeg_color_space)
{
case J_COLOR_SPACE.JCS_GRAYSCALE:
case J_COLOR_SPACE.JCS_YCbCr:
case J_COLOR_SPACE.JCS_BG_YCC:
m_converter = grayscale_convert;
/* For color->grayscale conversion, only the Y (0) component is needed */
for (int ci = 1; ci < cinfo.m_num_components; ci++)
cinfo.Comp_info[ci].component_needed = false;
break;
case J_COLOR_SPACE.JCS_RGB:
switch (cinfo.color_transform)
{
case J_COLOR_TRANSFORM.JCT_NONE:
m_converter = rgb_gray_convert;
break;
case J_COLOR_TRANSFORM.JCT_SUBTRACT_GREEN:
m_converter = rgb1_gray_convert;
break;
default:
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_CONVERSION_NOTIMPL);
break;
}
build_rgb_y_table();
break;
default:
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_CONVERSION_NOTIMPL);
break;
}
break;
case J_COLOR_SPACE.JCS_RGB:
cinfo.m_out_color_components = JpegConstants.RGB_PIXELSIZE;
switch (cinfo.m_jpeg_color_space)
{
case J_COLOR_SPACE.JCS_GRAYSCALE:
m_converter = gray_rgb_convert;
break;
case J_COLOR_SPACE.JCS_YCbCr:
m_converter = ycc_rgb_convert;
build_ycc_rgb_table();
break;
case J_COLOR_SPACE.JCS_BG_YCC:
m_converter = ycc_rgb_convert;
build_bg_ycc_rgb_table();
break;
case J_COLOR_SPACE.JCS_RGB:
switch (cinfo.color_transform)
{
case J_COLOR_TRANSFORM.JCT_NONE:
m_converter = rgb_convert;
break;
case J_COLOR_TRANSFORM.JCT_SUBTRACT_GREEN:
m_converter = rgb1_rgb_convert;
break;
default:
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_CONVERSION_NOTIMPL);
break;
}
break;
case J_COLOR_SPACE.JCS_CMYK:
m_converter = cmyk_rgb_convert;
break;
case J_COLOR_SPACE.JCS_YCCK:
m_converter = ycck_rgb_convert;
build_ycc_rgb_table();
break;
default:
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_CONVERSION_NOTIMPL);
break;
}
break;
case J_COLOR_SPACE.JCS_BG_RGB:
cinfo.m_out_color_components = JpegConstants.RGB_PIXELSIZE;
if (cinfo.m_jpeg_color_space == J_COLOR_SPACE.JCS_BG_RGB)
{
switch (cinfo.color_transform)
{
case J_COLOR_TRANSFORM.JCT_NONE:
m_converter = rgb_convert;
break;
case J_COLOR_TRANSFORM.JCT_SUBTRACT_GREEN:
m_converter = rgb1_rgb_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_CMYK:
cinfo.m_out_color_components = 4;
switch (cinfo.m_jpeg_color_space)
{
case J_COLOR_SPACE.JCS_YCCK:
m_converter = ycck_cmyk_convert;
build_ycc_rgb_table();
break;
case J_COLOR_SPACE.JCS_CMYK:
m_converter = null_convert;
break;
default:
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_CONVERSION_NOTIMPL);
break;
}
break;
case J_COLOR_SPACE.JCS_NCHANNEL:
if (cinfo.m_jpeg_color_space == J_COLOR_SPACE.JCS_NCHANNEL)
m_converter = null_convert;
else
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_CONVERSION_NOTIMPL);
break;
default:
/* Permit null conversion to same output space */
if (cinfo.m_out_color_space == cinfo.m_jpeg_color_space)
{
cinfo.m_out_color_components = cinfo.m_num_components;
m_converter = null_convert;
}
else
{
/* unsupported non-null conversion */
cinfo.ERREXIT(J_MESSAGE_CODE.JERR_CONVERSION_NOTIMPL);
}
break;
}
if (cinfo.m_quantize_colors)
cinfo.m_output_components = 1; /* single colormapped output component */
else
cinfo.m_output_components = cinfo.m_out_color_components;
}