static void scaler_start_pass(jpeg_decompress cinfo) { jpeg_lossless_d_codec losslsd = (jpeg_lossless_d_codec)cinfo.coef; scaler scaler = (scaler)losslsd.scaler_private; // Downscale by the difference in the input vs. output precision. If the // output precision >= input precision, then do not downscale. int downscale = BITS_IN_JSAMPLE < cinfo.data_precision?cinfo.data_precision - BITS_IN_JSAMPLE:0; scaler.scale_factor = cinfo.Al - downscale; // Set scaler functions based on scale_factor (positive = left shift) if (scaler.scale_factor > 0) { losslsd.scaler_scale = simple_upscale; } else if (scaler.scale_factor < 0) { scaler.scale_factor = -scaler.scale_factor; losslsd.scaler_scale = simple_downscale; } else { losslsd.scaler_scale = noscale; } }
static void simple_downscale(jpeg_decompress cinfo, int[] diff_buf, byte[] output_buf, uint width) { jpeg_lossless_d_codec losslsd = (jpeg_lossless_d_codec)cinfo.coef; scaler scaler = (scaler)losslsd.scaler_private; int scale_factor = scaler.scale_factor; for (uint xindex = 0; xindex < width; xindex++) { output_buf[xindex] = (byte)(diff_buf[xindex] >> scale_factor); } }
static void jinit_d_scaler(jpeg_decompress cinfo) { jpeg_lossless_d_codec losslsd = (jpeg_lossless_d_codec)cinfo.coef; scaler scaler = null; try { scaler = new scaler(); } catch { ERREXIT1(cinfo, J_MESSAGE_CODE.JERR_OUT_OF_MEMORY, 4); } losslsd.scaler_private = scaler; losslsd.scaler_start_pass = scaler_start_pass; }
static void jinit_d_scaler(jpeg_decompress cinfo) { jpeg_lossless_d_codec losslsd=(jpeg_lossless_d_codec)cinfo.coef; scaler scaler=null; try { scaler=new scaler(); } catch { ERREXIT1(cinfo, J_MESSAGE_CODE.JERR_OUT_OF_MEMORY, 4); } losslsd.scaler_private=scaler; losslsd.scaler_start_pass=scaler_start_pass; }