// Do downsampling for a whole row group (all components). // In this version we simply downsample each component independently. static void sep_downsample(jpeg_compress cinfo, byte[][][] input_buf, uint in_row_index, byte[][][] output_buf, uint out_row_group_index) { my_downsampler downsample = (my_downsampler)cinfo.downsample; for (int ci = 0; ci < cinfo.num_components; ci++) { downsample.methods[ci](cinfo, cinfo.comp_info[ci], input_buf[ci], in_row_index, output_buf[ci], (uint)(out_row_group_index * cinfo.comp_info[ci].v_samp_factor)); } }
// Module initialization routine for downsampling. // Note that we must select a routine for each component. static void jinit_downsampler(jpeg_compress cinfo) { my_downsampler downsample = null; try { downsample = new my_downsampler(); } catch { ERREXIT1(cinfo, J_MESSAGE_CODE.JERR_OUT_OF_MEMORY, 4); } cinfo.downsample = downsample; downsample.start_pass = start_pass_downsample; downsample.downsample = sep_downsample; downsample.need_context_rows = false; if (cinfo.CCIR601_sampling) { ERREXIT(cinfo, J_MESSAGE_CODE.JERR_CCIR601_NOTIMPL); } bool smoothok = true; // Verify we can handle the sampling factors, and set up method pointers for (int ci = 0; ci < cinfo.num_components; ci++) { jpeg_component_info compptr = cinfo.comp_info[ci]; if (compptr.h_samp_factor == cinfo.max_h_samp_factor && compptr.v_samp_factor == cinfo.max_v_samp_factor) { #if INPUT_SMOOTHING_SUPPORTED if (cinfo.smoothing_factor != 0) { downsample.methods[ci] = fullsize_smooth_downsample; downsample.need_context_rows = true; } else #endif downsample.methods[ci] = fullsize_downsample; } else if (compptr.h_samp_factor * 2 == cinfo.max_h_samp_factor && compptr.v_samp_factor == cinfo.max_v_samp_factor) { smoothok = false; downsample.methods[ci] = h2v1_downsample; } else if (compptr.h_samp_factor * 2 == cinfo.max_h_samp_factor && compptr.v_samp_factor * 2 == cinfo.max_v_samp_factor) { #if INPUT_SMOOTHING_SUPPORTED if (cinfo.smoothing_factor != 0) { downsample.methods[ci] = h2v2_smooth_downsample; downsample.need_context_rows = true; } else #endif downsample.methods[ci] = h2v2_downsample; } else if ((cinfo.max_h_samp_factor % compptr.h_samp_factor) == 0 && (cinfo.max_v_samp_factor % compptr.v_samp_factor) == 0) { smoothok = false; downsample.methods[ci] = int_downsample; } else { ERREXIT(cinfo, J_MESSAGE_CODE.JERR_FRACT_SAMPLE_NOTIMPL); } } #if INPUT_SMOOTHING_SUPPORTED if (cinfo.smoothing_factor != 0 && !smoothok) { TRACEMS(cinfo, 0, J_MESSAGE_CODE.JTRC_SMOOTH_NOTIMPL); } #endif }
// Module initialization routine for downsampling. // Note that we must select a routine for each component. static void jinit_downsampler(jpeg_compress cinfo) { my_downsampler downsample=null; try { downsample=new my_downsampler(); } catch { ERREXIT1(cinfo, J_MESSAGE_CODE.JERR_OUT_OF_MEMORY, 4); } cinfo.downsample=downsample; downsample.start_pass=start_pass_downsample; downsample.downsample=sep_downsample; downsample.need_context_rows=false; if(cinfo.CCIR601_sampling) ERREXIT(cinfo, J_MESSAGE_CODE.JERR_CCIR601_NOTIMPL); bool smoothok=true; // Verify we can handle the sampling factors, and set up method pointers for(int ci=0; ci<cinfo.num_components; ci++) { jpeg_component_info compptr=cinfo.comp_info[ci]; if(compptr.h_samp_factor==cinfo.max_h_samp_factor&&compptr.v_samp_factor==cinfo.max_v_samp_factor) { #if INPUT_SMOOTHING_SUPPORTED if(cinfo.smoothing_factor!=0) { downsample.methods[ci]=fullsize_smooth_downsample; downsample.need_context_rows=true; } else #endif downsample.methods[ci]=fullsize_downsample; } else if(compptr.h_samp_factor*2==cinfo.max_h_samp_factor&&compptr.v_samp_factor==cinfo.max_v_samp_factor) { smoothok=false; downsample.methods[ci]=h2v1_downsample; } else if(compptr.h_samp_factor*2==cinfo.max_h_samp_factor&&compptr.v_samp_factor*2==cinfo.max_v_samp_factor) { #if INPUT_SMOOTHING_SUPPORTED if(cinfo.smoothing_factor!=0) { downsample.methods[ci]=h2v2_smooth_downsample; downsample.need_context_rows=true; } else #endif downsample.methods[ci]=h2v2_downsample; } else if((cinfo.max_h_samp_factor%compptr.h_samp_factor)==0&&(cinfo.max_v_samp_factor%compptr.v_samp_factor)==0) { smoothok=false; downsample.methods[ci]=int_downsample; } else ERREXIT(cinfo, J_MESSAGE_CODE.JERR_FRACT_SAMPLE_NOTIMPL); } #if INPUT_SMOOTHING_SUPPORTED if(cinfo.smoothing_factor!=0&&!smoothok) TRACEMS(cinfo, 0, J_MESSAGE_CODE.JTRC_SMOOTH_NOTIMPL); #endif }