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; } }
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; } }