BitMiracle.LibJpeg.Classic.Internal.jpeg_color_converter.jpeg_color_converter C# (CSharp) Méthode

jpeg_color_converter() public méthode

public jpeg_color_converter ( jpeg_compress_struct cinfo )
cinfo jpeg_compress_struct
        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;
            }
        }