BitMiracle.LibJpeg.Classic.Internal.jpeg_color_deconverter.jpeg_color_deconverter C# (CSharp) Method

jpeg_color_deconverter() public method

Module initialization routine for output colorspace conversion.
public jpeg_color_deconverter ( jpeg_decompress_struct cinfo )
cinfo jpeg_decompress_struct
        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;
        }