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;
        }
Exemple #3
0
        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;
            }
        }