170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * jdmerge.c 370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Copyright (C) 1994-1996, Thomas G. Lane. 570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file is part of the Independent JPEG Group's software. 670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * For conditions of distribution and use, see the accompanying README file. 770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file contains code for merged upsampling/color conversion. 970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 1070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file combines functions from jdsample.c and jdcolor.c; 1170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * read those files first to understand what's going on. 1270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 1370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * When the chroma components are to be upsampled by simple replication 1470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * (ie, box filtering), we can save some work in color conversion by 1570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * calculating all the output pixels corresponding to a pair of chroma 1670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * samples at one time. In the conversion equations 1770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * R = Y + K1 * Cr 1870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * G = Y + K2 * Cb + K3 * Cr 1970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * B = Y + K4 * Cb 2070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * only the Y term varies among the group of pixels corresponding to a pair 2170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * of chroma samples, so the rest of the terms can be calculated just once. 2270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * At typical sampling ratios, this eliminates half or three-quarters of the 2370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * multiplications needed for color conversion. 2470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 2570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file currently provides implementations for the following cases: 2670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * YCbCr => RGB color conversion only. 2770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Sampling ratios of 2h1v or 2h2v. 2870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * No scaling needed at upsample time. 2970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Corner-aligned (non-CCIR601) sampling alignment. 3070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Other special cases could be added, but in most applications these are 3170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * the only common cases. (For uncommon cases we fall back on the more 3270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * general code in jdsample.c and jdcolor.c.) 3370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 3470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 3570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define JPEG_INTERNALS 3670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "jinclude.h" 3770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "jpeglib.h" 3870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 3970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef UPSAMPLE_MERGING_SUPPORTED 4070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 4170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_RGB 4270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 4370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Declarations for ordered dithering. 4470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 4570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * We use 4x4 ordered dither array packed into 32 bits. This array is 4670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * sufficent for dithering RGB_888 to RGB_565. 4770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 4870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 4970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define DITHER_MASK 0x3 5070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define DITHER_ROTATE(x) (((x)<<24) | (((x)>>8)&0x00FFFFFF)) 5170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinestatic const INT32 dither_matrix[4] = { 5270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x0008020A, 5370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x0C040E06, 5470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x030B0109, 5570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x0F070D05 5670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}; 5770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 5870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 5970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 6070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Private subobject */ 6170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 6270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef struct { 6370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine struct jpeg_upsampler pub; /* public fields */ 6470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 6570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Pointer to routine to do actual upsampling/conversion of one row group */ 6670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JMETHOD(void, upmethod, (j_decompress_ptr cinfo, 6770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, 6870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPARRAY output_buf)); 6970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 7070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Private state for YCC->RGB conversion */ 7170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int * Cr_r_tab; /* => table for Cr to R conversion */ 7270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int * Cb_b_tab; /* => table for Cb to B conversion */ 7370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 * Cr_g_tab; /* => table for Cr to G conversion */ 7470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 * Cb_g_tab; /* => table for Cb to G conversion */ 7570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 7670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* For 2:1 vertical sampling, we produce two output rows at a time. 7770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * We need a "spare" row buffer to hold the second output row if the 7870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * application provides just a one-row buffer; we also use the spare 7970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * to discard the dummy last row if the image height is odd. 8070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 8170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPROW spare_row; 8270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine boolean spare_full; /* T if spare buffer is occupied */ 8370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 8470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION out_row_width; /* samples per output row */ 8570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION rows_to_go; /* counts rows remaining in image */ 8670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} my_upsampler; 8770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 8870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef my_upsampler * my_upsample_ptr; 8970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 9070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define SCALEBITS 16 /* speediest right-shift on some machines */ 9170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define ONE_HALF ((INT32) 1 << (SCALEBITS-1)) 9270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define FIX(x) ((INT32) ((x) * (1L<<SCALEBITS) + 0.5)) 9370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 9470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 9570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 9670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Initialize tables for YCC->RGB colorspace conversion. 9770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This is taken directly from jdcolor.c; see that file for more info. 9870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 9970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 10070a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(void) 10170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinebuild_ycc_rgb_table (j_decompress_ptr cinfo) 10270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 10370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 10470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int i; 10570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 x; 10670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SHIFT_TEMPS 10770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 10870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->Cr_r_tab = (int *) 10970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 11070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (MAXJSAMPLE+1) * SIZEOF(int)); 11170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->Cb_b_tab = (int *) 11270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 11370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (MAXJSAMPLE+1) * SIZEOF(int)); 11470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->Cr_g_tab = (INT32 *) 11570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 11670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (MAXJSAMPLE+1) * SIZEOF(INT32)); 11770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->Cb_g_tab = (INT32 *) 11870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 11970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (MAXJSAMPLE+1) * SIZEOF(INT32)); 12070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 12170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) { 12270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */ 12370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */ 12470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Cr=>R value is nearest int to 1.40200 * x */ 12570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->Cr_r_tab[i] = (int) 12670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS); 12770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Cb=>B value is nearest int to 1.77200 * x */ 12870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->Cb_b_tab[i] = (int) 12970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS); 13070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Cr=>G value is scaled-up -0.71414 * x */ 13170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x; 13270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Cb=>G value is scaled-up -0.34414 * x */ 13370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* We also add in ONE_HALF so that need not do it in inner loop */ 13470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF; 13570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 13670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 13770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 13870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 13970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 14070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Initialize for an upsampling pass. 14170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 14270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 14370a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void) 14470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinestart_pass_merged_upsample (j_decompress_ptr cinfo) 14570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 14670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 14770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 14870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Mark the spare buffer empty */ 14970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->spare_full = FALSE; 15070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Initialize total-height counter for detecting bottom of image */ 15170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->rows_to_go = cinfo->output_height; 15270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 15370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 15470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 15570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 15670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Control routine to do upsampling (and color conversion). 15770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 15870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The control routine just handles the row buffering considerations. 15970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 16070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 16170a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void) 16270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinemerged_2v_upsample (j_decompress_ptr cinfo, 16370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, 16470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION in_row_groups_avail, 16570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, 16670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION out_rows_avail) 16770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 2:1 vertical sampling case: may need a spare row. */ 16870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 16970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 17070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPROW work_ptrs[2]; 17170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION num_rows; /* number of rows returned to caller */ 17270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 17370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (upsample->spare_full) { 17470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* If we have a spare row saved from a previous cycle, just return it. */ 17570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION size = upsample->out_row_width; 17670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_RGB 17770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->out_color_space == JCS_RGB_565) 17870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine size = cinfo->output_width*2; 17970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 18070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jcopy_sample_rows(& upsample->spare_row, 0, output_buf + *out_row_ctr, 0, 18170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 1, size); 18270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 18370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine num_rows = 1; 18470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->spare_full = FALSE; 18570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 18670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Figure number of rows to return to caller. */ 18770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine num_rows = 2; 18870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Not more than the distance to the end of the image. */ 18970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (num_rows > upsample->rows_to_go) 19070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine num_rows = upsample->rows_to_go; 19170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* And not more than what the client can accept: */ 19270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine out_rows_avail -= *out_row_ctr; 19370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (num_rows > out_rows_avail) 19470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine num_rows = out_rows_avail; 19570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Create output pointer array for upsampler. */ 19670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine work_ptrs[0] = output_buf[*out_row_ctr]; 19770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (num_rows > 1) { 19870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine work_ptrs[1] = output_buf[*out_row_ctr + 1]; 19970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 20070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine work_ptrs[1] = upsample->spare_row; 20170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->spare_full = TRUE; 20270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 20370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Now do the upsampling. */ 20470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, work_ptrs); 20570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 20670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 20770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Adjust counts */ 20870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *out_row_ctr += num_rows; 20970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->rows_to_go -= num_rows; 21070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* When the buffer is emptied, declare this input row group consumed */ 21170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! upsample->spare_full) 21270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*in_row_group_ctr)++; 21370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 21470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 21570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 21670a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void) 21770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinemerged_1v_upsample (j_decompress_ptr cinfo, 21870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, 21970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION in_row_groups_avail, 22070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, 22170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION out_rows_avail) 22270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 1:1 vertical sampling case: much easier, never need a spare row. */ 22370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 22470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 22570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 22670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Just do the upsampling. */ 22770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, 22870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine output_buf + *out_row_ctr); 22970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Adjust counts */ 23070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*out_row_ctr)++; 23170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*in_row_group_ctr)++; 23270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 23370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 23470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 23570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 23670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * These are the routines invoked by the control routines to do 23770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * the actual upsampling/conversion. One row group is processed per call. 23870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 23970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Note: since we may be writing directly into application-supplied buffers, 24070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * we have to be honest about the output width; we can't assume the buffer 24170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * has been rounded up to an even width. 24270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 24370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 24470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 24570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 24670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical. 24770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 24870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 24970a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void) 25070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineh2v1_merged_upsample (j_decompress_ptr cinfo, 25170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, 25270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPARRAY output_buf) 25370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 25470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 25570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register int y, cred, cgreen, cblue; 25670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int cb, cr; 25770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPROW outptr; 25870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPROW inptr0, inptr1, inptr2; 25970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION col; 26070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* copy these pointers into registers if possible */ 26170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPLE * range_limit = cinfo->sample_range_limit; 26270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int * Crrtab = upsample->Cr_r_tab; 26370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int * Cbbtab = upsample->Cb_b_tab; 26470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 * Crgtab = upsample->Cr_g_tab; 26570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 * Cbgtab = upsample->Cb_g_tab; 26670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SHIFT_TEMPS 26770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 26870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inptr0 = input_buf[0][in_row_group_ctr]; 26970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inptr1 = input_buf[1][in_row_group_ctr]; 27070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inptr2 = input_buf[2][in_row_group_ctr]; 27170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr = output_buf[0]; 27270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Loop for each pair of output pixels */ 27370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (col = cinfo->output_width >> 1; col > 0; col--) { 27470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Do the chroma part of the calculation */ 27570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cb = GETJSAMPLE(*inptr1++); 27670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cr = GETJSAMPLE(*inptr2++); 27770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cred = Crrtab[cr]; 27870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 27970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cblue = Cbbtab[cb]; 28070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Fetch 2 Y values and emit 2 pixels */ 28170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr0++); 28270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr[RGB_RED] = range_limit[y + cred]; 28370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr[RGB_GREEN] = range_limit[y + cgreen]; 28470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr[RGB_BLUE] = range_limit[y + cblue]; 28570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr += RGB_PIXELSIZE; 28670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr0++); 28770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr[RGB_RED] = range_limit[y + cred]; 28870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr[RGB_GREEN] = range_limit[y + cgreen]; 28970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr[RGB_BLUE] = range_limit[y + cblue]; 29070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr += RGB_PIXELSIZE; 29170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 29270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* If image width is odd, do the last output column separately */ 29370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->output_width & 1) { 29470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cb = GETJSAMPLE(*inptr1); 29570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cr = GETJSAMPLE(*inptr2); 29670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cred = Crrtab[cr]; 29770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 29870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cblue = Cbbtab[cb]; 29970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr0); 30070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr[RGB_RED] = range_limit[y + cred]; 30170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr[RGB_GREEN] = range_limit[y + cgreen]; 30270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr[RGB_BLUE] = range_limit[y + cblue]; 30370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 30470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 30570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 30670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 30770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_RGB 30870a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void) 30970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineh2v1_merged_upsample_565 (j_decompress_ptr cinfo, 31070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, 31170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPARRAY output_buf) 31270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 31370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 31470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register int y, cred, cgreen, cblue; 31570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int cb, cr; 31670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPROW outptr; 31770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPROW inptr0, inptr1, inptr2; 31870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION col; 31970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* copy these pointers into registers if possible */ 32070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPLE * range_limit = cinfo->sample_range_limit; 32170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int * Crrtab = upsample->Cr_r_tab; 32270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int * Cbbtab = upsample->Cb_b_tab; 32370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 * Crgtab = upsample->Cr_g_tab; 32470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 * Cbgtab = upsample->Cb_g_tab; 32570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine unsigned int r, g, b; 32670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 rgb; 32770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SHIFT_TEMPS 32870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 32970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inptr0 = input_buf[0][in_row_group_ctr]; 33070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inptr1 = input_buf[1][in_row_group_ctr]; 33170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inptr2 = input_buf[2][in_row_group_ctr]; 33270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr = output_buf[0]; 33370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Loop for each pair of output pixels */ 33470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (col = cinfo->output_width >> 1; col > 0; col--) { 33570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Do the chroma part of the calculation */ 33670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cb = GETJSAMPLE(*inptr1++); 33770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cr = GETJSAMPLE(*inptr2++); 33870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cred = Crrtab[cr]; 33970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 34070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cblue = Cbbtab[cb]; 34170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Fetch 2 Y values and emit 2 pixels */ 34270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr0++); 34370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine r = range_limit[y + cred]; 34470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine g = range_limit[y + cgreen]; 34570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine b = range_limit[y + cblue]; 34670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine rgb = PACK_SHORT_565(r,g,b); 34770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr0++); 34870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine r = range_limit[y + cred]; 34970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine g = range_limit[y + cgreen]; 35070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine b = range_limit[y + cblue]; 35170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r,g,b)); 35270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine WRITE_TWO_PIXELS(outptr, rgb); 35370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr += 4; 35470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 35570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* If image width is odd, do the last output column separately */ 35670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->output_width & 1) { 35770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cb = GETJSAMPLE(*inptr1); 35870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cr = GETJSAMPLE(*inptr2); 35970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cred = Crrtab[cr]; 36070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 36170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cblue = Cbbtab[cb]; 36270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr0); 36370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine r = range_limit[y + cred]; 36470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine g = range_limit[y + cgreen]; 36570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine b = range_limit[y + cblue]; 36670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine rgb = PACK_SHORT_565(r,g,b); 36770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *(INT16*)outptr = rgb; 36870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 36970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 37070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 37170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 37270a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void) 37370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineh2v1_merged_upsample_565D (j_decompress_ptr cinfo, 37470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, 37570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPARRAY output_buf) 37670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 37770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 37870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register int y, cred, cgreen, cblue; 37970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int cb, cr; 38070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPROW outptr; 38170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPROW inptr0, inptr1, inptr2; 38270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION col; 38370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* copy these pointers into registers if possible */ 38470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPLE * range_limit = cinfo->sample_range_limit; 38570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int * Crrtab = upsample->Cr_r_tab; 38670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int * Cbbtab = upsample->Cb_b_tab; 38770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 * Crgtab = upsample->Cr_g_tab; 38870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 * Cbgtab = upsample->Cb_g_tab; 38970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION col_index = 0; 39070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 d0 = dither_matrix[cinfo->output_scanline & DITHER_MASK]; 39170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine unsigned int r, g, b; 39270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 rgb; 39370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SHIFT_TEMPS 39470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 39570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inptr0 = input_buf[0][in_row_group_ctr]; 39670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inptr1 = input_buf[1][in_row_group_ctr]; 39770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inptr2 = input_buf[2][in_row_group_ctr]; 39870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr = output_buf[0]; 39970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Loop for each pair of output pixels */ 40070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (col = cinfo->output_width >> 1; col > 0; col--) { 40170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Do the chroma part of the calculation */ 40270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cb = GETJSAMPLE(*inptr1++); 40370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cr = GETJSAMPLE(*inptr2++); 40470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cred = Crrtab[cr]; 40570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 40670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cblue = Cbbtab[cb]; 40770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Fetch 2 Y values and emit 2 pixels */ 40870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr0++); 40970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine r = range_limit[DITHER_565_R(y + cred, d0)]; 41070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine g = range_limit[DITHER_565_G(y + cgreen, d0)]; 41170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine b = range_limit[DITHER_565_B(y + cblue, d0)]; 41270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine d0 = DITHER_ROTATE(d0); 41370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine rgb = PACK_SHORT_565(r,g,b); 41470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr0++); 41570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine r = range_limit[DITHER_565_R(y + cred, d0)]; 41670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine g = range_limit[DITHER_565_G(y + cgreen, d0)]; 41770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine b = range_limit[DITHER_565_B(y + cblue, d0)]; 41870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine d0 = DITHER_ROTATE(d0); 41970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r,g,b)); 42070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine WRITE_TWO_PIXELS(outptr, rgb); 42170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr += 4; 42270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 42370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* If image width is odd, do the last output column separately */ 42470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->output_width & 1) { 42570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cb = GETJSAMPLE(*inptr1); 42670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cr = GETJSAMPLE(*inptr2); 42770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cred = Crrtab[cr]; 42870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 42970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cblue = Cbbtab[cb]; 43070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr0); 43170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine r = range_limit[DITHER_565_R(y + cred, d0)]; 43270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine g = range_limit[DITHER_565_G(y + cgreen, d0)]; 43370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine b = range_limit[DITHER_565_B(y + cblue, d0)]; 43470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine rgb = PACK_SHORT_565(r,g,b); 43570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *(INT16*)outptr = rgb; 43670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 43770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 43870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 43970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 44070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 44170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 44270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 44370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical. 44470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 44570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 44670a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void) 44770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineh2v2_merged_upsample (j_decompress_ptr cinfo, 44870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, 44970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPARRAY output_buf) 45070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 45170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 45270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register int y, cred, cgreen, cblue; 45370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int cb, cr; 45470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPROW outptr0, outptr1; 45570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPROW inptr00, inptr01, inptr1, inptr2; 45670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION col; 45770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* copy these pointers into registers if possible */ 45870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPLE * range_limit = cinfo->sample_range_limit; 45970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int * Crrtab = upsample->Cr_r_tab; 46070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int * Cbbtab = upsample->Cb_b_tab; 46170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 * Crgtab = upsample->Cr_g_tab; 46270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 * Cbgtab = upsample->Cb_g_tab; 46370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SHIFT_TEMPS 46470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 46570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inptr00 = input_buf[0][in_row_group_ctr*2]; 46670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inptr01 = input_buf[0][in_row_group_ctr*2 + 1]; 46770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inptr1 = input_buf[1][in_row_group_ctr]; 46870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inptr2 = input_buf[2][in_row_group_ctr]; 46970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr0 = output_buf[0]; 47070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr1 = output_buf[1]; 47170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Loop for each group of output pixels */ 47270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (col = cinfo->output_width >> 1; col > 0; col--) { 47370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Do the chroma part of the calculation */ 47470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cb = GETJSAMPLE(*inptr1++); 47570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cr = GETJSAMPLE(*inptr2++); 47670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cred = Crrtab[cr]; 47770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 47870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cblue = Cbbtab[cb]; 47970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Fetch 4 Y values and emit 4 pixels */ 48070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr00++); 48170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr0[RGB_RED] = range_limit[y + cred]; 48270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr0[RGB_GREEN] = range_limit[y + cgreen]; 48370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr0[RGB_BLUE] = range_limit[y + cblue]; 48470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr0 += RGB_PIXELSIZE; 48570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr00++); 48670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr0[RGB_RED] = range_limit[y + cred]; 48770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr0[RGB_GREEN] = range_limit[y + cgreen]; 48870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr0[RGB_BLUE] = range_limit[y + cblue]; 48970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr0 += RGB_PIXELSIZE; 49070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr01++); 49170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr1[RGB_RED] = range_limit[y + cred]; 49270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr1[RGB_GREEN] = range_limit[y + cgreen]; 49370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr1[RGB_BLUE] = range_limit[y + cblue]; 49470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr1 += RGB_PIXELSIZE; 49570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr01++); 49670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr1[RGB_RED] = range_limit[y + cred]; 49770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr1[RGB_GREEN] = range_limit[y + cgreen]; 49870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr1[RGB_BLUE] = range_limit[y + cblue]; 49970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr1 += RGB_PIXELSIZE; 50070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 50170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* If image width is odd, do the last output column separately */ 50270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->output_width & 1) { 50370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cb = GETJSAMPLE(*inptr1); 50470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cr = GETJSAMPLE(*inptr2); 50570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cred = Crrtab[cr]; 50670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 50770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cblue = Cbbtab[cb]; 50870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr00); 50970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr0[RGB_RED] = range_limit[y + cred]; 51070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr0[RGB_GREEN] = range_limit[y + cgreen]; 51170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr0[RGB_BLUE] = range_limit[y + cblue]; 51270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr01); 51370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr1[RGB_RED] = range_limit[y + cred]; 51470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr1[RGB_GREEN] = range_limit[y + cgreen]; 51570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr1[RGB_BLUE] = range_limit[y + cblue]; 51670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 51770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 51870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 51970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 52070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_RGB 52170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 52270a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void) 52370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineh2v2_merged_upsample_565 (j_decompress_ptr cinfo, 52470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, 52570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPARRAY output_buf) 52670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 52770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 52870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register int y, cred, cgreen, cblue; 52970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int cb, cr; 53070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPROW outptr0, outptr1; 53170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPROW inptr00, inptr01, inptr1, inptr2; 53270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION col; 53370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* copy these pointers into registers if possible */ 53470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPLE * range_limit = cinfo->sample_range_limit; 53570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int * Crrtab = upsample->Cr_r_tab; 53670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int * Cbbtab = upsample->Cb_b_tab; 53770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 * Crgtab = upsample->Cr_g_tab; 53870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 * Cbgtab = upsample->Cb_g_tab; 53970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine unsigned int r, g, b; 54070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 rgb; 54170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SHIFT_TEMPS 54270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 54370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inptr00 = input_buf[0][in_row_group_ctr*2]; 54470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inptr01 = input_buf[0][in_row_group_ctr*2 + 1]; 54570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inptr1 = input_buf[1][in_row_group_ctr]; 54670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inptr2 = input_buf[2][in_row_group_ctr]; 54770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr0 = output_buf[0]; 54870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr1 = output_buf[1]; 54970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Loop for each group of output pixels */ 55070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (col = cinfo->output_width >> 1; col > 0; col--) { 55170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Do the chroma part of the calculation */ 55270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cb = GETJSAMPLE(*inptr1++); 55370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cr = GETJSAMPLE(*inptr2++); 55470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cred = Crrtab[cr]; 55570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 55670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cblue = Cbbtab[cb]; 55770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Fetch 4 Y values and emit 4 pixels */ 55870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr00++); 55970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine r = range_limit[y + cred]; 56070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine g = range_limit[y + cgreen]; 56170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine b = range_limit[y + cblue]; 56270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine rgb = PACK_SHORT_565(r,g,b); 56370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr00++); 56470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine r = range_limit[y + cred]; 56570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine g = range_limit[y + cgreen]; 56670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine b = range_limit[y + cblue]; 56770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r,g,b)); 56870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine WRITE_TWO_PIXELS(outptr0, rgb); 56970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr0 += 4; 57070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr01++); 57170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine r = range_limit[y + cred]; 57270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine g = range_limit[y + cgreen]; 57370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine b = range_limit[y + cblue]; 57470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine rgb = PACK_SHORT_565(r,g,b); 57570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr01++); 57670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine r = range_limit[y + cred]; 57770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine g = range_limit[y + cgreen]; 57870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine b = range_limit[y + cblue]; 57970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r,g,b)); 58070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine WRITE_TWO_PIXELS(outptr1, rgb); 58170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr1 += 4; 58270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 58370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* If image width is odd, do the last output column separately */ 58470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->output_width & 1) { 58570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cb = GETJSAMPLE(*inptr1); 58670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cr = GETJSAMPLE(*inptr2); 58770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cred = Crrtab[cr]; 58870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 58970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cblue = Cbbtab[cb]; 59070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr00); 59170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine r = range_limit[y + cred]; 59270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine g = range_limit[y + cgreen]; 59370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine b = range_limit[y + cblue]; 59470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine rgb = PACK_SHORT_565(r,g,b); 59570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *(INT16*)outptr0 = rgb; 59670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr01); 59770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine r = range_limit[y + cred]; 59870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine g = range_limit[y + cgreen]; 59970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine b = range_limit[y + cblue]; 60070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine rgb = PACK_SHORT_565(r,g,b); 60170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *(INT16*)outptr1 = rgb; 60270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 60370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 60470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 60570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 60670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 60770a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void) 60870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineh2v2_merged_upsample_565D (j_decompress_ptr cinfo, 60970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, 61070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPARRAY output_buf) 61170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 61270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 61370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register int y, cred, cgreen, cblue; 61470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int cb, cr; 61570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPROW outptr0, outptr1; 61670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPROW inptr00, inptr01, inptr1, inptr2; 61770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION col; 61870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* copy these pointers into registers if possible */ 61970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPLE * range_limit = cinfo->sample_range_limit; 62070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int * Crrtab = upsample->Cr_r_tab; 62170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int * Cbbtab = upsample->Cb_b_tab; 62270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 * Crgtab = upsample->Cr_g_tab; 62370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 * Cbgtab = upsample->Cb_g_tab; 62470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION col_index = 0; 62570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 d0 = dither_matrix[cinfo->output_scanline & DITHER_MASK]; 62670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 d1 = dither_matrix[(cinfo->output_scanline+1) & DITHER_MASK]; 62770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine unsigned int r, g, b; 62870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 rgb; 62970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SHIFT_TEMPS 63070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 63170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inptr00 = input_buf[0][in_row_group_ctr*2]; 63270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inptr01 = input_buf[0][in_row_group_ctr*2 + 1]; 63370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inptr1 = input_buf[1][in_row_group_ctr]; 63470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inptr2 = input_buf[2][in_row_group_ctr]; 63570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr0 = output_buf[0]; 63670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr1 = output_buf[1]; 63770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Loop for each group of output pixels */ 63870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (col = cinfo->output_width >> 1; col > 0; col--) { 63970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 64070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Do the chroma part of the calculation */ 64170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cb = GETJSAMPLE(*inptr1++); 64270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cr = GETJSAMPLE(*inptr2++); 64370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cred = Crrtab[cr]; 64470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 64570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cblue = Cbbtab[cb]; 64670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Fetch 4 Y values and emit 4 pixels */ 64770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr00++); 64870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine r = range_limit[DITHER_565_R(y + cred, d0)]; 64970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine g = range_limit[DITHER_565_G(y + cgreen, d0)]; 65070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine b = range_limit[DITHER_565_B(y + cblue, d0)]; 65170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine d0 = DITHER_ROTATE(d0); 65270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine rgb = PACK_SHORT_565(r,g,b); 65370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr00++); 65470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine r = range_limit[DITHER_565_R(y + cred, d1)]; 65570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine g = range_limit[DITHER_565_G(y + cgreen, d1)]; 65670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine b = range_limit[DITHER_565_B(y + cblue, d1)]; 65770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine d1 = DITHER_ROTATE(d1); 65870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r,g,b)); 65970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine WRITE_TWO_PIXELS(outptr0, rgb); 66070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr0 += 4; 66170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr01++); 66270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine r = range_limit[DITHER_565_R(y + cred, d0)]; 66370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine g = range_limit[DITHER_565_G(y + cgreen, d0)]; 66470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine b = range_limit[DITHER_565_B(y + cblue, d0)]; 66570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine d0 = DITHER_ROTATE(d0); 66670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine rgb = PACK_SHORT_565(r,g,b); 66770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr01++); 66870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine r = range_limit[DITHER_565_R(y + cred, d1)]; 66970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine g = range_limit[DITHER_565_G(y + cgreen, d1)]; 67070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine b = range_limit[DITHER_565_B(y + cblue, d1)]; 67170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine d1 = DITHER_ROTATE(d1); 67270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r,g,b)); 67370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine WRITE_TWO_PIXELS(outptr1, rgb); 67470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr1 += 4; 67570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 67670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* If image width is odd, do the last output column separately */ 67770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->output_width & 1) { 67870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cb = GETJSAMPLE(*inptr1); 67970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cr = GETJSAMPLE(*inptr2); 68070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cred = Crrtab[cr]; 68170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 68270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cblue = Cbbtab[cb]; 68370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr00); 68470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine r = range_limit[DITHER_565_R(y + cred, d0)]; 68570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine g = range_limit[DITHER_565_G(y + cgreen, d0)]; 68670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine b = range_limit[DITHER_565_B(y + cblue, d0)]; 68770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine rgb = PACK_SHORT_565(r,g,b); 68870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *(INT16*)outptr0 = rgb; 68970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine y = GETJSAMPLE(*inptr01); 69070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine r = range_limit[DITHER_565_R(y + cred, d1)]; 69170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine g = range_limit[DITHER_565_G(y + cgreen, d1)]; 69270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine b = range_limit[DITHER_565_B(y + cblue, d1)]; 69370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine rgb = PACK_SHORT_565(r,g,b); 69470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *(INT16*)outptr1 = rgb; 69570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 69670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 69770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 69870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 69970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 70070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 70170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Module initialization routine for merged upsampling/color conversion. 70270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 70370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * NB: this is called under the conditions determined by use_merged_upsample() 70470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * in jdmaster.c. That routine MUST correspond to the actual capabilities 70570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * of this module; no safety checks are made here. 70670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 70770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 70870a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(void) 70970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejinit_merged_upsampler (j_decompress_ptr cinfo) 71070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 71170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine my_upsample_ptr upsample; 71270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 71370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample = (my_upsample_ptr) 71470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 71570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SIZEOF(my_upsampler)); 71670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->upsample = (struct jpeg_upsampler *) upsample; 71770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->pub.start_pass = start_pass_merged_upsample; 71870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->pub.need_context_rows = FALSE; 71970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 72070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->out_row_width = cinfo->output_width * cinfo->out_color_components; 72170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 72270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->max_v_samp_factor == 2) { 72370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->pub.upsample = merged_2v_upsample; 72470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->upmethod = h2v2_merged_upsample; 72570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_RGB 72670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->out_color_space == JCS_RGB_565) { 72770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->dither_mode == JDITHER_NONE) { 72870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->upmethod = h2v2_merged_upsample_565; 72970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 73070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->upmethod = h2v2_merged_upsample_565D; 73170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 73270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 73370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 73470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Allocate a spare row buffer */ 73570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->spare_row = (JSAMPROW) 73670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, 73770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (size_t) (upsample->out_row_width * SIZEOF(JSAMPLE))); 73870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 73970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->pub.upsample = merged_1v_upsample; 74070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->upmethod = h2v1_merged_upsample; 74170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_RGB 74270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->out_color_space == JCS_RGB_565) { 74370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->dither_mode == JDITHER_NONE) { 74470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->upmethod = h2v1_merged_upsample_565; 74570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 74670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->upmethod = h2v1_merged_upsample_565D; 74770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 74870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 74970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 75070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* No spare row needed */ 75170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine upsample->spare_row = NULL; 75270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 75370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 75470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine build_ycc_rgb_table(cinfo); 75570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 75670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 75770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif /* UPSAMPLE_MERGING_SUPPORTED */ 758