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

jpeg_downsampler() public method

public jpeg_downsampler ( jpeg_compress_struct cinfo )
cinfo jpeg_compress_struct
        public jpeg_downsampler(jpeg_compress_struct cinfo)
        {
            m_cinfo = cinfo;
            m_need_context_rows = false;

            if (cinfo.m_CCIR601_sampling)
                cinfo.ERREXIT(J_MESSAGE_CODE.JERR_CCIR601_NOTIMPL);

            /* Verify we can handle the sampling factors, and set up method pointers */
            bool smoothok = true;
            for (int ci = 0; ci < cinfo.m_num_components; ci++)
            {
                jpeg_component_info componentInfo = cinfo.Component_info[ci];

                /* Compute size of an "output group" for DCT scaling.  This many samples
                 * are to be converted from max_h_samp_factor * max_v_samp_factor pixels.
                 */
                int h_out_group = (componentInfo.H_samp_factor * componentInfo.DCT_h_scaled_size) /
                      m_cinfo.min_DCT_h_scaled_size;
                int v_out_group = (componentInfo.V_samp_factor * componentInfo.DCT_v_scaled_size) /
                      m_cinfo.min_DCT_v_scaled_size;
                int h_in_group = m_cinfo.m_max_h_samp_factor;
                int v_in_group = m_cinfo.m_max_v_samp_factor;
                rowgroup_height[ci] = v_out_group; /* save for use later */
                if (h_in_group == h_out_group && v_in_group == v_out_group)
                {
                    if (cinfo.m_smoothing_factor != 0)
                    {
                        m_downSamplers[ci] = downSampleMethod.fullsize_smooth_downsampler;
                        m_need_context_rows = true;
                    }
                    else
                    {
                        m_downSamplers[ci] = downSampleMethod.fullsize_downsampler;
                    }
                }
                else if (h_in_group == h_out_group * 2 && v_in_group == v_out_group)
                {
                    smoothok = false;
                    m_downSamplers[ci] = downSampleMethod.h2v1_downsampler;
                }
                else if (h_in_group == h_out_group * 2 && v_in_group == v_out_group * 2)
                {
                    if (cinfo.m_smoothing_factor != 0)
                    {
                        m_downSamplers[ci] = downSampleMethod.h2v2_smooth_downsampler;
                        m_need_context_rows = true;
                    }
                    else
                    {
                        m_downSamplers[ci] = downSampleMethod.h2v2_downsampler;
                    }
                }
                else if ((h_in_group % h_out_group) == 0 && (v_in_group % v_out_group) == 0)
                {
                    smoothok = false;
                    m_downSamplers[ci] = downSampleMethod.int_downsampler;
                    h_expand[ci] = (byte)(h_in_group / h_out_group);
                    v_expand[ci] = (byte)(v_in_group / v_out_group);
                }
                else
                {
                    cinfo.ERREXIT(J_MESSAGE_CODE.JERR_FRACT_SAMPLE_NOTIMPL);
                }
            }

            if (cinfo.m_smoothing_factor != 0 && !smoothok)
                cinfo.TRACEMS(0, J_MESSAGE_CODE.JTRC_SMOOTH_NOTIMPL);
        }