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);
}