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