1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if !defined(_FX_JPEG_TURBO_) 2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* 3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * jdmerge.c 4e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * 5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Copyright (C) 1994-1996, Thomas G. Lane. 6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * This file is part of the Independent JPEG Group's software. 7e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * For conditions of distribution and use, see the accompanying README file. 8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * 9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * This file contains code for merged upsampling/color conversion. 10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * 11e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * This file combines functions from jdsample.c and jdcolor.c; 12e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * read those files first to understand what's going on. 13e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * 14e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * When the chroma components are to be upsampled by simple replication 15e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * (ie, box filtering), we can save some work in color conversion by 16e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * calculating all the output pixels corresponding to a pair of chroma 17e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * samples at one time. In the conversion equations 18e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * R = Y + K1 * Cr 19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * G = Y + K2 * Cb + K3 * Cr 20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * B = Y + K4 * Cb 21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * only the Y term varies among the group of pixels corresponding to a pair 22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * of chroma samples, so the rest of the terms can be calculated just once. 23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * At typical sampling ratios, this eliminates half or three-quarters of the 24e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * multiplications needed for color conversion. 25e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * 26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * This file currently provides implementations for the following cases: 27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * YCbCr => RGB color conversion only. 28e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Sampling ratios of 2h1v or 2h2v. 29e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * No scaling needed at upsample time. 30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Corner-aligned (non-CCIR601) sampling alignment. 31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Other special cases could be added, but in most applications these are 32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * the only common cases. (For uncommon cases we fall back on the more 33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * general code in jdsample.c and jdcolor.c.) 34e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 35e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 36e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define JPEG_INTERNALS 37e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "jinclude.h" 38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "jpeglib.h" 39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef UPSAMPLE_MERGING_SUPPORTED 41e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 42e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef _FX_MANAGED_CODE_ 43e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define my_upsampler my_upsampler_m 44e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 45e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 46e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Private subobject */ 47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 48e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovtypedef struct { 49e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov struct jpeg_upsampler pub; /* public fields */ 50e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 51e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Pointer to routine to do actual upsampling/conversion of one row group */ 52e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JMETHOD(void, upmethod, (j_decompress_ptr cinfo, 53e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, 54e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JSAMPARRAY output_buf)); 55e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Private state for YCC->RGB conversion */ 57e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int * Cr_r_tab; /* => table for Cr to R conversion */ 58e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int * Cb_b_tab; /* => table for Cb to B conversion */ 59e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov INT32 * Cr_g_tab; /* => table for Cr to G conversion */ 60e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov INT32 * Cb_g_tab; /* => table for Cb to G conversion */ 61e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 62e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* For 2:1 vertical sampling, we produce two output rows at a time. 63e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * We need a "spare" row buffer to hold the second output row if the 64e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * application provides just a one-row buffer; we also use the spare 65e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * to discard the dummy last row if the image height is odd. 66e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 67e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JSAMPROW spare_row; 68e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov boolean spare_full; /* T if spare buffer is occupied */ 69e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 70e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JDIMENSION out_row_width; /* samples per output row */ 71e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JDIMENSION rows_to_go; /* counts rows remaining in image */ 72e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} my_upsampler; 73e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 74e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovtypedef my_upsampler * my_upsample_ptr; 75e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 76e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define SCALEBITS 16 /* speediest right-shift on some machines */ 77e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define ONE_HALF ((INT32) 1 << (SCALEBITS-1)) 78e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FIX(x) ((INT32) ((x) * (1L<<SCALEBITS) + 0.5)) 79e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 80e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 81e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* 82e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Initialize tables for YCC->RGB colorspace conversion. 83e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * This is taken directly from jdcolor.c; see that file for more info. 84e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 85e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 86e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovLOCAL(void) 87e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovbuild_ycc_rgb_table (j_decompress_ptr cinfo) 88e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 89e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 90e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int i; 91e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov INT32 x; 92e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov SHIFT_TEMPS 93e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 94e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov upsample->Cr_r_tab = (int *) 95e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 96e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (MAXJSAMPLE+1) * SIZEOF(int)); 97e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov upsample->Cb_b_tab = (int *) 98e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 99e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (MAXJSAMPLE+1) * SIZEOF(int)); 100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov upsample->Cr_g_tab = (INT32 *) 101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (MAXJSAMPLE+1) * SIZEOF(INT32)); 103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov upsample->Cb_g_tab = (INT32 *) 104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (MAXJSAMPLE+1) * SIZEOF(INT32)); 106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 107e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) { 108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */ 109e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */ 110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Cr=>R value is nearest int to 1.40200 * x */ 111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov upsample->Cr_r_tab[i] = (int) 112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS); 113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Cb=>B value is nearest int to 1.77200 * x */ 114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov upsample->Cb_b_tab[i] = (int) 115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS); 116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Cr=>G value is scaled-up -0.71414 * x */ 117e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x; 118e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Cb=>G value is scaled-up -0.34414 * x */ 119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* We also add in ONE_HALF so that need not do it in inner loop */ 120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF; 121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 122e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* 126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Initialize for an upsampling pass. 127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 128e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovMETHODDEF(void) 130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstart_pass_merged_upsample (j_decompress_ptr cinfo) 131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 133e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Mark the spare buffer empty */ 135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov upsample->spare_full = FALSE; 136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Initialize total-height counter for detecting bottom of image */ 137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov upsample->rows_to_go = cinfo->output_height; 138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 139e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 141e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* 142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Control routine to do upsampling (and color conversion). 143e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * 144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * The control routine just handles the row buffering considerations. 145e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 146e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovMETHODDEF(void) 148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovmerged_2v_upsample (j_decompress_ptr cinfo, 149e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, 150e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JDIMENSION in_row_groups_avail, 151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, 152e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JDIMENSION out_rows_avail) 153e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* 2:1 vertical sampling case: may need a spare row. */ 154e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JSAMPROW work_ptrs[2]; 157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JDIMENSION num_rows; /* number of rows returned to caller */ 158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (upsample->spare_full) { 160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* If we have a spare row saved from a previous cycle, just return it. */ 161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov jcopy_sample_rows(& upsample->spare_row, 0, output_buf + *out_row_ctr, 0, 162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 1, upsample->out_row_width); 163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov num_rows = 1; 164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov upsample->spare_full = FALSE; 165e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 166e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Figure number of rows to return to caller. */ 167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov num_rows = 2; 168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Not more than the distance to the end of the image. */ 169e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (num_rows > upsample->rows_to_go) 170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov num_rows = upsample->rows_to_go; 171e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* And not more than what the client can accept: */ 172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov out_rows_avail -= *out_row_ctr; 173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (num_rows > out_rows_avail) 174e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov num_rows = out_rows_avail; 175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Create output pointer array for upsampler. */ 176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov work_ptrs[0] = output_buf[*out_row_ctr]; 177e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (num_rows > 1) { 178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov work_ptrs[1] = output_buf[*out_row_ctr + 1]; 179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov work_ptrs[1] = upsample->spare_row; 181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov upsample->spare_full = TRUE; 182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Now do the upsampling. */ 184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, work_ptrs); 185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Adjust counts */ 188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *out_row_ctr += num_rows; 189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov upsample->rows_to_go -= num_rows; 190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* When the buffer is emptied, declare this input row group consumed */ 191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (! upsample->spare_full) 192e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*in_row_group_ctr)++; 193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 194e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovMETHODDEF(void) 197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovmerged_1v_upsample (j_decompress_ptr cinfo, 198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, 199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JDIMENSION in_row_groups_avail, 200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, 201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JDIMENSION out_rows_avail) 202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* 1:1 vertical sampling case: much easier, never need a spare row. */ 203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Just do the upsampling. */ 207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, 208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov output_buf + *out_row_ctr); 209e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Adjust counts */ 210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*out_row_ctr)++; 211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*in_row_group_ctr)++; 212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 214e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* 216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * These are the routines invoked by the control routines to do 217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * the actual upsampling/conversion. One row group is processed per call. 218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * 219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Note: since we may be writing directly into application-supplied buffers, 220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * we have to be honest about the output width; we can't assume the buffer 221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * has been rounded up to an even width. 222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* 226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical. 227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovMETHODDEF(void) 230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovh2v1_merged_upsample (j_decompress_ptr cinfo, 231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, 232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JSAMPARRAY output_buf) 233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov register int y, cred, cgreen, cblue; 236e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int cb, cr; 237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov register JSAMPROW outptr; 238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JSAMPROW inptr0, inptr1, inptr2; 239e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JDIMENSION col; 240e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* copy these pointers into registers if possible */ 241e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov register JSAMPLE * range_limit = cinfo->sample_range_limit; 242e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int * Crrtab = upsample->Cr_r_tab; 243e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int * Cbbtab = upsample->Cb_b_tab; 244e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov INT32 * Crgtab = upsample->Cr_g_tab; 245e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov INT32 * Cbgtab = upsample->Cb_g_tab; 246e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov SHIFT_TEMPS 247e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 248e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov inptr0 = input_buf[0][in_row_group_ctr]; 249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov inptr1 = input_buf[1][in_row_group_ctr]; 250e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov inptr2 = input_buf[2][in_row_group_ctr]; 251e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr = output_buf[0]; 252e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Loop for each pair of output pixels */ 253e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (col = cinfo->output_width >> 1; col > 0; col--) { 254e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Do the chroma part of the calculation */ 255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cb = GETJSAMPLE(*inptr1++); 256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cr = GETJSAMPLE(*inptr2++); 257e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cred = Crrtab[cr]; 258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 259e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cblue = Cbbtab[cb]; 260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Fetch 2 Y values and emit 2 pixels */ 261e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov y = GETJSAMPLE(*inptr0++); 262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr[RGB_RED] = range_limit[y + cred]; 263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr[RGB_GREEN] = range_limit[y + cgreen]; 264e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr[RGB_BLUE] = range_limit[y + cblue]; 265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr += RGB_PIXELSIZE; 266e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov y = GETJSAMPLE(*inptr0++); 267e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr[RGB_RED] = range_limit[y + cred]; 268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr[RGB_GREEN] = range_limit[y + cgreen]; 269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr[RGB_BLUE] = range_limit[y + cblue]; 270e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr += RGB_PIXELSIZE; 271e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 272e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* If image width is odd, do the last output column separately */ 273e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->output_width & 1) { 274e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cb = GETJSAMPLE(*inptr1); 275e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cr = GETJSAMPLE(*inptr2); 276e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cred = Crrtab[cr]; 277e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 278e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cblue = Cbbtab[cb]; 279e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov y = GETJSAMPLE(*inptr0); 280e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr[RGB_RED] = range_limit[y + cred]; 281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr[RGB_GREEN] = range_limit[y + cgreen]; 282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr[RGB_BLUE] = range_limit[y + cblue]; 283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 284e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* 288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical. 289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovMETHODDEF(void) 292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovh2v2_merged_upsample (j_decompress_ptr cinfo, 293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, 294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JSAMPARRAY output_buf) 295e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 296e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 297e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov register int y, cred, cgreen, cblue; 298e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int cb, cr; 299e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov register JSAMPROW outptr0, outptr1; 300e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JSAMPROW inptr00, inptr01, inptr1, inptr2; 301e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JDIMENSION col; 302e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* copy these pointers into registers if possible */ 303e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov register JSAMPLE * range_limit = cinfo->sample_range_limit; 304e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int * Crrtab = upsample->Cr_r_tab; 305e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int * Cbbtab = upsample->Cb_b_tab; 306e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov INT32 * Crgtab = upsample->Cr_g_tab; 307e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov INT32 * Cbgtab = upsample->Cb_g_tab; 308e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov SHIFT_TEMPS 309e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 310e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov inptr00 = input_buf[0][in_row_group_ctr*2]; 311e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov inptr01 = input_buf[0][in_row_group_ctr*2 + 1]; 312e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov inptr1 = input_buf[1][in_row_group_ctr]; 313e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov inptr2 = input_buf[2][in_row_group_ctr]; 314e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr0 = output_buf[0]; 315e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr1 = output_buf[1]; 316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Loop for each group of output pixels */ 317e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (col = cinfo->output_width >> 1; col > 0; col--) { 318e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Do the chroma part of the calculation */ 319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cb = GETJSAMPLE(*inptr1++); 320e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cr = GETJSAMPLE(*inptr2++); 321e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cred = Crrtab[cr]; 322e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 323e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cblue = Cbbtab[cb]; 324e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Fetch 4 Y values and emit 4 pixels */ 325e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov y = GETJSAMPLE(*inptr00++); 326e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr0[RGB_RED] = range_limit[y + cred]; 327e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr0[RGB_GREEN] = range_limit[y + cgreen]; 328e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr0[RGB_BLUE] = range_limit[y + cblue]; 329e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr0 += RGB_PIXELSIZE; 330e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov y = GETJSAMPLE(*inptr00++); 331e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr0[RGB_RED] = range_limit[y + cred]; 332e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr0[RGB_GREEN] = range_limit[y + cgreen]; 333e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr0[RGB_BLUE] = range_limit[y + cblue]; 334e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr0 += RGB_PIXELSIZE; 335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov y = GETJSAMPLE(*inptr01++); 336e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr1[RGB_RED] = range_limit[y + cred]; 337e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr1[RGB_GREEN] = range_limit[y + cgreen]; 338e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr1[RGB_BLUE] = range_limit[y + cblue]; 339e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr1 += RGB_PIXELSIZE; 340e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov y = GETJSAMPLE(*inptr01++); 341e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr1[RGB_RED] = range_limit[y + cred]; 342e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr1[RGB_GREEN] = range_limit[y + cgreen]; 343e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr1[RGB_BLUE] = range_limit[y + cblue]; 344e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr1 += RGB_PIXELSIZE; 345e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 346e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* If image width is odd, do the last output column separately */ 347e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->output_width & 1) { 348e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cb = GETJSAMPLE(*inptr1); 349e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cr = GETJSAMPLE(*inptr2); 350e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cred = Crrtab[cr]; 351e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 352e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cblue = Cbbtab[cb]; 353e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov y = GETJSAMPLE(*inptr00); 354e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr0[RGB_RED] = range_limit[y + cred]; 355e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr0[RGB_GREEN] = range_limit[y + cgreen]; 356e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr0[RGB_BLUE] = range_limit[y + cblue]; 357e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov y = GETJSAMPLE(*inptr01); 358e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr1[RGB_RED] = range_limit[y + cred]; 359e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr1[RGB_GREEN] = range_limit[y + cgreen]; 360e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov outptr1[RGB_BLUE] = range_limit[y + cblue]; 361e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 362e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 363e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 364e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 365e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* 366e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Module initialization routine for merged upsampling/color conversion. 367e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * 368e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * NB: this is called under the conditions determined by use_merged_upsample() 369e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * in jdmaster.c. That routine MUST correspond to the actual capabilities 370e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * of this module; no safety checks are made here. 371e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 372e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 373e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovGLOBAL(void) 374e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovjinit_merged_upsampler (j_decompress_ptr cinfo) 375e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 376e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov my_upsample_ptr upsample; 377e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 378e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov upsample = (my_upsample_ptr) 379e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 380e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov SIZEOF(my_upsampler)); 381e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cinfo->upsample = (struct jpeg_upsampler *) upsample; 382e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov upsample->pub.start_pass = start_pass_merged_upsample; 383e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov upsample->pub.need_context_rows = FALSE; 384e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 385e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov upsample->out_row_width = cinfo->output_width * cinfo->out_color_components; 386e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 387e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cinfo->max_v_samp_factor == 2) { 388e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov upsample->pub.upsample = merged_2v_upsample; 389e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov upsample->upmethod = h2v2_merged_upsample; 390e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Allocate a spare row buffer */ 391e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov upsample->spare_row = (JSAMPROW) 392e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, 393e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (size_t) (upsample->out_row_width * SIZEOF(JSAMPLE))); 394e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 395e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov upsample->pub.upsample = merged_1v_upsample; 396e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov upsample->upmethod = h2v1_merged_upsample; 397e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* No spare row needed */ 398e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov upsample->spare_row = NULL; 399e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 400e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 401e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov build_ycc_rgb_table(cinfo); 402e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 403e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 404e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif /* UPSAMPLE_MERGING_SUPPORTED */ 405e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 406e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif //_FX_JPEG_TURBO_ 407