OLD | NEW |
1 /* | 1 /* |
2 * jdmrg565.c | 2 * jdmrg565.c |
3 * | 3 * |
4 * This file was part of the Independent JPEG Group's software: | 4 * This file was part of the Independent JPEG Group's software: |
5 * Copyright (C) 1994-1996, Thomas G. Lane. | 5 * Copyright (C) 1994-1996, Thomas G. Lane. |
6 * libjpeg-turbo Modifications: | 6 * libjpeg-turbo Modifications: |
7 * Copyright (C) 2013, Linaro Limited. | 7 * Copyright (C) 2013, Linaro Limited. |
8 * Copyright (C) 2014, D. R. Commander. | 8 * Copyright (C) 2014-2015, D. R. Commander. |
9 * For conditions of distribution and use, see the accompanying README file. | 9 * For conditions of distribution and use, see the accompanying README.ijg |
| 10 * file. |
10 * | 11 * |
11 * This file contains code for merged upsampling/color conversion. | 12 * This file contains code for merged upsampling/color conversion. |
12 */ | 13 */ |
13 | 14 |
14 | 15 |
15 INLINE | 16 INLINE |
16 LOCAL(void) | 17 LOCAL(void) |
17 h2v1_merged_upsample_565_internal (j_decompress_ptr cinfo, | 18 h2v1_merged_upsample_565_internal (j_decompress_ptr cinfo, |
18 JSAMPIMAGE input_buf, | 19 JSAMPIMAGE input_buf, |
19 JDIMENSION in_row_group_ctr, | 20 JDIMENSION in_row_group_ctr, |
20 JSAMPARRAY output_buf) | 21 JSAMPARRAY output_buf) |
21 { | 22 { |
22 my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; | 23 my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; |
23 register int y, cred, cgreen, cblue; | 24 register int y, cred, cgreen, cblue; |
24 int cb, cr; | 25 int cb, cr; |
25 register JSAMPROW outptr; | 26 register JSAMPROW outptr; |
26 JSAMPROW inptr0, inptr1, inptr2; | 27 JSAMPROW inptr0, inptr1, inptr2; |
27 JDIMENSION col; | 28 JDIMENSION col; |
28 /* copy these pointers into registers if possible */ | 29 /* copy these pointers into registers if possible */ |
29 register JSAMPLE * range_limit = cinfo->sample_range_limit; | 30 register JSAMPLE * range_limit = cinfo->sample_range_limit; |
30 int * Crrtab = upsample->Cr_r_tab; | 31 int * Crrtab = upsample->Cr_r_tab; |
31 int * Cbbtab = upsample->Cb_b_tab; | 32 int * Cbbtab = upsample->Cb_b_tab; |
32 INT32 * Crgtab = upsample->Cr_g_tab; | 33 JLONG * Crgtab = upsample->Cr_g_tab; |
33 INT32 * Cbgtab = upsample->Cb_g_tab; | 34 JLONG * Cbgtab = upsample->Cb_g_tab; |
34 unsigned int r, g, b; | 35 unsigned int r, g, b; |
35 INT32 rgb; | 36 JLONG rgb; |
36 SHIFT_TEMPS | 37 SHIFT_TEMPS |
37 | 38 |
38 inptr0 = input_buf[0][in_row_group_ctr]; | 39 inptr0 = input_buf[0][in_row_group_ctr]; |
39 inptr1 = input_buf[1][in_row_group_ctr]; | 40 inptr1 = input_buf[1][in_row_group_ctr]; |
40 inptr2 = input_buf[2][in_row_group_ctr]; | 41 inptr2 = input_buf[2][in_row_group_ctr]; |
41 outptr = output_buf[0]; | 42 outptr = output_buf[0]; |
42 | 43 |
43 /* Loop for each pair of output pixels */ | 44 /* Loop for each pair of output pixels */ |
44 for (col = cinfo->output_width >> 1; col > 0; col--) { | 45 for (col = cinfo->output_width >> 1; col > 0; col--) { |
45 /* Do the chroma part of the calculation */ | 46 /* Do the chroma part of the calculation */ |
(...skipping 25 matching lines...) Expand all Loading... |
71 cb = GETJSAMPLE(*inptr1); | 72 cb = GETJSAMPLE(*inptr1); |
72 cr = GETJSAMPLE(*inptr2); | 73 cr = GETJSAMPLE(*inptr2); |
73 cred = Crrtab[cr]; | 74 cred = Crrtab[cr]; |
74 cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); | 75 cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); |
75 cblue = Cbbtab[cb]; | 76 cblue = Cbbtab[cb]; |
76 y = GETJSAMPLE(*inptr0); | 77 y = GETJSAMPLE(*inptr0); |
77 r = range_limit[y + cred]; | 78 r = range_limit[y + cred]; |
78 g = range_limit[y + cgreen]; | 79 g = range_limit[y + cgreen]; |
79 b = range_limit[y + cblue]; | 80 b = range_limit[y + cblue]; |
80 rgb = PACK_SHORT_565(r, g, b); | 81 rgb = PACK_SHORT_565(r, g, b); |
81 *(INT16*)outptr = rgb; | 82 *(INT16*)outptr = (INT16)rgb; |
82 } | 83 } |
83 } | 84 } |
84 | 85 |
85 | 86 |
86 INLINE | 87 INLINE |
87 LOCAL(void) | 88 LOCAL(void) |
88 h2v1_merged_upsample_565D_internal (j_decompress_ptr cinfo, | 89 h2v1_merged_upsample_565D_internal (j_decompress_ptr cinfo, |
89 JSAMPIMAGE input_buf, | 90 JSAMPIMAGE input_buf, |
90 JDIMENSION in_row_group_ctr, | 91 JDIMENSION in_row_group_ctr, |
91 JSAMPARRAY output_buf) | 92 JSAMPARRAY output_buf) |
92 { | 93 { |
93 my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; | 94 my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; |
94 register int y, cred, cgreen, cblue; | 95 register int y, cred, cgreen, cblue; |
95 int cb, cr; | 96 int cb, cr; |
96 register JSAMPROW outptr; | 97 register JSAMPROW outptr; |
97 JSAMPROW inptr0, inptr1, inptr2; | 98 JSAMPROW inptr0, inptr1, inptr2; |
98 JDIMENSION col; | 99 JDIMENSION col; |
99 /* copy these pointers into registers if possible */ | 100 /* copy these pointers into registers if possible */ |
100 register JSAMPLE * range_limit = cinfo->sample_range_limit; | 101 register JSAMPLE * range_limit = cinfo->sample_range_limit; |
101 int * Crrtab = upsample->Cr_r_tab; | 102 int * Crrtab = upsample->Cr_r_tab; |
102 int * Cbbtab = upsample->Cb_b_tab; | 103 int * Cbbtab = upsample->Cb_b_tab; |
103 INT32 * Crgtab = upsample->Cr_g_tab; | 104 JLONG * Crgtab = upsample->Cr_g_tab; |
104 INT32 * Cbgtab = upsample->Cb_g_tab; | 105 JLONG * Cbgtab = upsample->Cb_g_tab; |
105 INT32 d0 = dither_matrix[cinfo->output_scanline & DITHER_MASK]; | 106 JLONG d0 = dither_matrix[cinfo->output_scanline & DITHER_MASK]; |
106 unsigned int r, g, b; | 107 unsigned int r, g, b; |
107 INT32 rgb; | 108 JLONG rgb; |
108 SHIFT_TEMPS | 109 SHIFT_TEMPS |
109 | 110 |
110 inptr0 = input_buf[0][in_row_group_ctr]; | 111 inptr0 = input_buf[0][in_row_group_ctr]; |
111 inptr1 = input_buf[1][in_row_group_ctr]; | 112 inptr1 = input_buf[1][in_row_group_ctr]; |
112 inptr2 = input_buf[2][in_row_group_ctr]; | 113 inptr2 = input_buf[2][in_row_group_ctr]; |
113 outptr = output_buf[0]; | 114 outptr = output_buf[0]; |
114 | 115 |
115 /* Loop for each pair of output pixels */ | 116 /* Loop for each pair of output pixels */ |
116 for (col = cinfo->output_width >> 1; col > 0; col--) { | 117 for (col = cinfo->output_width >> 1; col > 0; col--) { |
117 /* Do the chroma part of the calculation */ | 118 /* Do the chroma part of the calculation */ |
(...skipping 27 matching lines...) Expand all Loading... |
145 cb = GETJSAMPLE(*inptr1); | 146 cb = GETJSAMPLE(*inptr1); |
146 cr = GETJSAMPLE(*inptr2); | 147 cr = GETJSAMPLE(*inptr2); |
147 cred = Crrtab[cr]; | 148 cred = Crrtab[cr]; |
148 cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); | 149 cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); |
149 cblue = Cbbtab[cb]; | 150 cblue = Cbbtab[cb]; |
150 y = GETJSAMPLE(*inptr0); | 151 y = GETJSAMPLE(*inptr0); |
151 r = range_limit[DITHER_565_R(y + cred, d0)]; | 152 r = range_limit[DITHER_565_R(y + cred, d0)]; |
152 g = range_limit[DITHER_565_G(y + cgreen, d0)]; | 153 g = range_limit[DITHER_565_G(y + cgreen, d0)]; |
153 b = range_limit[DITHER_565_B(y + cblue, d0)]; | 154 b = range_limit[DITHER_565_B(y + cblue, d0)]; |
154 rgb = PACK_SHORT_565(r, g, b); | 155 rgb = PACK_SHORT_565(r, g, b); |
155 *(INT16*)outptr = rgb; | 156 *(INT16*)outptr = (INT16)rgb; |
156 } | 157 } |
157 } | 158 } |
158 | 159 |
159 | 160 |
160 INLINE | 161 INLINE |
161 LOCAL(void) | 162 LOCAL(void) |
162 h2v2_merged_upsample_565_internal (j_decompress_ptr cinfo, | 163 h2v2_merged_upsample_565_internal (j_decompress_ptr cinfo, |
163 JSAMPIMAGE input_buf, | 164 JSAMPIMAGE input_buf, |
164 JDIMENSION in_row_group_ctr, | 165 JDIMENSION in_row_group_ctr, |
165 JSAMPARRAY output_buf) | 166 JSAMPARRAY output_buf) |
166 { | 167 { |
167 my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; | 168 my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; |
168 register int y, cred, cgreen, cblue; | 169 register int y, cred, cgreen, cblue; |
169 int cb, cr; | 170 int cb, cr; |
170 register JSAMPROW outptr0, outptr1; | 171 register JSAMPROW outptr0, outptr1; |
171 JSAMPROW inptr00, inptr01, inptr1, inptr2; | 172 JSAMPROW inptr00, inptr01, inptr1, inptr2; |
172 JDIMENSION col; | 173 JDIMENSION col; |
173 /* copy these pointers into registers if possible */ | 174 /* copy these pointers into registers if possible */ |
174 register JSAMPLE * range_limit = cinfo->sample_range_limit; | 175 register JSAMPLE * range_limit = cinfo->sample_range_limit; |
175 int * Crrtab = upsample->Cr_r_tab; | 176 int * Crrtab = upsample->Cr_r_tab; |
176 int * Cbbtab = upsample->Cb_b_tab; | 177 int * Cbbtab = upsample->Cb_b_tab; |
177 INT32 * Crgtab = upsample->Cr_g_tab; | 178 JLONG * Crgtab = upsample->Cr_g_tab; |
178 INT32 * Cbgtab = upsample->Cb_g_tab; | 179 JLONG * Cbgtab = upsample->Cb_g_tab; |
179 unsigned int r, g, b; | 180 unsigned int r, g, b; |
180 INT32 rgb; | 181 JLONG rgb; |
181 SHIFT_TEMPS | 182 SHIFT_TEMPS |
182 | 183 |
183 inptr00 = input_buf[0][in_row_group_ctr * 2]; | 184 inptr00 = input_buf[0][in_row_group_ctr * 2]; |
184 inptr01 = input_buf[0][in_row_group_ctr * 2 + 1]; | 185 inptr01 = input_buf[0][in_row_group_ctr * 2 + 1]; |
185 inptr1 = input_buf[1][in_row_group_ctr]; | 186 inptr1 = input_buf[1][in_row_group_ctr]; |
186 inptr2 = input_buf[2][in_row_group_ctr]; | 187 inptr2 = input_buf[2][in_row_group_ctr]; |
187 outptr0 = output_buf[0]; | 188 outptr0 = output_buf[0]; |
188 outptr1 = output_buf[1]; | 189 outptr1 = output_buf[1]; |
189 | 190 |
190 /* Loop for each group of output pixels */ | 191 /* Loop for each group of output pixels */ |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
234 cr = GETJSAMPLE(*inptr2); | 235 cr = GETJSAMPLE(*inptr2); |
235 cred = Crrtab[cr]; | 236 cred = Crrtab[cr]; |
236 cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); | 237 cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); |
237 cblue = Cbbtab[cb]; | 238 cblue = Cbbtab[cb]; |
238 | 239 |
239 y = GETJSAMPLE(*inptr00); | 240 y = GETJSAMPLE(*inptr00); |
240 r = range_limit[y + cred]; | 241 r = range_limit[y + cred]; |
241 g = range_limit[y + cgreen]; | 242 g = range_limit[y + cgreen]; |
242 b = range_limit[y + cblue]; | 243 b = range_limit[y + cblue]; |
243 rgb = PACK_SHORT_565(r, g, b); | 244 rgb = PACK_SHORT_565(r, g, b); |
244 *(INT16*)outptr0 = rgb; | 245 *(INT16*)outptr0 = (INT16)rgb; |
245 | 246 |
246 y = GETJSAMPLE(*inptr01); | 247 y = GETJSAMPLE(*inptr01); |
247 r = range_limit[y + cred]; | 248 r = range_limit[y + cred]; |
248 g = range_limit[y + cgreen]; | 249 g = range_limit[y + cgreen]; |
249 b = range_limit[y + cblue]; | 250 b = range_limit[y + cblue]; |
250 rgb = PACK_SHORT_565(r, g, b); | 251 rgb = PACK_SHORT_565(r, g, b); |
251 *(INT16*)outptr1 = rgb; | 252 *(INT16*)outptr1 = (INT16)rgb; |
252 } | 253 } |
253 } | 254 } |
254 | 255 |
255 | 256 |
256 INLINE | 257 INLINE |
257 LOCAL(void) | 258 LOCAL(void) |
258 h2v2_merged_upsample_565D_internal (j_decompress_ptr cinfo, | 259 h2v2_merged_upsample_565D_internal (j_decompress_ptr cinfo, |
259 JSAMPIMAGE input_buf, | 260 JSAMPIMAGE input_buf, |
260 JDIMENSION in_row_group_ctr, | 261 JDIMENSION in_row_group_ctr, |
261 JSAMPARRAY output_buf) | 262 JSAMPARRAY output_buf) |
262 { | 263 { |
263 my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; | 264 my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; |
264 register int y, cred, cgreen, cblue; | 265 register int y, cred, cgreen, cblue; |
265 int cb, cr; | 266 int cb, cr; |
266 register JSAMPROW outptr0, outptr1; | 267 register JSAMPROW outptr0, outptr1; |
267 JSAMPROW inptr00, inptr01, inptr1, inptr2; | 268 JSAMPROW inptr00, inptr01, inptr1, inptr2; |
268 JDIMENSION col; | 269 JDIMENSION col; |
269 /* copy these pointers into registers if possible */ | 270 /* copy these pointers into registers if possible */ |
270 register JSAMPLE * range_limit = cinfo->sample_range_limit; | 271 register JSAMPLE * range_limit = cinfo->sample_range_limit; |
271 int * Crrtab = upsample->Cr_r_tab; | 272 int * Crrtab = upsample->Cr_r_tab; |
272 int * Cbbtab = upsample->Cb_b_tab; | 273 int * Cbbtab = upsample->Cb_b_tab; |
273 INT32 * Crgtab = upsample->Cr_g_tab; | 274 JLONG * Crgtab = upsample->Cr_g_tab; |
274 INT32 * Cbgtab = upsample->Cb_g_tab; | 275 JLONG * Cbgtab = upsample->Cb_g_tab; |
275 INT32 d0 = dither_matrix[cinfo->output_scanline & DITHER_MASK]; | 276 JLONG d0 = dither_matrix[cinfo->output_scanline & DITHER_MASK]; |
276 INT32 d1 = dither_matrix[(cinfo->output_scanline+1) & DITHER_MASK]; | 277 JLONG d1 = dither_matrix[(cinfo->output_scanline+1) & DITHER_MASK]; |
277 unsigned int r, g, b; | 278 unsigned int r, g, b; |
278 INT32 rgb; | 279 JLONG rgb; |
279 SHIFT_TEMPS | 280 SHIFT_TEMPS |
280 | 281 |
281 inptr00 = input_buf[0][in_row_group_ctr*2]; | 282 inptr00 = input_buf[0][in_row_group_ctr*2]; |
282 inptr01 = input_buf[0][in_row_group_ctr*2 + 1]; | 283 inptr01 = input_buf[0][in_row_group_ctr*2 + 1]; |
283 inptr1 = input_buf[1][in_row_group_ctr]; | 284 inptr1 = input_buf[1][in_row_group_ctr]; |
284 inptr2 = input_buf[2][in_row_group_ctr]; | 285 inptr2 = input_buf[2][in_row_group_ctr]; |
285 outptr0 = output_buf[0]; | 286 outptr0 = output_buf[0]; |
286 outptr1 = output_buf[1]; | 287 outptr1 = output_buf[1]; |
287 | 288 |
288 /* Loop for each group of output pixels */ | 289 /* Loop for each group of output pixels */ |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 cr = GETJSAMPLE(*inptr2); | 337 cr = GETJSAMPLE(*inptr2); |
337 cred = Crrtab[cr]; | 338 cred = Crrtab[cr]; |
338 cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); | 339 cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); |
339 cblue = Cbbtab[cb]; | 340 cblue = Cbbtab[cb]; |
340 | 341 |
341 y = GETJSAMPLE(*inptr00); | 342 y = GETJSAMPLE(*inptr00); |
342 r = range_limit[DITHER_565_R(y + cred, d0)]; | 343 r = range_limit[DITHER_565_R(y + cred, d0)]; |
343 g = range_limit[DITHER_565_G(y + cgreen, d0)]; | 344 g = range_limit[DITHER_565_G(y + cgreen, d0)]; |
344 b = range_limit[DITHER_565_B(y + cblue, d0)]; | 345 b = range_limit[DITHER_565_B(y + cblue, d0)]; |
345 rgb = PACK_SHORT_565(r, g, b); | 346 rgb = PACK_SHORT_565(r, g, b); |
346 *(INT16*)outptr0 = rgb; | 347 *(INT16*)outptr0 = (INT16)rgb; |
347 | 348 |
348 y = GETJSAMPLE(*inptr01); | 349 y = GETJSAMPLE(*inptr01); |
349 r = range_limit[DITHER_565_R(y + cred, d1)]; | 350 r = range_limit[DITHER_565_R(y + cred, d1)]; |
350 g = range_limit[DITHER_565_G(y + cgreen, d1)]; | 351 g = range_limit[DITHER_565_G(y + cgreen, d1)]; |
351 b = range_limit[DITHER_565_B(y + cblue, d1)]; | 352 b = range_limit[DITHER_565_B(y + cblue, d1)]; |
352 rgb = PACK_SHORT_565(r, g, b); | 353 rgb = PACK_SHORT_565(r, g, b); |
353 *(INT16*)outptr1 = rgb; | 354 *(INT16*)outptr1 = (INT16)rgb; |
354 } | 355 } |
355 } | 356 } |
OLD | NEW |