19f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 29f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * jdmerge.c 39f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 49f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Copyright (C) 1994-1996, Thomas G. Lane. 59f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file is part of the Independent JPEG Group's software. 69f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * For conditions of distribution and use, see the accompanying README file. 79f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 89f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file contains code for merged upsampling/color conversion. 99f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file combines functions from jdsample.c and jdcolor.c; 119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * read those files first to understand what's going on. 129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * When the chroma components are to be upsampled by simple replication 149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (ie, box filtering), we can save some work in color conversion by 159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * calculating all the output pixels corresponding to a pair of chroma 169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * samples at one time. In the conversion equations 179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * R = Y + K1 * Cr 189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * G = Y + K2 * Cb + K3 * Cr 199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * B = Y + K4 * Cb 209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * only the Y term varies among the group of pixels corresponding to a pair 219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * of chroma samples, so the rest of the terms can be calculated just once. 229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * At typical sampling ratios, this eliminates half or three-quarters of the 239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * multiplications needed for color conversion. 249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file currently provides implementations for the following cases: 269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * YCbCr => RGB color conversion only. 279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Sampling ratios of 2h1v or 2h2v. 289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * No scaling needed at upsample time. 299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Corner-aligned (non-CCIR601) sampling alignment. 309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Other special cases could be added, but in most applications these are 319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * the only common cases. (For uncommon cases we fall back on the more 329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * general code in jdsample.c and jdcolor.c.) 339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define JPEG_INTERNALS 369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jinclude.h" 379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jpeglib.h" 389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef UPSAMPLE_MERGING_SUPPORTED 409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef ANDROID_RGB 429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Declarations for ordered dithering. 449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * We use 4x4 ordered dither array packed into 32 bits. This array is 469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * sufficent for dithering RGB_888 to RGB_565. 479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define DITHER_MASK 0x3 509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define DITHER_ROTATE(x) (((x)<<24) | (((x)>>8)&0x00FFFFFF)) 519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstatic const INT32 dither_matrix[4] = { 529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 0x0008020A, 539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 0x0C040E06, 549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 0x030B0109, 559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 0x0F070D05 569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}; 579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Private subobject */ 619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef struct { 639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project struct jpeg_upsampler pub; /* public fields */ 649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Pointer to routine to do actual upsampling/conversion of one row group */ 669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JMETHOD(void, upmethod, (j_decompress_ptr cinfo, 679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, 689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY output_buf)); 699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Private state for YCC->RGB conversion */ 719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int * Cr_r_tab; /* => table for Cr to R conversion */ 729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int * Cb_b_tab; /* => table for Cb to B conversion */ 739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 * Cr_g_tab; /* => table for Cr to G conversion */ 749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 * Cb_g_tab; /* => table for Cb to G conversion */ 759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* For 2:1 vertical sampling, we produce two output rows at a time. 779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * We need a "spare" row buffer to hold the second output row if the 789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * application provides just a one-row buffer; we also use the spare 799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * to discard the dummy last row if the image height is odd. 809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPROW spare_row; 829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project boolean spare_full; /* T if spare buffer is occupied */ 839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION out_row_width; /* samples per output row */ 859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION rows_to_go; /* counts rows remaining in image */ 869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} my_upsampler; 879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef my_upsampler * my_upsample_ptr; 899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define SCALEBITS 16 /* speediest right-shift on some machines */ 919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define ONE_HALF ((INT32) 1 << (SCALEBITS-1)) 929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define FIX(x) ((INT32) ((x) * (1L<<SCALEBITS) + 0.5)) 939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Initialize tables for YCC->RGB colorspace conversion. 979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This is taken directly from jdcolor.c; see that file for more info. 989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void) 1019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectbuild_ycc_rgb_table (j_decompress_ptr cinfo) 1029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 1049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int i; 1059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 x; 1069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project SHIFT_TEMPS 1079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->Cr_r_tab = (int *) 1099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 1109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (MAXJSAMPLE+1) * SIZEOF(int)); 1119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->Cb_b_tab = (int *) 1129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 1139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (MAXJSAMPLE+1) * SIZEOF(int)); 1149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->Cr_g_tab = (INT32 *) 1159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 1169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (MAXJSAMPLE+1) * SIZEOF(INT32)); 1179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->Cb_g_tab = (INT32 *) 1189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 1199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (MAXJSAMPLE+1) * SIZEOF(INT32)); 1209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) { 1229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */ 1239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */ 1249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Cr=>R value is nearest int to 1.40200 * x */ 1259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->Cr_r_tab[i] = (int) 1269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS); 1279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Cb=>B value is nearest int to 1.77200 * x */ 1289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->Cb_b_tab[i] = (int) 1299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS); 1309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Cr=>G value is scaled-up -0.71414 * x */ 1319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x; 1329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Cb=>G value is scaled-up -0.34414 * x */ 1339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We also add in ONE_HALF so that need not do it in inner loop */ 1349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF; 1359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 1409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Initialize for an upsampling pass. 1419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 1449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstart_pass_merged_upsample (j_decompress_ptr cinfo) 1459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 1479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Mark the spare buffer empty */ 1499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->spare_full = FALSE; 1509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Initialize total-height counter for detecting bottom of image */ 1519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->rows_to_go = cinfo->output_height; 1529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 1569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Control routine to do upsampling (and color conversion). 1579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 1589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The control routine just handles the row buffering considerations. 1599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 1629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectmerged_2v_upsample (j_decompress_ptr cinfo, 1639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, 1649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION in_row_groups_avail, 1659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, 1669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION out_rows_avail) 1679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 2:1 vertical sampling case: may need a spare row. */ 1689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 1709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPROW work_ptrs[2]; 1719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION num_rows; /* number of rows returned to caller */ 1729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (upsample->spare_full) { 1749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* If we have a spare row saved from a previous cycle, just return it. */ 1759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION size = upsample->out_row_width; 1769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef ANDROID_RGB 1779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->out_color_space == JCS_RGB_565) 1789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project size = cinfo->output_width*2; 1799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 1809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jcopy_sample_rows(& upsample->spare_row, 0, output_buf + *out_row_ctr, 0, 1819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1, size); 1829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project num_rows = 1; 1849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->spare_full = FALSE; 1859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 1869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Figure number of rows to return to caller. */ 1879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project num_rows = 2; 1889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Not more than the distance to the end of the image. */ 1899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (num_rows > upsample->rows_to_go) 1909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project num_rows = upsample->rows_to_go; 1919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* And not more than what the client can accept: */ 1929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project out_rows_avail -= *out_row_ctr; 1939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (num_rows > out_rows_avail) 1949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project num_rows = out_rows_avail; 1959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Create output pointer array for upsampler. */ 1969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project work_ptrs[0] = output_buf[*out_row_ctr]; 1979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (num_rows > 1) { 1989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project work_ptrs[1] = output_buf[*out_row_ctr + 1]; 1999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 2009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project work_ptrs[1] = upsample->spare_row; 2019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->spare_full = TRUE; 2029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Now do the upsampling. */ 2049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, work_ptrs); 2059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Adjust counts */ 2089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *out_row_ctr += num_rows; 2099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->rows_to_go -= num_rows; 2109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* When the buffer is emptied, declare this input row group consumed */ 2119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! upsample->spare_full) 2129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*in_row_group_ctr)++; 2139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 2149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 2179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectmerged_1v_upsample (j_decompress_ptr cinfo, 2189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, 2199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION in_row_groups_avail, 2209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, 2219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION out_rows_avail) 2229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 1:1 vertical sampling case: much easier, never need a spare row. */ 2239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 2249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 2259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Just do the upsampling. */ 2279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, 2289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project output_buf + *out_row_ctr); 2299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Adjust counts */ 2309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*out_row_ctr)++; 2319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*in_row_group_ctr)++; 2329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 2339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 2369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * These are the routines invoked by the control routines to do 2379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * the actual upsampling/conversion. One row group is processed per call. 2389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 2399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Note: since we may be writing directly into application-supplied buffers, 2409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * we have to be honest about the output width; we can't assume the buffer 2419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * has been rounded up to an even width. 2429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 2469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical. 2479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 2509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecth2v1_merged_upsample (j_decompress_ptr cinfo, 2519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, 2529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY output_buf) 2539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 2549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 2559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register int y, cred, cgreen, cblue; 2569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int cb, cr; 2579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JSAMPROW outptr; 2589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPROW inptr0, inptr1, inptr2; 2599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION col; 2609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* copy these pointers into registers if possible */ 2619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JSAMPLE * range_limit = cinfo->sample_range_limit; 2629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int * Crrtab = upsample->Cr_r_tab; 2639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int * Cbbtab = upsample->Cb_b_tab; 2649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 * Crgtab = upsample->Cr_g_tab; 2659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 * Cbgtab = upsample->Cb_g_tab; 2669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project SHIFT_TEMPS 2679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr0 = input_buf[0][in_row_group_ctr]; 2699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr1 = input_buf[1][in_row_group_ctr]; 2709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr2 = input_buf[2][in_row_group_ctr]; 2719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr = output_buf[0]; 2729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Loop for each pair of output pixels */ 2739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (col = cinfo->output_width >> 1; col > 0; col--) { 2749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Do the chroma part of the calculation */ 2759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cb = GETJSAMPLE(*inptr1++); 2769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cr = GETJSAMPLE(*inptr2++); 2779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cred = Crrtab[cr]; 2789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 2799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cblue = Cbbtab[cb]; 2809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Fetch 2 Y values and emit 2 pixels */ 2819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr0++); 2829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr[RGB_RED] = range_limit[y + cred]; 2839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr[RGB_GREEN] = range_limit[y + cgreen]; 2849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr[RGB_BLUE] = range_limit[y + cblue]; 2859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr += RGB_PIXELSIZE; 2869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr0++); 2879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr[RGB_RED] = range_limit[y + cred]; 2889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr[RGB_GREEN] = range_limit[y + cgreen]; 2899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr[RGB_BLUE] = range_limit[y + cblue]; 2909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr += RGB_PIXELSIZE; 2919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* If image width is odd, do the last output column separately */ 2939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->output_width & 1) { 2949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cb = GETJSAMPLE(*inptr1); 2959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cr = GETJSAMPLE(*inptr2); 2969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cred = Crrtab[cr]; 2979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 2989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cblue = Cbbtab[cb]; 2999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr0); 3009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr[RGB_RED] = range_limit[y + cred]; 3019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr[RGB_GREEN] = range_limit[y + cgreen]; 3029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr[RGB_BLUE] = range_limit[y + cblue]; 3039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 3059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef ANDROID_RGB 3089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 3099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecth2v1_merged_upsample_565 (j_decompress_ptr cinfo, 3109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, 3119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY output_buf) 3129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 3139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 3149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register int y, cred, cgreen, cblue; 3159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int cb, cr; 3169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JSAMPROW outptr; 3179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPROW inptr0, inptr1, inptr2; 3189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION col; 3199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* copy these pointers into registers if possible */ 3209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JSAMPLE * range_limit = cinfo->sample_range_limit; 3219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int * Crrtab = upsample->Cr_r_tab; 3229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int * Cbbtab = upsample->Cb_b_tab; 3239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 * Crgtab = upsample->Cr_g_tab; 3249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 * Cbgtab = upsample->Cb_g_tab; 3259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project unsigned int r, g, b; 3269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 rgb; 3279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project SHIFT_TEMPS 3289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr0 = input_buf[0][in_row_group_ctr]; 3309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr1 = input_buf[1][in_row_group_ctr]; 3319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr2 = input_buf[2][in_row_group_ctr]; 3329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr = output_buf[0]; 3339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Loop for each pair of output pixels */ 3349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (col = cinfo->output_width >> 1; col > 0; col--) { 3359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Do the chroma part of the calculation */ 3369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cb = GETJSAMPLE(*inptr1++); 3379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cr = GETJSAMPLE(*inptr2++); 3389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cred = Crrtab[cr]; 3399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 3409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cblue = Cbbtab[cb]; 3419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Fetch 2 Y values and emit 2 pixels */ 3429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr0++); 3439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project r = range_limit[y + cred]; 3449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project g = range_limit[y + cgreen]; 3459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project b = range_limit[y + cblue]; 3469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project rgb = PACK_SHORT_565(r,g,b); 3479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr0++); 3489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project r = range_limit[y + cred]; 3499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project g = range_limit[y + cgreen]; 3509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project b = range_limit[y + cblue]; 3519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r,g,b)); 3529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project WRITE_TWO_PIXELS(outptr, rgb); 3539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr += 4; 3549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* If image width is odd, do the last output column separately */ 3569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->output_width & 1) { 3579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cb = GETJSAMPLE(*inptr1); 3589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cr = GETJSAMPLE(*inptr2); 3599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cred = Crrtab[cr]; 3609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 3619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cblue = Cbbtab[cb]; 3629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr0); 3639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project r = range_limit[y + cred]; 3649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project g = range_limit[y + cgreen]; 3659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project b = range_limit[y + cblue]; 3669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project rgb = PACK_SHORT_565(r,g,b); 3679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *(INT16*)outptr = rgb; 3689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 3709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 3739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecth2v1_merged_upsample_565D (j_decompress_ptr cinfo, 3749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, 3759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY output_buf) 3769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 3779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 3789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register int y, cred, cgreen, cblue; 3799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int cb, cr; 3809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JSAMPROW outptr; 3819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPROW inptr0, inptr1, inptr2; 3829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION col; 3839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* copy these pointers into registers if possible */ 3849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JSAMPLE * range_limit = cinfo->sample_range_limit; 3859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int * Crrtab = upsample->Cr_r_tab; 3869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int * Cbbtab = upsample->Cb_b_tab; 3879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 * Crgtab = upsample->Cr_g_tab; 3889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 * Cbgtab = upsample->Cb_g_tab; 3899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION col_index = 0; 3909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 d0 = dither_matrix[cinfo->output_scanline & DITHER_MASK]; 3919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project unsigned int r, g, b; 3929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 rgb; 3939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project SHIFT_TEMPS 3949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr0 = input_buf[0][in_row_group_ctr]; 3969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr1 = input_buf[1][in_row_group_ctr]; 3979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr2 = input_buf[2][in_row_group_ctr]; 3989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr = output_buf[0]; 3999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Loop for each pair of output pixels */ 4009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (col = cinfo->output_width >> 1; col > 0; col--) { 4019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Do the chroma part of the calculation */ 4029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cb = GETJSAMPLE(*inptr1++); 4039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cr = GETJSAMPLE(*inptr2++); 4049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cred = Crrtab[cr]; 4059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 4069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cblue = Cbbtab[cb]; 4079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Fetch 2 Y values and emit 2 pixels */ 4089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr0++); 4099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project r = range_limit[DITHER_565_R(y + cred, d0)]; 4109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project g = range_limit[DITHER_565_G(y + cgreen, d0)]; 4119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project b = range_limit[DITHER_565_B(y + cblue, d0)]; 4129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project d0 = DITHER_ROTATE(d0); 4139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project rgb = PACK_SHORT_565(r,g,b); 4149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr0++); 4159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project r = range_limit[DITHER_565_R(y + cred, d0)]; 4169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project g = range_limit[DITHER_565_G(y + cgreen, d0)]; 4179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project b = range_limit[DITHER_565_B(y + cblue, d0)]; 4189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project d0 = DITHER_ROTATE(d0); 4199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r,g,b)); 4209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project WRITE_TWO_PIXELS(outptr, rgb); 4219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr += 4; 4229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 4239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* If image width is odd, do the last output column separately */ 4249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->output_width & 1) { 4259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cb = GETJSAMPLE(*inptr1); 4269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cr = GETJSAMPLE(*inptr2); 4279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cred = Crrtab[cr]; 4289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 4299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cblue = Cbbtab[cb]; 4309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr0); 4319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project r = range_limit[DITHER_565_R(y + cred, d0)]; 4329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project g = range_limit[DITHER_565_G(y + cgreen, d0)]; 4339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project b = range_limit[DITHER_565_B(y + cblue, d0)]; 4349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project rgb = PACK_SHORT_565(r,g,b); 4359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *(INT16*)outptr = rgb; 4369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 4379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 4389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 4419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 4439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical. 4449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 4459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 4479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecth2v2_merged_upsample (j_decompress_ptr cinfo, 4489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, 4499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY output_buf) 4509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 4519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 4529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register int y, cred, cgreen, cblue; 4539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int cb, cr; 4549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JSAMPROW outptr0, outptr1; 4559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPROW inptr00, inptr01, inptr1, inptr2; 4569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION col; 4579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* copy these pointers into registers if possible */ 4589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JSAMPLE * range_limit = cinfo->sample_range_limit; 4599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int * Crrtab = upsample->Cr_r_tab; 4609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int * Cbbtab = upsample->Cb_b_tab; 4619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 * Crgtab = upsample->Cr_g_tab; 4629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 * Cbgtab = upsample->Cb_g_tab; 4639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project SHIFT_TEMPS 4649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr00 = input_buf[0][in_row_group_ctr*2]; 4669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr01 = input_buf[0][in_row_group_ctr*2 + 1]; 4679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr1 = input_buf[1][in_row_group_ctr]; 4689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr2 = input_buf[2][in_row_group_ctr]; 4699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr0 = output_buf[0]; 4709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr1 = output_buf[1]; 4719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Loop for each group of output pixels */ 4729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (col = cinfo->output_width >> 1; col > 0; col--) { 4739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Do the chroma part of the calculation */ 4749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cb = GETJSAMPLE(*inptr1++); 4759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cr = GETJSAMPLE(*inptr2++); 4769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cred = Crrtab[cr]; 4779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 4789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cblue = Cbbtab[cb]; 4799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Fetch 4 Y values and emit 4 pixels */ 4809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr00++); 4819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr0[RGB_RED] = range_limit[y + cred]; 4829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr0[RGB_GREEN] = range_limit[y + cgreen]; 4839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr0[RGB_BLUE] = range_limit[y + cblue]; 4849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr0 += RGB_PIXELSIZE; 4859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr00++); 4869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr0[RGB_RED] = range_limit[y + cred]; 4879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr0[RGB_GREEN] = range_limit[y + cgreen]; 4889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr0[RGB_BLUE] = range_limit[y + cblue]; 4899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr0 += RGB_PIXELSIZE; 4909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr01++); 4919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr1[RGB_RED] = range_limit[y + cred]; 4929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr1[RGB_GREEN] = range_limit[y + cgreen]; 4939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr1[RGB_BLUE] = range_limit[y + cblue]; 4949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr1 += RGB_PIXELSIZE; 4959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr01++); 4969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr1[RGB_RED] = range_limit[y + cred]; 4979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr1[RGB_GREEN] = range_limit[y + cgreen]; 4989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr1[RGB_BLUE] = range_limit[y + cblue]; 4999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr1 += RGB_PIXELSIZE; 5009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* If image width is odd, do the last output column separately */ 5029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->output_width & 1) { 5039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cb = GETJSAMPLE(*inptr1); 5049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cr = GETJSAMPLE(*inptr2); 5059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cred = Crrtab[cr]; 5069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 5079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cblue = Cbbtab[cb]; 5089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr00); 5099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr0[RGB_RED] = range_limit[y + cred]; 5109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr0[RGB_GREEN] = range_limit[y + cgreen]; 5119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr0[RGB_BLUE] = range_limit[y + cblue]; 5129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr01); 5139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr1[RGB_RED] = range_limit[y + cred]; 5149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr1[RGB_GREEN] = range_limit[y + cgreen]; 5159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr1[RGB_BLUE] = range_limit[y + cblue]; 5169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 5189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef ANDROID_RGB 5219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 5239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecth2v2_merged_upsample_565 (j_decompress_ptr cinfo, 5249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, 5259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY output_buf) 5269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 5279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 5289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register int y, cred, cgreen, cblue; 5299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int cb, cr; 5309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JSAMPROW outptr0, outptr1; 5319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPROW inptr00, inptr01, inptr1, inptr2; 5329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION col; 5339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* copy these pointers into registers if possible */ 5349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JSAMPLE * range_limit = cinfo->sample_range_limit; 5359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int * Crrtab = upsample->Cr_r_tab; 5369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int * Cbbtab = upsample->Cb_b_tab; 5379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 * Crgtab = upsample->Cr_g_tab; 5389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 * Cbgtab = upsample->Cb_g_tab; 5399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project unsigned int r, g, b; 5409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 rgb; 5419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project SHIFT_TEMPS 5429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr00 = input_buf[0][in_row_group_ctr*2]; 5449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr01 = input_buf[0][in_row_group_ctr*2 + 1]; 5459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr1 = input_buf[1][in_row_group_ctr]; 5469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr2 = input_buf[2][in_row_group_ctr]; 5479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr0 = output_buf[0]; 5489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr1 = output_buf[1]; 5499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Loop for each group of output pixels */ 5509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (col = cinfo->output_width >> 1; col > 0; col--) { 5519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Do the chroma part of the calculation */ 5529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cb = GETJSAMPLE(*inptr1++); 5539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cr = GETJSAMPLE(*inptr2++); 5549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cred = Crrtab[cr]; 5559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 5569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cblue = Cbbtab[cb]; 5579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Fetch 4 Y values and emit 4 pixels */ 5589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr00++); 5599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project r = range_limit[y + cred]; 5609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project g = range_limit[y + cgreen]; 5619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project b = range_limit[y + cblue]; 5629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project rgb = PACK_SHORT_565(r,g,b); 5639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr00++); 5649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project r = range_limit[y + cred]; 5659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project g = range_limit[y + cgreen]; 5669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project b = range_limit[y + cblue]; 5679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r,g,b)); 5689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project WRITE_TWO_PIXELS(outptr0, rgb); 5699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr0 += 4; 5709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr01++); 5719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project r = range_limit[y + cred]; 5729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project g = range_limit[y + cgreen]; 5739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project b = range_limit[y + cblue]; 5749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project rgb = PACK_SHORT_565(r,g,b); 5759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr01++); 5769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project r = range_limit[y + cred]; 5779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project g = range_limit[y + cgreen]; 5789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project b = range_limit[y + cblue]; 5799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r,g,b)); 5809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project WRITE_TWO_PIXELS(outptr1, rgb); 5819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr1 += 4; 5829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* If image width is odd, do the last output column separately */ 5849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->output_width & 1) { 5859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cb = GETJSAMPLE(*inptr1); 5869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cr = GETJSAMPLE(*inptr2); 5879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cred = Crrtab[cr]; 5889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 5899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cblue = Cbbtab[cb]; 5909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr00); 5919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project r = range_limit[y + cred]; 5929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project g = range_limit[y + cgreen]; 5939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project b = range_limit[y + cblue]; 5949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project rgb = PACK_SHORT_565(r,g,b); 5959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *(INT16*)outptr0 = rgb; 5969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr01); 5979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project r = range_limit[y + cred]; 5989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project g = range_limit[y + cgreen]; 5999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project b = range_limit[y + cblue]; 6009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project rgb = PACK_SHORT_565(r,g,b); 6019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *(INT16*)outptr1 = rgb; 6029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 6039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 6049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 6059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 6069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 6079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 6089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecth2v2_merged_upsample_565D (j_decompress_ptr cinfo, 6099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, 6109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY output_buf) 6119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 6129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 6139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register int y, cred, cgreen, cblue; 6149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int cb, cr; 6159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JSAMPROW outptr0, outptr1; 6169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPROW inptr00, inptr01, inptr1, inptr2; 6179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION col; 6189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* copy these pointers into registers if possible */ 6199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JSAMPLE * range_limit = cinfo->sample_range_limit; 6209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int * Crrtab = upsample->Cr_r_tab; 6219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int * Cbbtab = upsample->Cb_b_tab; 6229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 * Crgtab = upsample->Cr_g_tab; 6239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 * Cbgtab = upsample->Cb_g_tab; 6249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION col_index = 0; 6259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 d0 = dither_matrix[cinfo->output_scanline & DITHER_MASK]; 6269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 d1 = dither_matrix[(cinfo->output_scanline+1) & DITHER_MASK]; 6279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project unsigned int r, g, b; 6289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 rgb; 6299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project SHIFT_TEMPS 6309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 6319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr00 = input_buf[0][in_row_group_ctr*2]; 6329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr01 = input_buf[0][in_row_group_ctr*2 + 1]; 6339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr1 = input_buf[1][in_row_group_ctr]; 6349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr2 = input_buf[2][in_row_group_ctr]; 6359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr0 = output_buf[0]; 6369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr1 = output_buf[1]; 6379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Loop for each group of output pixels */ 6389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (col = cinfo->output_width >> 1; col > 0; col--) { 6399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 6409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Do the chroma part of the calculation */ 6419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cb = GETJSAMPLE(*inptr1++); 6429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cr = GETJSAMPLE(*inptr2++); 6439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cred = Crrtab[cr]; 6449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 6459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cblue = Cbbtab[cb]; 6469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Fetch 4 Y values and emit 4 pixels */ 6479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr00++); 6489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project r = range_limit[DITHER_565_R(y + cred, d0)]; 6499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project g = range_limit[DITHER_565_G(y + cgreen, d0)]; 6509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project b = range_limit[DITHER_565_B(y + cblue, d0)]; 6519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project d0 = DITHER_ROTATE(d0); 6529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project rgb = PACK_SHORT_565(r,g,b); 6539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr00++); 6549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project r = range_limit[DITHER_565_R(y + cred, d1)]; 6559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project g = range_limit[DITHER_565_G(y + cgreen, d1)]; 6569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project b = range_limit[DITHER_565_B(y + cblue, d1)]; 6579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project d1 = DITHER_ROTATE(d1); 6589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r,g,b)); 6599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project WRITE_TWO_PIXELS(outptr0, rgb); 6609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr0 += 4; 6619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr01++); 6629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project r = range_limit[DITHER_565_R(y + cred, d0)]; 6639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project g = range_limit[DITHER_565_G(y + cgreen, d0)]; 6649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project b = range_limit[DITHER_565_B(y + cblue, d0)]; 6659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project d0 = DITHER_ROTATE(d0); 6669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project rgb = PACK_SHORT_565(r,g,b); 6679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr01++); 6689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project r = range_limit[DITHER_565_R(y + cred, d1)]; 6699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project g = range_limit[DITHER_565_G(y + cgreen, d1)]; 6709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project b = range_limit[DITHER_565_B(y + cblue, d1)]; 6719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project d1 = DITHER_ROTATE(d1); 6729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r,g,b)); 6739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project WRITE_TWO_PIXELS(outptr1, rgb); 6749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr1 += 4; 6759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 6769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* If image width is odd, do the last output column separately */ 6779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->output_width & 1) { 6789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cb = GETJSAMPLE(*inptr1); 6799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cr = GETJSAMPLE(*inptr2); 6809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cred = Crrtab[cr]; 6819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 6829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cblue = Cbbtab[cb]; 6839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr00); 6849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project r = range_limit[DITHER_565_R(y + cred, d0)]; 6859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project g = range_limit[DITHER_565_G(y + cgreen, d0)]; 6869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project b = range_limit[DITHER_565_B(y + cblue, d0)]; 6879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project rgb = PACK_SHORT_565(r,g,b); 6889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *(INT16*)outptr0 = rgb; 6899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project y = GETJSAMPLE(*inptr01); 6909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project r = range_limit[DITHER_565_R(y + cred, d1)]; 6919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project g = range_limit[DITHER_565_G(y + cgreen, d1)]; 6929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project b = range_limit[DITHER_565_B(y + cblue, d1)]; 6939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project rgb = PACK_SHORT_565(r,g,b); 6949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *(INT16*)outptr1 = rgb; 6959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 6969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 6979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 6989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 6999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 7009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 7019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Module initialization routine for merged upsampling/color conversion. 7029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 7039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * NB: this is called under the conditions determined by use_merged_upsample() 7049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * in jdmaster.c. That routine MUST correspond to the actual capabilities 7059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * of this module; no safety checks are made here. 7069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 7079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 7089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void) 7099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjinit_merged_upsampler (j_decompress_ptr cinfo) 7109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 7119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project my_upsample_ptr upsample; 7129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 7139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample = (my_upsample_ptr) 7149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 7159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project SIZEOF(my_upsampler)); 7169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->upsample = (struct jpeg_upsampler *) upsample; 7179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->pub.start_pass = start_pass_merged_upsample; 7189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->pub.need_context_rows = FALSE; 7199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 7209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->out_row_width = cinfo->output_width * cinfo->out_color_components; 7219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 7229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->max_v_samp_factor == 2) { 7239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->pub.upsample = merged_2v_upsample; 7249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->upmethod = h2v2_merged_upsample; 7259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef ANDROID_RGB 7269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->out_color_space == JCS_RGB_565) { 7279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->dither_mode == JDITHER_NONE) { 7289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->upmethod = h2v2_merged_upsample_565; 7299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 7309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->upmethod = h2v2_merged_upsample_565D; 7319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 7329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 7339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 7349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Allocate a spare row buffer */ 7359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->spare_row = (JSAMPROW) 7369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, 7379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (size_t) (upsample->out_row_width * SIZEOF(JSAMPLE))); 7389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 7399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->pub.upsample = merged_1v_upsample; 7409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->upmethod = h2v1_merged_upsample; 7419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef ANDROID_RGB 7429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->out_color_space == JCS_RGB_565) { 7439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->dither_mode == JDITHER_NONE) { 7449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->upmethod = h2v1_merged_upsample_565; 7459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 7469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->upmethod = h2v1_merged_upsample_565D; 7479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 7489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 7499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 7509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* No spare row needed */ 7519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project upsample->spare_row = NULL; 7529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 7539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 7549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project build_ycc_rgb_table(cinfo); 7559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 7569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 7579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* UPSAMPLE_MERGING_SUPPORTED */ 758