xref: /aosp_15_r20/external/libjpeg-turbo/jdcol565.c (revision dfc6aa5c1cfd4bc4e2018dc74aa96e29ee49c6da)
1*dfc6aa5cSAndroid Build Coastguard Worker /*
2*dfc6aa5cSAndroid Build Coastguard Worker  * jdcol565.c
3*dfc6aa5cSAndroid Build Coastguard Worker  *
4*dfc6aa5cSAndroid Build Coastguard Worker  * This file was part of the Independent JPEG Group's software:
5*dfc6aa5cSAndroid Build Coastguard Worker  * Copyright (C) 1991-1997, Thomas G. Lane.
6*dfc6aa5cSAndroid Build Coastguard Worker  * Modifications:
7*dfc6aa5cSAndroid Build Coastguard Worker  * Copyright (C) 2013, Linaro Limited.
8*dfc6aa5cSAndroid Build Coastguard Worker  * Copyright (C) 2014-2015, D. R. Commander.
9*dfc6aa5cSAndroid Build Coastguard Worker  * For conditions of distribution and use, see the accompanying README.ijg
10*dfc6aa5cSAndroid Build Coastguard Worker  * file.
11*dfc6aa5cSAndroid Build Coastguard Worker  *
12*dfc6aa5cSAndroid Build Coastguard Worker  * This file contains output colorspace conversion routines.
13*dfc6aa5cSAndroid Build Coastguard Worker  */
14*dfc6aa5cSAndroid Build Coastguard Worker 
15*dfc6aa5cSAndroid Build Coastguard Worker /* This file is included by jdcolor.c */
16*dfc6aa5cSAndroid Build Coastguard Worker 
17*dfc6aa5cSAndroid Build Coastguard Worker 
18*dfc6aa5cSAndroid Build Coastguard Worker INLINE
LOCAL(void)19*dfc6aa5cSAndroid Build Coastguard Worker LOCAL(void)
20*dfc6aa5cSAndroid Build Coastguard Worker ycc_rgb565_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
21*dfc6aa5cSAndroid Build Coastguard Worker                             JDIMENSION input_row, JSAMPARRAY output_buf,
22*dfc6aa5cSAndroid Build Coastguard Worker                             int num_rows)
23*dfc6aa5cSAndroid Build Coastguard Worker {
24*dfc6aa5cSAndroid Build Coastguard Worker   my_cconvert_ptr cconvert = (my_cconvert_ptr)cinfo->cconvert;
25*dfc6aa5cSAndroid Build Coastguard Worker   register int y, cb, cr;
26*dfc6aa5cSAndroid Build Coastguard Worker   register JSAMPROW outptr;
27*dfc6aa5cSAndroid Build Coastguard Worker   register JSAMPROW inptr0, inptr1, inptr2;
28*dfc6aa5cSAndroid Build Coastguard Worker   register JDIMENSION col;
29*dfc6aa5cSAndroid Build Coastguard Worker   JDIMENSION num_cols = cinfo->output_width;
30*dfc6aa5cSAndroid Build Coastguard Worker   /* copy these pointers into registers if possible */
31*dfc6aa5cSAndroid Build Coastguard Worker   register JSAMPLE *range_limit = cinfo->sample_range_limit;
32*dfc6aa5cSAndroid Build Coastguard Worker   register int *Crrtab = cconvert->Cr_r_tab;
33*dfc6aa5cSAndroid Build Coastguard Worker   register int *Cbbtab = cconvert->Cb_b_tab;
34*dfc6aa5cSAndroid Build Coastguard Worker   register JLONG *Crgtab = cconvert->Cr_g_tab;
35*dfc6aa5cSAndroid Build Coastguard Worker   register JLONG *Cbgtab = cconvert->Cb_g_tab;
36*dfc6aa5cSAndroid Build Coastguard Worker   SHIFT_TEMPS
37*dfc6aa5cSAndroid Build Coastguard Worker 
38*dfc6aa5cSAndroid Build Coastguard Worker   while (--num_rows >= 0) {
39*dfc6aa5cSAndroid Build Coastguard Worker     JLONG rgb;
40*dfc6aa5cSAndroid Build Coastguard Worker     unsigned int r, g, b;
41*dfc6aa5cSAndroid Build Coastguard Worker     inptr0 = input_buf[0][input_row];
42*dfc6aa5cSAndroid Build Coastguard Worker     inptr1 = input_buf[1][input_row];
43*dfc6aa5cSAndroid Build Coastguard Worker     inptr2 = input_buf[2][input_row];
44*dfc6aa5cSAndroid Build Coastguard Worker     input_row++;
45*dfc6aa5cSAndroid Build Coastguard Worker     outptr = *output_buf++;
46*dfc6aa5cSAndroid Build Coastguard Worker 
47*dfc6aa5cSAndroid Build Coastguard Worker     if (PACK_NEED_ALIGNMENT(outptr)) {
48*dfc6aa5cSAndroid Build Coastguard Worker       y  = *inptr0++;
49*dfc6aa5cSAndroid Build Coastguard Worker       cb = *inptr1++;
50*dfc6aa5cSAndroid Build Coastguard Worker       cr = *inptr2++;
51*dfc6aa5cSAndroid Build Coastguard Worker       r = range_limit[y + Crrtab[cr]];
52*dfc6aa5cSAndroid Build Coastguard Worker       g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
53*dfc6aa5cSAndroid Build Coastguard Worker                                             SCALEBITS))];
54*dfc6aa5cSAndroid Build Coastguard Worker       b = range_limit[y + Cbbtab[cb]];
55*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_SHORT_565(r, g, b);
56*dfc6aa5cSAndroid Build Coastguard Worker       *(INT16 *)outptr = (INT16)rgb;
57*dfc6aa5cSAndroid Build Coastguard Worker       outptr += 2;
58*dfc6aa5cSAndroid Build Coastguard Worker       num_cols--;
59*dfc6aa5cSAndroid Build Coastguard Worker     }
60*dfc6aa5cSAndroid Build Coastguard Worker     for (col = 0; col < (num_cols >> 1); col++) {
61*dfc6aa5cSAndroid Build Coastguard Worker       y  = *inptr0++;
62*dfc6aa5cSAndroid Build Coastguard Worker       cb = *inptr1++;
63*dfc6aa5cSAndroid Build Coastguard Worker       cr = *inptr2++;
64*dfc6aa5cSAndroid Build Coastguard Worker       r = range_limit[y + Crrtab[cr]];
65*dfc6aa5cSAndroid Build Coastguard Worker       g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
66*dfc6aa5cSAndroid Build Coastguard Worker                                             SCALEBITS))];
67*dfc6aa5cSAndroid Build Coastguard Worker       b = range_limit[y + Cbbtab[cb]];
68*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_SHORT_565(r, g, b);
69*dfc6aa5cSAndroid Build Coastguard Worker 
70*dfc6aa5cSAndroid Build Coastguard Worker       y  = *inptr0++;
71*dfc6aa5cSAndroid Build Coastguard Worker       cb = *inptr1++;
72*dfc6aa5cSAndroid Build Coastguard Worker       cr = *inptr2++;
73*dfc6aa5cSAndroid Build Coastguard Worker       r = range_limit[y + Crrtab[cr]];
74*dfc6aa5cSAndroid Build Coastguard Worker       g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
75*dfc6aa5cSAndroid Build Coastguard Worker                                             SCALEBITS))];
76*dfc6aa5cSAndroid Build Coastguard Worker       b = range_limit[y + Cbbtab[cb]];
77*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r, g, b));
78*dfc6aa5cSAndroid Build Coastguard Worker 
79*dfc6aa5cSAndroid Build Coastguard Worker       WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);
80*dfc6aa5cSAndroid Build Coastguard Worker       outptr += 4;
81*dfc6aa5cSAndroid Build Coastguard Worker     }
82*dfc6aa5cSAndroid Build Coastguard Worker     if (num_cols & 1) {
83*dfc6aa5cSAndroid Build Coastguard Worker       y  = *inptr0;
84*dfc6aa5cSAndroid Build Coastguard Worker       cb = *inptr1;
85*dfc6aa5cSAndroid Build Coastguard Worker       cr = *inptr2;
86*dfc6aa5cSAndroid Build Coastguard Worker       r = range_limit[y + Crrtab[cr]];
87*dfc6aa5cSAndroid Build Coastguard Worker       g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
88*dfc6aa5cSAndroid Build Coastguard Worker                                             SCALEBITS))];
89*dfc6aa5cSAndroid Build Coastguard Worker       b = range_limit[y + Cbbtab[cb]];
90*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_SHORT_565(r, g, b);
91*dfc6aa5cSAndroid Build Coastguard Worker       *(INT16 *)outptr = (INT16)rgb;
92*dfc6aa5cSAndroid Build Coastguard Worker     }
93*dfc6aa5cSAndroid Build Coastguard Worker   }
94*dfc6aa5cSAndroid Build Coastguard Worker }
95*dfc6aa5cSAndroid Build Coastguard Worker 
96*dfc6aa5cSAndroid Build Coastguard Worker 
97*dfc6aa5cSAndroid Build Coastguard Worker INLINE
LOCAL(void)98*dfc6aa5cSAndroid Build Coastguard Worker LOCAL(void)
99*dfc6aa5cSAndroid Build Coastguard Worker ycc_rgb565D_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
100*dfc6aa5cSAndroid Build Coastguard Worker                              JDIMENSION input_row, JSAMPARRAY output_buf,
101*dfc6aa5cSAndroid Build Coastguard Worker                              int num_rows)
102*dfc6aa5cSAndroid Build Coastguard Worker {
103*dfc6aa5cSAndroid Build Coastguard Worker   my_cconvert_ptr cconvert = (my_cconvert_ptr)cinfo->cconvert;
104*dfc6aa5cSAndroid Build Coastguard Worker   register int y, cb, cr;
105*dfc6aa5cSAndroid Build Coastguard Worker   register JSAMPROW outptr;
106*dfc6aa5cSAndroid Build Coastguard Worker   register JSAMPROW inptr0, inptr1, inptr2;
107*dfc6aa5cSAndroid Build Coastguard Worker   register JDIMENSION col;
108*dfc6aa5cSAndroid Build Coastguard Worker   JDIMENSION num_cols = cinfo->output_width;
109*dfc6aa5cSAndroid Build Coastguard Worker   /* copy these pointers into registers if possible */
110*dfc6aa5cSAndroid Build Coastguard Worker   register JSAMPLE *range_limit = cinfo->sample_range_limit;
111*dfc6aa5cSAndroid Build Coastguard Worker   register int *Crrtab = cconvert->Cr_r_tab;
112*dfc6aa5cSAndroid Build Coastguard Worker   register int *Cbbtab = cconvert->Cb_b_tab;
113*dfc6aa5cSAndroid Build Coastguard Worker   register JLONG *Crgtab = cconvert->Cr_g_tab;
114*dfc6aa5cSAndroid Build Coastguard Worker   register JLONG *Cbgtab = cconvert->Cb_g_tab;
115*dfc6aa5cSAndroid Build Coastguard Worker   JLONG d0 = dither_matrix[cinfo->output_scanline & DITHER_MASK];
116*dfc6aa5cSAndroid Build Coastguard Worker   SHIFT_TEMPS
117*dfc6aa5cSAndroid Build Coastguard Worker 
118*dfc6aa5cSAndroid Build Coastguard Worker   while (--num_rows >= 0) {
119*dfc6aa5cSAndroid Build Coastguard Worker     JLONG rgb;
120*dfc6aa5cSAndroid Build Coastguard Worker     unsigned int r, g, b;
121*dfc6aa5cSAndroid Build Coastguard Worker 
122*dfc6aa5cSAndroid Build Coastguard Worker     inptr0 = input_buf[0][input_row];
123*dfc6aa5cSAndroid Build Coastguard Worker     inptr1 = input_buf[1][input_row];
124*dfc6aa5cSAndroid Build Coastguard Worker     inptr2 = input_buf[2][input_row];
125*dfc6aa5cSAndroid Build Coastguard Worker     input_row++;
126*dfc6aa5cSAndroid Build Coastguard Worker     outptr = *output_buf++;
127*dfc6aa5cSAndroid Build Coastguard Worker     if (PACK_NEED_ALIGNMENT(outptr)) {
128*dfc6aa5cSAndroid Build Coastguard Worker       y  = *inptr0++;
129*dfc6aa5cSAndroid Build Coastguard Worker       cb = *inptr1++;
130*dfc6aa5cSAndroid Build Coastguard Worker       cr = *inptr2++;
131*dfc6aa5cSAndroid Build Coastguard Worker       r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];
132*dfc6aa5cSAndroid Build Coastguard Worker       g = range_limit[DITHER_565_G(y +
133*dfc6aa5cSAndroid Build Coastguard Worker                                    ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
134*dfc6aa5cSAndroid Build Coastguard Worker                                                      SCALEBITS)), d0)];
135*dfc6aa5cSAndroid Build Coastguard Worker       b = range_limit[DITHER_565_B(y + Cbbtab[cb], d0)];
136*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_SHORT_565(r, g, b);
137*dfc6aa5cSAndroid Build Coastguard Worker       *(INT16 *)outptr = (INT16)rgb;
138*dfc6aa5cSAndroid Build Coastguard Worker       outptr += 2;
139*dfc6aa5cSAndroid Build Coastguard Worker       num_cols--;
140*dfc6aa5cSAndroid Build Coastguard Worker     }
141*dfc6aa5cSAndroid Build Coastguard Worker     for (col = 0; col < (num_cols >> 1); col++) {
142*dfc6aa5cSAndroid Build Coastguard Worker       y  = *inptr0++;
143*dfc6aa5cSAndroid Build Coastguard Worker       cb = *inptr1++;
144*dfc6aa5cSAndroid Build Coastguard Worker       cr = *inptr2++;
145*dfc6aa5cSAndroid Build Coastguard Worker       r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];
146*dfc6aa5cSAndroid Build Coastguard Worker       g = range_limit[DITHER_565_G(y +
147*dfc6aa5cSAndroid Build Coastguard Worker                                    ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
148*dfc6aa5cSAndroid Build Coastguard Worker                                                      SCALEBITS)), d0)];
149*dfc6aa5cSAndroid Build Coastguard Worker       b = range_limit[DITHER_565_B(y + Cbbtab[cb], d0)];
150*dfc6aa5cSAndroid Build Coastguard Worker       d0 = DITHER_ROTATE(d0);
151*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_SHORT_565(r, g, b);
152*dfc6aa5cSAndroid Build Coastguard Worker 
153*dfc6aa5cSAndroid Build Coastguard Worker       y  = *inptr0++;
154*dfc6aa5cSAndroid Build Coastguard Worker       cb = *inptr1++;
155*dfc6aa5cSAndroid Build Coastguard Worker       cr = *inptr2++;
156*dfc6aa5cSAndroid Build Coastguard Worker       r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];
157*dfc6aa5cSAndroid Build Coastguard Worker       g = range_limit[DITHER_565_G(y +
158*dfc6aa5cSAndroid Build Coastguard Worker                                    ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
159*dfc6aa5cSAndroid Build Coastguard Worker                                                      SCALEBITS)), d0)];
160*dfc6aa5cSAndroid Build Coastguard Worker       b = range_limit[DITHER_565_B(y + Cbbtab[cb], d0)];
161*dfc6aa5cSAndroid Build Coastguard Worker       d0 = DITHER_ROTATE(d0);
162*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r, g, b));
163*dfc6aa5cSAndroid Build Coastguard Worker 
164*dfc6aa5cSAndroid Build Coastguard Worker       WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);
165*dfc6aa5cSAndroid Build Coastguard Worker       outptr += 4;
166*dfc6aa5cSAndroid Build Coastguard Worker     }
167*dfc6aa5cSAndroid Build Coastguard Worker     if (num_cols & 1) {
168*dfc6aa5cSAndroid Build Coastguard Worker       y  = *inptr0;
169*dfc6aa5cSAndroid Build Coastguard Worker       cb = *inptr1;
170*dfc6aa5cSAndroid Build Coastguard Worker       cr = *inptr2;
171*dfc6aa5cSAndroid Build Coastguard Worker       r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];
172*dfc6aa5cSAndroid Build Coastguard Worker       g = range_limit[DITHER_565_G(y +
173*dfc6aa5cSAndroid Build Coastguard Worker                                    ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
174*dfc6aa5cSAndroid Build Coastguard Worker                                                      SCALEBITS)), d0)];
175*dfc6aa5cSAndroid Build Coastguard Worker       b = range_limit[DITHER_565_B(y + Cbbtab[cb], d0)];
176*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_SHORT_565(r, g, b);
177*dfc6aa5cSAndroid Build Coastguard Worker       *(INT16 *)outptr = (INT16)rgb;
178*dfc6aa5cSAndroid Build Coastguard Worker     }
179*dfc6aa5cSAndroid Build Coastguard Worker   }
180*dfc6aa5cSAndroid Build Coastguard Worker }
181*dfc6aa5cSAndroid Build Coastguard Worker 
182*dfc6aa5cSAndroid Build Coastguard Worker 
183*dfc6aa5cSAndroid Build Coastguard Worker INLINE
LOCAL(void)184*dfc6aa5cSAndroid Build Coastguard Worker LOCAL(void)
185*dfc6aa5cSAndroid Build Coastguard Worker rgb_rgb565_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
186*dfc6aa5cSAndroid Build Coastguard Worker                             JDIMENSION input_row, JSAMPARRAY output_buf,
187*dfc6aa5cSAndroid Build Coastguard Worker                             int num_rows)
188*dfc6aa5cSAndroid Build Coastguard Worker {
189*dfc6aa5cSAndroid Build Coastguard Worker   register JSAMPROW outptr;
190*dfc6aa5cSAndroid Build Coastguard Worker   register JSAMPROW inptr0, inptr1, inptr2;
191*dfc6aa5cSAndroid Build Coastguard Worker   register JDIMENSION col;
192*dfc6aa5cSAndroid Build Coastguard Worker   JDIMENSION num_cols = cinfo->output_width;
193*dfc6aa5cSAndroid Build Coastguard Worker   SHIFT_TEMPS
194*dfc6aa5cSAndroid Build Coastguard Worker 
195*dfc6aa5cSAndroid Build Coastguard Worker   while (--num_rows >= 0) {
196*dfc6aa5cSAndroid Build Coastguard Worker     JLONG rgb;
197*dfc6aa5cSAndroid Build Coastguard Worker     unsigned int r, g, b;
198*dfc6aa5cSAndroid Build Coastguard Worker 
199*dfc6aa5cSAndroid Build Coastguard Worker     inptr0 = input_buf[0][input_row];
200*dfc6aa5cSAndroid Build Coastguard Worker     inptr1 = input_buf[1][input_row];
201*dfc6aa5cSAndroid Build Coastguard Worker     inptr2 = input_buf[2][input_row];
202*dfc6aa5cSAndroid Build Coastguard Worker     input_row++;
203*dfc6aa5cSAndroid Build Coastguard Worker     outptr = *output_buf++;
204*dfc6aa5cSAndroid Build Coastguard Worker     if (PACK_NEED_ALIGNMENT(outptr)) {
205*dfc6aa5cSAndroid Build Coastguard Worker       r = *inptr0++;
206*dfc6aa5cSAndroid Build Coastguard Worker       g = *inptr1++;
207*dfc6aa5cSAndroid Build Coastguard Worker       b = *inptr2++;
208*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_SHORT_565(r, g, b);
209*dfc6aa5cSAndroid Build Coastguard Worker       *(INT16 *)outptr = (INT16)rgb;
210*dfc6aa5cSAndroid Build Coastguard Worker       outptr += 2;
211*dfc6aa5cSAndroid Build Coastguard Worker       num_cols--;
212*dfc6aa5cSAndroid Build Coastguard Worker     }
213*dfc6aa5cSAndroid Build Coastguard Worker     for (col = 0; col < (num_cols >> 1); col++) {
214*dfc6aa5cSAndroid Build Coastguard Worker       r = *inptr0++;
215*dfc6aa5cSAndroid Build Coastguard Worker       g = *inptr1++;
216*dfc6aa5cSAndroid Build Coastguard Worker       b = *inptr2++;
217*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_SHORT_565(r, g, b);
218*dfc6aa5cSAndroid Build Coastguard Worker 
219*dfc6aa5cSAndroid Build Coastguard Worker       r = *inptr0++;
220*dfc6aa5cSAndroid Build Coastguard Worker       g = *inptr1++;
221*dfc6aa5cSAndroid Build Coastguard Worker       b = *inptr2++;
222*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r, g, b));
223*dfc6aa5cSAndroid Build Coastguard Worker 
224*dfc6aa5cSAndroid Build Coastguard Worker       WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);
225*dfc6aa5cSAndroid Build Coastguard Worker       outptr += 4;
226*dfc6aa5cSAndroid Build Coastguard Worker     }
227*dfc6aa5cSAndroid Build Coastguard Worker     if (num_cols & 1) {
228*dfc6aa5cSAndroid Build Coastguard Worker       r = *inptr0;
229*dfc6aa5cSAndroid Build Coastguard Worker       g = *inptr1;
230*dfc6aa5cSAndroid Build Coastguard Worker       b = *inptr2;
231*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_SHORT_565(r, g, b);
232*dfc6aa5cSAndroid Build Coastguard Worker       *(INT16 *)outptr = (INT16)rgb;
233*dfc6aa5cSAndroid Build Coastguard Worker     }
234*dfc6aa5cSAndroid Build Coastguard Worker   }
235*dfc6aa5cSAndroid Build Coastguard Worker }
236*dfc6aa5cSAndroid Build Coastguard Worker 
237*dfc6aa5cSAndroid Build Coastguard Worker 
238*dfc6aa5cSAndroid Build Coastguard Worker INLINE
LOCAL(void)239*dfc6aa5cSAndroid Build Coastguard Worker LOCAL(void)
240*dfc6aa5cSAndroid Build Coastguard Worker rgb_rgb565D_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
241*dfc6aa5cSAndroid Build Coastguard Worker                              JDIMENSION input_row, JSAMPARRAY output_buf,
242*dfc6aa5cSAndroid Build Coastguard Worker                              int num_rows)
243*dfc6aa5cSAndroid Build Coastguard Worker {
244*dfc6aa5cSAndroid Build Coastguard Worker   register JSAMPROW outptr;
245*dfc6aa5cSAndroid Build Coastguard Worker   register JSAMPROW inptr0, inptr1, inptr2;
246*dfc6aa5cSAndroid Build Coastguard Worker   register JDIMENSION col;
247*dfc6aa5cSAndroid Build Coastguard Worker   register JSAMPLE *range_limit = cinfo->sample_range_limit;
248*dfc6aa5cSAndroid Build Coastguard Worker   JDIMENSION num_cols = cinfo->output_width;
249*dfc6aa5cSAndroid Build Coastguard Worker   JLONG d0 = dither_matrix[cinfo->output_scanline & DITHER_MASK];
250*dfc6aa5cSAndroid Build Coastguard Worker   SHIFT_TEMPS
251*dfc6aa5cSAndroid Build Coastguard Worker 
252*dfc6aa5cSAndroid Build Coastguard Worker   while (--num_rows >= 0) {
253*dfc6aa5cSAndroid Build Coastguard Worker     JLONG rgb;
254*dfc6aa5cSAndroid Build Coastguard Worker     unsigned int r, g, b;
255*dfc6aa5cSAndroid Build Coastguard Worker 
256*dfc6aa5cSAndroid Build Coastguard Worker     inptr0 = input_buf[0][input_row];
257*dfc6aa5cSAndroid Build Coastguard Worker     inptr1 = input_buf[1][input_row];
258*dfc6aa5cSAndroid Build Coastguard Worker     inptr2 = input_buf[2][input_row];
259*dfc6aa5cSAndroid Build Coastguard Worker     input_row++;
260*dfc6aa5cSAndroid Build Coastguard Worker     outptr = *output_buf++;
261*dfc6aa5cSAndroid Build Coastguard Worker     if (PACK_NEED_ALIGNMENT(outptr)) {
262*dfc6aa5cSAndroid Build Coastguard Worker       r = range_limit[DITHER_565_R(*inptr0++, d0)];
263*dfc6aa5cSAndroid Build Coastguard Worker       g = range_limit[DITHER_565_G(*inptr1++, d0)];
264*dfc6aa5cSAndroid Build Coastguard Worker       b = range_limit[DITHER_565_B(*inptr2++, d0)];
265*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_SHORT_565(r, g, b);
266*dfc6aa5cSAndroid Build Coastguard Worker       *(INT16 *)outptr = (INT16)rgb;
267*dfc6aa5cSAndroid Build Coastguard Worker       outptr += 2;
268*dfc6aa5cSAndroid Build Coastguard Worker       num_cols--;
269*dfc6aa5cSAndroid Build Coastguard Worker     }
270*dfc6aa5cSAndroid Build Coastguard Worker     for (col = 0; col < (num_cols >> 1); col++) {
271*dfc6aa5cSAndroid Build Coastguard Worker       r = range_limit[DITHER_565_R(*inptr0++, d0)];
272*dfc6aa5cSAndroid Build Coastguard Worker       g = range_limit[DITHER_565_G(*inptr1++, d0)];
273*dfc6aa5cSAndroid Build Coastguard Worker       b = range_limit[DITHER_565_B(*inptr2++, d0)];
274*dfc6aa5cSAndroid Build Coastguard Worker       d0 = DITHER_ROTATE(d0);
275*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_SHORT_565(r, g, b);
276*dfc6aa5cSAndroid Build Coastguard Worker 
277*dfc6aa5cSAndroid Build Coastguard Worker       r = range_limit[DITHER_565_R(*inptr0++, d0)];
278*dfc6aa5cSAndroid Build Coastguard Worker       g = range_limit[DITHER_565_G(*inptr1++, d0)];
279*dfc6aa5cSAndroid Build Coastguard Worker       b = range_limit[DITHER_565_B(*inptr2++, d0)];
280*dfc6aa5cSAndroid Build Coastguard Worker       d0 = DITHER_ROTATE(d0);
281*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r, g, b));
282*dfc6aa5cSAndroid Build Coastguard Worker 
283*dfc6aa5cSAndroid Build Coastguard Worker       WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);
284*dfc6aa5cSAndroid Build Coastguard Worker       outptr += 4;
285*dfc6aa5cSAndroid Build Coastguard Worker     }
286*dfc6aa5cSAndroid Build Coastguard Worker     if (num_cols & 1) {
287*dfc6aa5cSAndroid Build Coastguard Worker       r = range_limit[DITHER_565_R(*inptr0, d0)];
288*dfc6aa5cSAndroid Build Coastguard Worker       g = range_limit[DITHER_565_G(*inptr1, d0)];
289*dfc6aa5cSAndroid Build Coastguard Worker       b = range_limit[DITHER_565_B(*inptr2, d0)];
290*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_SHORT_565(r, g, b);
291*dfc6aa5cSAndroid Build Coastguard Worker       *(INT16 *)outptr = (INT16)rgb;
292*dfc6aa5cSAndroid Build Coastguard Worker     }
293*dfc6aa5cSAndroid Build Coastguard Worker   }
294*dfc6aa5cSAndroid Build Coastguard Worker }
295*dfc6aa5cSAndroid Build Coastguard Worker 
296*dfc6aa5cSAndroid Build Coastguard Worker 
297*dfc6aa5cSAndroid Build Coastguard Worker INLINE
LOCAL(void)298*dfc6aa5cSAndroid Build Coastguard Worker LOCAL(void)
299*dfc6aa5cSAndroid Build Coastguard Worker gray_rgb565_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
300*dfc6aa5cSAndroid Build Coastguard Worker                              JDIMENSION input_row, JSAMPARRAY output_buf,
301*dfc6aa5cSAndroid Build Coastguard Worker                              int num_rows)
302*dfc6aa5cSAndroid Build Coastguard Worker {
303*dfc6aa5cSAndroid Build Coastguard Worker   register JSAMPROW inptr, outptr;
304*dfc6aa5cSAndroid Build Coastguard Worker   register JDIMENSION col;
305*dfc6aa5cSAndroid Build Coastguard Worker   JDIMENSION num_cols = cinfo->output_width;
306*dfc6aa5cSAndroid Build Coastguard Worker 
307*dfc6aa5cSAndroid Build Coastguard Worker   while (--num_rows >= 0) {
308*dfc6aa5cSAndroid Build Coastguard Worker     JLONG rgb;
309*dfc6aa5cSAndroid Build Coastguard Worker     unsigned int g;
310*dfc6aa5cSAndroid Build Coastguard Worker 
311*dfc6aa5cSAndroid Build Coastguard Worker     inptr = input_buf[0][input_row++];
312*dfc6aa5cSAndroid Build Coastguard Worker     outptr = *output_buf++;
313*dfc6aa5cSAndroid Build Coastguard Worker     if (PACK_NEED_ALIGNMENT(outptr)) {
314*dfc6aa5cSAndroid Build Coastguard Worker       g = *inptr++;
315*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_SHORT_565(g, g, g);
316*dfc6aa5cSAndroid Build Coastguard Worker       *(INT16 *)outptr = (INT16)rgb;
317*dfc6aa5cSAndroid Build Coastguard Worker       outptr += 2;
318*dfc6aa5cSAndroid Build Coastguard Worker       num_cols--;
319*dfc6aa5cSAndroid Build Coastguard Worker     }
320*dfc6aa5cSAndroid Build Coastguard Worker     for (col = 0; col < (num_cols >> 1); col++) {
321*dfc6aa5cSAndroid Build Coastguard Worker       g = *inptr++;
322*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_SHORT_565(g, g, g);
323*dfc6aa5cSAndroid Build Coastguard Worker       g = *inptr++;
324*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(g, g, g));
325*dfc6aa5cSAndroid Build Coastguard Worker       WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);
326*dfc6aa5cSAndroid Build Coastguard Worker       outptr += 4;
327*dfc6aa5cSAndroid Build Coastguard Worker     }
328*dfc6aa5cSAndroid Build Coastguard Worker     if (num_cols & 1) {
329*dfc6aa5cSAndroid Build Coastguard Worker       g = *inptr;
330*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_SHORT_565(g, g, g);
331*dfc6aa5cSAndroid Build Coastguard Worker       *(INT16 *)outptr = (INT16)rgb;
332*dfc6aa5cSAndroid Build Coastguard Worker     }
333*dfc6aa5cSAndroid Build Coastguard Worker   }
334*dfc6aa5cSAndroid Build Coastguard Worker }
335*dfc6aa5cSAndroid Build Coastguard Worker 
336*dfc6aa5cSAndroid Build Coastguard Worker 
337*dfc6aa5cSAndroid Build Coastguard Worker INLINE
LOCAL(void)338*dfc6aa5cSAndroid Build Coastguard Worker LOCAL(void)
339*dfc6aa5cSAndroid Build Coastguard Worker gray_rgb565D_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
340*dfc6aa5cSAndroid Build Coastguard Worker                               JDIMENSION input_row, JSAMPARRAY output_buf,
341*dfc6aa5cSAndroid Build Coastguard Worker                               int num_rows)
342*dfc6aa5cSAndroid Build Coastguard Worker {
343*dfc6aa5cSAndroid Build Coastguard Worker   register JSAMPROW inptr, outptr;
344*dfc6aa5cSAndroid Build Coastguard Worker   register JDIMENSION col;
345*dfc6aa5cSAndroid Build Coastguard Worker   register JSAMPLE *range_limit = cinfo->sample_range_limit;
346*dfc6aa5cSAndroid Build Coastguard Worker   JDIMENSION num_cols = cinfo->output_width;
347*dfc6aa5cSAndroid Build Coastguard Worker   JLONG d0 = dither_matrix[cinfo->output_scanline & DITHER_MASK];
348*dfc6aa5cSAndroid Build Coastguard Worker 
349*dfc6aa5cSAndroid Build Coastguard Worker   while (--num_rows >= 0) {
350*dfc6aa5cSAndroid Build Coastguard Worker     JLONG rgb;
351*dfc6aa5cSAndroid Build Coastguard Worker     unsigned int g;
352*dfc6aa5cSAndroid Build Coastguard Worker 
353*dfc6aa5cSAndroid Build Coastguard Worker     inptr = input_buf[0][input_row++];
354*dfc6aa5cSAndroid Build Coastguard Worker     outptr = *output_buf++;
355*dfc6aa5cSAndroid Build Coastguard Worker     if (PACK_NEED_ALIGNMENT(outptr)) {
356*dfc6aa5cSAndroid Build Coastguard Worker       g = *inptr++;
357*dfc6aa5cSAndroid Build Coastguard Worker       g = range_limit[DITHER_565_R(g, d0)];
358*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_SHORT_565(g, g, g);
359*dfc6aa5cSAndroid Build Coastguard Worker       *(INT16 *)outptr = (INT16)rgb;
360*dfc6aa5cSAndroid Build Coastguard Worker       outptr += 2;
361*dfc6aa5cSAndroid Build Coastguard Worker       num_cols--;
362*dfc6aa5cSAndroid Build Coastguard Worker     }
363*dfc6aa5cSAndroid Build Coastguard Worker     for (col = 0; col < (num_cols >> 1); col++) {
364*dfc6aa5cSAndroid Build Coastguard Worker       g = *inptr++;
365*dfc6aa5cSAndroid Build Coastguard Worker       g = range_limit[DITHER_565_R(g, d0)];
366*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_SHORT_565(g, g, g);
367*dfc6aa5cSAndroid Build Coastguard Worker       d0 = DITHER_ROTATE(d0);
368*dfc6aa5cSAndroid Build Coastguard Worker 
369*dfc6aa5cSAndroid Build Coastguard Worker       g = *inptr++;
370*dfc6aa5cSAndroid Build Coastguard Worker       g = range_limit[DITHER_565_R(g, d0)];
371*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(g, g, g));
372*dfc6aa5cSAndroid Build Coastguard Worker       d0 = DITHER_ROTATE(d0);
373*dfc6aa5cSAndroid Build Coastguard Worker 
374*dfc6aa5cSAndroid Build Coastguard Worker       WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);
375*dfc6aa5cSAndroid Build Coastguard Worker       outptr += 4;
376*dfc6aa5cSAndroid Build Coastguard Worker     }
377*dfc6aa5cSAndroid Build Coastguard Worker     if (num_cols & 1) {
378*dfc6aa5cSAndroid Build Coastguard Worker       g = *inptr;
379*dfc6aa5cSAndroid Build Coastguard Worker       g = range_limit[DITHER_565_R(g, d0)];
380*dfc6aa5cSAndroid Build Coastguard Worker       rgb = PACK_SHORT_565(g, g, g);
381*dfc6aa5cSAndroid Build Coastguard Worker       *(INT16 *)outptr = (INT16)rgb;
382*dfc6aa5cSAndroid Build Coastguard Worker     }
383*dfc6aa5cSAndroid Build Coastguard Worker   }
384*dfc6aa5cSAndroid Build Coastguard Worker }
385