1c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org/* 2c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * jdmrgext.c 3c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * 43395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org * This file was part of the Independent JPEG Group's software: 5c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * Copyright (C) 1994-1996, Thomas G. Lane. 63395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org * libjpeg-turbo Modifications: 7df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org * Copyright (C) 2011, D. R. Commander. 8c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * For conditions of distribution and use, see the accompanying README file. 9c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * 10c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * This file contains code for merged upsampling/color conversion. 11c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org */ 12c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org 13c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org 14c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org/* This file is included by jdmerge.c */ 15c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org 16c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org 17c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org/* 18c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical. 19c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org */ 20c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org 21c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.orgINLINE 22c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.orgLOCAL(void) 23c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.orgh2v1_merged_upsample_internal (j_decompress_ptr cinfo, 24c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org JSAMPIMAGE input_buf, 25c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org JDIMENSION in_row_group_ctr, 26c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org JSAMPARRAY output_buf) 27c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org{ 28c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 29c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org register int y, cred, cgreen, cblue; 30c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org int cb, cr; 31c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org register JSAMPROW outptr; 32c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org JSAMPROW inptr0, inptr1, inptr2; 33c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org JDIMENSION col; 34c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org /* copy these pointers into registers if possible */ 35c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org register JSAMPLE * range_limit = cinfo->sample_range_limit; 36c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org int * Crrtab = upsample->Cr_r_tab; 37c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org int * Cbbtab = upsample->Cb_b_tab; 38c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org INT32 * Crgtab = upsample->Cr_g_tab; 39c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org INT32 * Cbgtab = upsample->Cb_g_tab; 40c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org SHIFT_TEMPS 41c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org 42c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org inptr0 = input_buf[0][in_row_group_ctr]; 43c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org inptr1 = input_buf[1][in_row_group_ctr]; 44c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org inptr2 = input_buf[2][in_row_group_ctr]; 45c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr = output_buf[0]; 46c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org /* Loop for each pair of output pixels */ 47c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org for (col = cinfo->output_width >> 1; col > 0; col--) { 48c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org /* Do the chroma part of the calculation */ 49c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org cb = GETJSAMPLE(*inptr1++); 50c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org cr = GETJSAMPLE(*inptr2++); 51c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org cred = Crrtab[cr]; 52c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 53c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org cblue = Cbbtab[cb]; 54c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org /* Fetch 2 Y values and emit 2 pixels */ 55c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org y = GETJSAMPLE(*inptr0++); 56c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr[RGB_RED] = range_limit[y + cred]; 57c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr[RGB_GREEN] = range_limit[y + cgreen]; 58c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr[RGB_BLUE] = range_limit[y + cblue]; 59df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org#ifdef RGB_ALPHA 60df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org outptr[RGB_ALPHA] = 0xFF; 61df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org#endif 62c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr += RGB_PIXELSIZE; 63c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org y = GETJSAMPLE(*inptr0++); 64c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr[RGB_RED] = range_limit[y + cred]; 65c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr[RGB_GREEN] = range_limit[y + cgreen]; 66c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr[RGB_BLUE] = range_limit[y + cblue]; 67df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org#ifdef RGB_ALPHA 68df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org outptr[RGB_ALPHA] = 0xFF; 69df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org#endif 70c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr += RGB_PIXELSIZE; 71c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org } 72c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org /* If image width is odd, do the last output column separately */ 73c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org if (cinfo->output_width & 1) { 74c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org cb = GETJSAMPLE(*inptr1); 75c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org cr = GETJSAMPLE(*inptr2); 76c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org cred = Crrtab[cr]; 77c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 78c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org cblue = Cbbtab[cb]; 79c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org y = GETJSAMPLE(*inptr0); 80c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr[RGB_RED] = range_limit[y + cred]; 81c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr[RGB_GREEN] = range_limit[y + cgreen]; 82c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr[RGB_BLUE] = range_limit[y + cblue]; 83df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org#ifdef RGB_ALPHA 84df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org outptr[RGB_ALPHA] = 0xFF; 85df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org#endif 86c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org } 87c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org} 88c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org 89c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org 90c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org/* 91c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org * Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical. 92c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org */ 93c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org 94c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.orgINLINE 95c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.orgLOCAL(void) 96c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.orgh2v2_merged_upsample_internal (j_decompress_ptr cinfo, 97c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org JSAMPIMAGE input_buf, 98c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org JDIMENSION in_row_group_ctr, 99c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org JSAMPARRAY output_buf) 100c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org{ 101c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; 102c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org register int y, cred, cgreen, cblue; 103c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org int cb, cr; 104c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org register JSAMPROW outptr0, outptr1; 105c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org JSAMPROW inptr00, inptr01, inptr1, inptr2; 106c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org JDIMENSION col; 107c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org /* copy these pointers into registers if possible */ 108c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org register JSAMPLE * range_limit = cinfo->sample_range_limit; 109c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org int * Crrtab = upsample->Cr_r_tab; 110c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org int * Cbbtab = upsample->Cb_b_tab; 111c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org INT32 * Crgtab = upsample->Cr_g_tab; 112c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org INT32 * Cbgtab = upsample->Cb_g_tab; 113c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org SHIFT_TEMPS 114c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org 115c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org inptr00 = input_buf[0][in_row_group_ctr*2]; 116c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org inptr01 = input_buf[0][in_row_group_ctr*2 + 1]; 117c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org inptr1 = input_buf[1][in_row_group_ctr]; 118c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org inptr2 = input_buf[2][in_row_group_ctr]; 119c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr0 = output_buf[0]; 120c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr1 = output_buf[1]; 121c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org /* Loop for each group of output pixels */ 122c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org for (col = cinfo->output_width >> 1; col > 0; col--) { 123c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org /* Do the chroma part of the calculation */ 124c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org cb = GETJSAMPLE(*inptr1++); 125c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org cr = GETJSAMPLE(*inptr2++); 126c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org cred = Crrtab[cr]; 127c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 128c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org cblue = Cbbtab[cb]; 129c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org /* Fetch 4 Y values and emit 4 pixels */ 130c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org y = GETJSAMPLE(*inptr00++); 131c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr0[RGB_RED] = range_limit[y + cred]; 132c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr0[RGB_GREEN] = range_limit[y + cgreen]; 133c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr0[RGB_BLUE] = range_limit[y + cblue]; 134df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org#ifdef RGB_ALPHA 135df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org outptr0[RGB_ALPHA] = 0xFF; 136df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org#endif 137c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr0 += RGB_PIXELSIZE; 138c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org y = GETJSAMPLE(*inptr00++); 139c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr0[RGB_RED] = range_limit[y + cred]; 140c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr0[RGB_GREEN] = range_limit[y + cgreen]; 141c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr0[RGB_BLUE] = range_limit[y + cblue]; 142df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org#ifdef RGB_ALPHA 143df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org outptr0[RGB_ALPHA] = 0xFF; 144df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org#endif 145c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr0 += RGB_PIXELSIZE; 146c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org y = GETJSAMPLE(*inptr01++); 147c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr1[RGB_RED] = range_limit[y + cred]; 148c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr1[RGB_GREEN] = range_limit[y + cgreen]; 149c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr1[RGB_BLUE] = range_limit[y + cblue]; 150df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org#ifdef RGB_ALPHA 151df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org outptr1[RGB_ALPHA] = 0xFF; 152df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org#endif 153c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr1 += RGB_PIXELSIZE; 154c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org y = GETJSAMPLE(*inptr01++); 155c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr1[RGB_RED] = range_limit[y + cred]; 156c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr1[RGB_GREEN] = range_limit[y + cgreen]; 157c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr1[RGB_BLUE] = range_limit[y + cblue]; 158df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org#ifdef RGB_ALPHA 159df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org outptr1[RGB_ALPHA] = 0xFF; 160df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org#endif 161c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr1 += RGB_PIXELSIZE; 162c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org } 163c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org /* If image width is odd, do the last output column separately */ 164c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org if (cinfo->output_width & 1) { 165c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org cb = GETJSAMPLE(*inptr1); 166c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org cr = GETJSAMPLE(*inptr2); 167c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org cred = Crrtab[cr]; 168c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); 169c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org cblue = Cbbtab[cb]; 170c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org y = GETJSAMPLE(*inptr00); 171c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr0[RGB_RED] = range_limit[y + cred]; 172c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr0[RGB_GREEN] = range_limit[y + cgreen]; 173c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr0[RGB_BLUE] = range_limit[y + cblue]; 174df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org#ifdef RGB_ALPHA 175df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org outptr0[RGB_ALPHA] = 0xFF; 176df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org#endif 177c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org y = GETJSAMPLE(*inptr01); 178c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr1[RGB_RED] = range_limit[y + cred]; 179c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr1[RGB_GREEN] = range_limit[y + cgreen]; 180c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org outptr1[RGB_BLUE] = range_limit[y + cblue]; 181df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org#ifdef RGB_ALPHA 182df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org outptr1[RGB_ALPHA] = 0xFF; 183df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org#endif 184c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org } 185c6beb74efd1b43982a5b6c957c57426442359c17hbono@chromium.org} 186