private int[] rgb_y_tab; /* => table for RGB to Y conversion */ /// <summary> /// Module initialization routine for output colorspace conversion. /// </summary> public JpegColorDeconverter(JpegDecompressStruct cinfo) { m_cinfo = cinfo; /* Make sure num_components agrees with jpeg_color_space */ switch (cinfo.jpegColorSpace) { case JColorSpace.JCS_GRAYSCALE: if (cinfo.numComponents != 1) { cinfo.ErrExit(JMessageCode.JERR_BAD_J_COLORSPACE); } break; case JColorSpace.JCS_RGB: case JColorSpace.JCS_YCbCr: case JColorSpace.JCS_BG_RGB: case JColorSpace.JCS_BG_YCC: if (cinfo.numComponents != 3) { cinfo.ErrExit(JMessageCode.JERR_BAD_J_COLORSPACE); } break; case JColorSpace.JCS_CMYK: case JColorSpace.JCS_YCCK: if (cinfo.numComponents != 4) { cinfo.ErrExit(JMessageCode.JERR_BAD_J_COLORSPACE); } break; case JColorSpace.JCS_NCHANNEL: if (cinfo.numComponents < 1) { cinfo.ErrExit(JMessageCode.JERR_BAD_J_COLORSPACE); } break; default: /* JCS_UNKNOWN can be anything */ if (cinfo.numComponents < 1) { cinfo.ErrExit(JMessageCode.JERR_BAD_J_COLORSPACE); } break; } /* Support color transform only for RGB colorspaces */ if (cinfo.color_transform != JColorTransform.JCT_NONE && cinfo.jpegColorSpace != JColorSpace.JCS_RGB && cinfo.jpegColorSpace != JColorSpace.JCS_BG_RGB) { cinfo.ErrExit(JMessageCode.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.outColorSpace) { case JColorSpace.JCS_GRAYSCALE: cinfo.outColorComponents = 1; switch (cinfo.jpegColorSpace) { case JColorSpace.JCS_GRAYSCALE: case JColorSpace.JCS_YCbCr: case JColorSpace.JCS_BG_YCC: m_converter = GrayscaleConvert; /* For color->grayscale conversion, only the Y (0) component is needed */ for (var ci = 1; ci < cinfo.numComponents; ci++) { cinfo.CompInfo[ci].component_needed = false; } break; case JColorSpace.JCS_RGB: switch (cinfo.color_transform) { case JColorTransform.JCT_NONE: m_converter = RgbGrayConvert; break; case JColorTransform.JCT_SUBTRACT_GREEN: m_converter = Rgb1GrayConvert; break; default: cinfo.ErrExit(JMessageCode.JERR_CONVERSION_NOTIMPL); break; } BuildRgbYTable(); break; default: cinfo.ErrExit(JMessageCode.JERR_CONVERSION_NOTIMPL); break; } break; case JColorSpace.JCS_RGB: cinfo.outColorComponents = JpegConstants.RGB_PIXELSIZE; switch (cinfo.jpegColorSpace) { case JColorSpace.JCS_GRAYSCALE: m_converter = GrayRgbConvert; break; case JColorSpace.JCS_YCbCr: m_converter = YccRgbConvert; BuildYccRgbTable(); break; case JColorSpace.JCS_BG_YCC: m_converter = YccRgbConvert; BuildBgYccRgbTable(); break; case JColorSpace.JCS_RGB: switch (cinfo.color_transform) { case JColorTransform.JCT_NONE: m_converter = RgbConvert; break; case JColorTransform.JCT_SUBTRACT_GREEN: m_converter = Rgb1RgbConvert; break; default: cinfo.ErrExit(JMessageCode.JERR_CONVERSION_NOTIMPL); break; } break; case JColorSpace.JCS_CMYK: m_converter = CmykRgbConvert; break; case JColorSpace.JCS_YCCK: m_converter = YcckRgbConvert; BuildYccRgbTable(); break; default: cinfo.ErrExit(JMessageCode.JERR_CONVERSION_NOTIMPL); break; } break; case JColorSpace.JCS_BG_RGB: cinfo.outColorComponents = JpegConstants.RGB_PIXELSIZE; if (cinfo.jpegColorSpace == JColorSpace.JCS_BG_RGB) { switch (cinfo.color_transform) { case JColorTransform.JCT_NONE: m_converter = RgbConvert; break; case JColorTransform.JCT_SUBTRACT_GREEN: m_converter = Rgb1RgbConvert; break; default: cinfo.ErrExit(JMessageCode.JERR_CONVERSION_NOTIMPL); break; } } else { cinfo.ErrExit(JMessageCode.JERR_CONVERSION_NOTIMPL); } break; case JColorSpace.JCS_CMYK: cinfo.outColorComponents = 4; switch (cinfo.jpegColorSpace) { case JColorSpace.JCS_YCCK: m_converter = YcckCmykConvert; BuildYccRgbTable(); break; case JColorSpace.JCS_CMYK: m_converter = NullConvert; break; default: cinfo.ErrExit(JMessageCode.JERR_CONVERSION_NOTIMPL); break; } break; case JColorSpace.JCS_NCHANNEL: if (cinfo.jpegColorSpace == JColorSpace.JCS_NCHANNEL) { m_converter = NullConvert; } else { cinfo.ErrExit(JMessageCode.JERR_CONVERSION_NOTIMPL); } break; default: /* Permit null conversion to same output space */ if (cinfo.outColorSpace == cinfo.jpegColorSpace) { cinfo.outColorComponents = cinfo.numComponents; m_converter = NullConvert; } else { /* unsupported non-null conversion */ cinfo.ErrExit(JMessageCode.JERR_CONVERSION_NOTIMPL); } break; } if (cinfo.quantizeColors) { cinfo.outputComponents = 1; /* single colormapped output component */ } else { cinfo.outputComponents = cinfo.outColorComponents; } }
private int[] rgb_y_tab; /* => table for RGB to Y conversion */ /// <summary> /// Module initialization routine for output colorspace conversion. /// </summary> 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; }
private int[] rgb_y_tab; /* => table for RGB to Y conversion */ /// <summary> /// Module initialization routine for output colorspace conversion. /// </summary> 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; } }