BitMiracle.LibJpeg.Classic.jpeg_compress_struct.initial_setup C# (CSharp) Method

initial_setup() private method

Do computations that are needed before master selection phase
private initial_setup ( bool transcode_only ) : void
transcode_only bool
return void
        private void initial_setup(bool transcode_only)
        {
            if (transcode_only)
                jpeg_calc_trans_dimensions();
            else
                jpeg_calc_jpeg_dimensions();

            /* Sanity check on block_size */
            if (block_size < 1 || block_size > 16)
                ERREXIT(J_MESSAGE_CODE.JERR_BAD_DCTSIZE, block_size, block_size);

            /* Derive natural_order from block_size */
            switch (block_size)
            {
                case 2:
                    natural_order = JpegUtils.jpeg_natural_order2;
                    break;

                case 3:
                    natural_order = JpegUtils.jpeg_natural_order3;
                    break;

                case 4:
                    natural_order = JpegUtils.jpeg_natural_order4;
                    break;

                case 5:
                    natural_order = JpegUtils.jpeg_natural_order5;
                    break;

                case 6:
                    natural_order = JpegUtils.jpeg_natural_order6;
                    break;

                case 7:
                    natural_order = JpegUtils.jpeg_natural_order7;
                    break;

                default:
                    natural_order = JpegUtils.jpeg_natural_order;
                    break;
            }

            /* Derive lim_Se from block_size */
            lim_Se = block_size < JpegConstants.DCTSIZE ?
                block_size * block_size - 1 : JpegConstants.DCTSIZE2 - 1;

            /* Sanity check on image dimensions */
            if (jpeg_height <= 0 || jpeg_width <= 0 || m_num_components <= 0)
                ERREXIT(J_MESSAGE_CODE.JERR_EMPTY_IMAGE);

            /* Make sure image isn't bigger than I can handle */
            if (jpeg_height > JpegConstants.JPEG_MAX_DIMENSION ||
                jpeg_width > JpegConstants.JPEG_MAX_DIMENSION)
            {
                ERREXIT(J_MESSAGE_CODE.JERR_IMAGE_TOO_BIG, (uint)JpegConstants.JPEG_MAX_DIMENSION);
            }

            /* Only 8 to 12 bits data precision are supported for DCT based JPEG */
            if (m_data_precision < 8 || m_data_precision > 12)
                ERREXIT(J_MESSAGE_CODE.JERR_BAD_PRECISION, m_data_precision);

            /* Check that number of components won't exceed internal array sizes */
            if (m_num_components > JpegConstants.MAX_COMPONENTS)
                ERREXIT(J_MESSAGE_CODE.JERR_COMPONENT_COUNT, m_num_components, JpegConstants.MAX_COMPONENTS);

            /* Compute maximum sampling factors; check factor validity */
            m_max_h_samp_factor = 1;
            m_max_v_samp_factor = 1;
            for (int ci = 0; ci < m_num_components; ci++)
            {
                if (m_comp_info[ci].H_samp_factor <= 0 || m_comp_info[ci].H_samp_factor > JpegConstants.MAX_SAMP_FACTOR ||
                    m_comp_info[ci].V_samp_factor <= 0 || m_comp_info[ci].V_samp_factor > JpegConstants.MAX_SAMP_FACTOR)
                {
                    ERREXIT(J_MESSAGE_CODE.JERR_BAD_SAMPLING);
                }

                m_max_h_samp_factor = Math.Max(m_max_h_samp_factor, m_comp_info[ci].H_samp_factor);
                m_max_v_samp_factor = Math.Max(m_max_v_samp_factor, m_comp_info[ci].V_samp_factor);
            }

            /* Compute dimensions of components */
            for (int ci = 0; ci < m_num_components; ci++)
            {
                jpeg_component_info compptr = m_comp_info[ci];
                /* Fill in the correct component_index value; don't rely on application */
                compptr.Component_index = ci;

                /* In selecting the actual DCT scaling for each component, we try to
                 * scale down the chroma components via DCT scaling rather than downsampling.
                 * This saves time if the downsampler gets to use 1:1 scaling.
                 * Note this code adapts subsampling ratios which are powers of 2.
                 */
                int ssize = 1;
                while (min_DCT_h_scaled_size * ssize <=
                   (do_fancy_downsampling ? JpegConstants.DCTSIZE : JpegConstants.DCTSIZE / 2) &&
                   (m_max_h_samp_factor % (compptr.H_samp_factor * ssize * 2)) == 0)
                {
                    ssize = ssize * 2;
                }

                compptr.DCT_h_scaled_size = min_DCT_h_scaled_size * ssize;
                ssize = 1;
                while (min_DCT_v_scaled_size * ssize <=
                   (do_fancy_downsampling ? JpegConstants.DCTSIZE : JpegConstants.DCTSIZE / 2) &&
                   (m_max_v_samp_factor % (compptr.V_samp_factor * ssize * 2)) == 0)
                {
                    ssize = ssize * 2;
                }

                compptr.DCT_v_scaled_size = min_DCT_v_scaled_size * ssize;

                /* We don't support DCT ratios larger than 2. */
                if (compptr.DCT_h_scaled_size > compptr.DCT_v_scaled_size * 2)
                    compptr.DCT_h_scaled_size = compptr.DCT_v_scaled_size * 2;
                else if (compptr.DCT_v_scaled_size > compptr.DCT_h_scaled_size * 2)
                    compptr.DCT_v_scaled_size = compptr.DCT_h_scaled_size * 2;

                /* Size in DCT blocks */
                compptr.Width_in_blocks = (int)JpegUtils.jdiv_round_up(
                    (long)jpeg_width * compptr.H_samp_factor, (long)m_max_h_samp_factor * block_size);

                compptr.height_in_blocks = (int)JpegUtils.jdiv_round_up(
                    (long)jpeg_height * compptr.V_samp_factor, (long)m_max_v_samp_factor * block_size);

                /* Size in samples */
                compptr.downsampled_width = (int)JpegUtils.jdiv_round_up(
                    (long)jpeg_width * compptr.H_samp_factor * compptr.DCT_h_scaled_size,
                    (long)m_max_h_samp_factor * block_size);

                compptr.downsampled_height = (int)JpegUtils.jdiv_round_up(
                    (long)jpeg_height * compptr.V_samp_factor * compptr.DCT_v_scaled_size,
                    (long)m_max_v_samp_factor * block_size);

                /* Don't need quantization scale after DCT,
                 * until color conversion says otherwise.
                 */
                compptr.component_needed = false;
            }

            /* Compute number of fully interleaved MCU rows (number of times that
             * main controller will call coefficient controller).
             */
            m_total_iMCU_rows = (int)JpegUtils.jdiv_round_up(
                jpeg_height, (long)m_max_v_samp_factor * block_size);
        }