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