OLD | NEW |
1 /* | 1 /* |
2 * jccolor.c | 2 * jccolor.c |
3 * | 3 * |
4 * Copyright (C) 1991-1996, Thomas G. Lane. | 4 * Copyright (C) 1991-1996, Thomas G. Lane. |
5 * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB | 5 * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB |
6 * Copyright (C) 2009-2011, D. R. Commander. | 6 * Copyright (C) 2009-2012, D. R. Commander. |
7 * This file is part of the Independent JPEG Group's software. | 7 * This file is part of the Independent JPEG Group's software. |
8 * For conditions of distribution and use, see the accompanying README file. | 8 * For conditions of distribution and use, see the accompanying README file. |
9 * | 9 * |
10 * This file contains input colorspace conversion routines. | 10 * This file contains input colorspace conversion routines. |
11 */ | 11 */ |
12 | 12 |
13 #define JPEG_INTERNALS | 13 #define JPEG_INTERNALS |
14 #include "jinclude.h" | 14 #include "jinclude.h" |
15 #include "jpeglib.h" | 15 #include "jpeglib.h" |
16 #include "jsimd.h" | 16 #include "jsimd.h" |
| 17 #include "config.h" |
17 | 18 |
18 | 19 |
19 /* Private subobject */ | 20 /* Private subobject */ |
20 | 21 |
21 typedef struct { | 22 typedef struct { |
22 struct jpeg_color_converter pub; /* public fields */ | 23 struct jpeg_color_converter pub; /* public fields */ |
23 | 24 |
24 /* Private state for RGB->YCC conversion */ | 25 /* Private state for RGB->YCC conversion */ |
25 INT32 * rgb_ycc_tab; /* => table for RGB to YCbCr conversion */ | 26 INT32 * rgb_ycc_tab; /* => table for RGB to YCbCr conversion */ |
26 } my_color_converter; | 27 } my_color_converter; |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 #undef RGB_GREEN | 89 #undef RGB_GREEN |
89 #undef RGB_BLUE | 90 #undef RGB_BLUE |
90 #undef RGB_PIXELSIZE | 91 #undef RGB_PIXELSIZE |
91 | 92 |
92 #define RGB_RED EXT_RGB_RED | 93 #define RGB_RED EXT_RGB_RED |
93 #define RGB_GREEN EXT_RGB_GREEN | 94 #define RGB_GREEN EXT_RGB_GREEN |
94 #define RGB_BLUE EXT_RGB_BLUE | 95 #define RGB_BLUE EXT_RGB_BLUE |
95 #define RGB_PIXELSIZE EXT_RGB_PIXELSIZE | 96 #define RGB_PIXELSIZE EXT_RGB_PIXELSIZE |
96 #define rgb_ycc_convert_internal extrgb_ycc_convert_internal | 97 #define rgb_ycc_convert_internal extrgb_ycc_convert_internal |
97 #define rgb_gray_convert_internal extrgb_gray_convert_internal | 98 #define rgb_gray_convert_internal extrgb_gray_convert_internal |
| 99 #define rgb_rgb_convert_internal extrgb_rgb_convert_internal |
98 #include "jccolext.c" | 100 #include "jccolext.c" |
99 #undef RGB_RED | 101 #undef RGB_RED |
100 #undef RGB_GREEN | 102 #undef RGB_GREEN |
101 #undef RGB_BLUE | 103 #undef RGB_BLUE |
102 #undef RGB_PIXELSIZE | 104 #undef RGB_PIXELSIZE |
103 #undef rgb_ycc_convert_internal | 105 #undef rgb_ycc_convert_internal |
104 #undef rgb_gray_convert_internal | 106 #undef rgb_gray_convert_internal |
| 107 #undef rgb_rgb_convert_internal |
105 | 108 |
106 #define RGB_RED EXT_RGBX_RED | 109 #define RGB_RED EXT_RGBX_RED |
107 #define RGB_GREEN EXT_RGBX_GREEN | 110 #define RGB_GREEN EXT_RGBX_GREEN |
108 #define RGB_BLUE EXT_RGBX_BLUE | 111 #define RGB_BLUE EXT_RGBX_BLUE |
109 #define RGB_PIXELSIZE EXT_RGBX_PIXELSIZE | 112 #define RGB_PIXELSIZE EXT_RGBX_PIXELSIZE |
110 #define rgb_ycc_convert_internal extrgbx_ycc_convert_internal | 113 #define rgb_ycc_convert_internal extrgbx_ycc_convert_internal |
111 #define rgb_gray_convert_internal extrgbx_gray_convert_internal | 114 #define rgb_gray_convert_internal extrgbx_gray_convert_internal |
| 115 #define rgb_rgb_convert_internal extrgbx_rgb_convert_internal |
112 #include "jccolext.c" | 116 #include "jccolext.c" |
113 #undef RGB_RED | 117 #undef RGB_RED |
114 #undef RGB_GREEN | 118 #undef RGB_GREEN |
115 #undef RGB_BLUE | 119 #undef RGB_BLUE |
116 #undef RGB_PIXELSIZE | 120 #undef RGB_PIXELSIZE |
117 #undef rgb_ycc_convert_internal | 121 #undef rgb_ycc_convert_internal |
118 #undef rgb_gray_convert_internal | 122 #undef rgb_gray_convert_internal |
| 123 #undef rgb_rgb_convert_internal |
119 | 124 |
120 #define RGB_RED EXT_BGR_RED | 125 #define RGB_RED EXT_BGR_RED |
121 #define RGB_GREEN EXT_BGR_GREEN | 126 #define RGB_GREEN EXT_BGR_GREEN |
122 #define RGB_BLUE EXT_BGR_BLUE | 127 #define RGB_BLUE EXT_BGR_BLUE |
123 #define RGB_PIXELSIZE EXT_BGR_PIXELSIZE | 128 #define RGB_PIXELSIZE EXT_BGR_PIXELSIZE |
124 #define rgb_ycc_convert_internal extbgr_ycc_convert_internal | 129 #define rgb_ycc_convert_internal extbgr_ycc_convert_internal |
125 #define rgb_gray_convert_internal extbgr_gray_convert_internal | 130 #define rgb_gray_convert_internal extbgr_gray_convert_internal |
| 131 #define rgb_rgb_convert_internal extbgr_rgb_convert_internal |
126 #include "jccolext.c" | 132 #include "jccolext.c" |
127 #undef RGB_RED | 133 #undef RGB_RED |
128 #undef RGB_GREEN | 134 #undef RGB_GREEN |
129 #undef RGB_BLUE | 135 #undef RGB_BLUE |
130 #undef RGB_PIXELSIZE | 136 #undef RGB_PIXELSIZE |
131 #undef rgb_ycc_convert_internal | 137 #undef rgb_ycc_convert_internal |
132 #undef rgb_gray_convert_internal | 138 #undef rgb_gray_convert_internal |
| 139 #undef rgb_rgb_convert_internal |
133 | 140 |
134 #define RGB_RED EXT_BGRX_RED | 141 #define RGB_RED EXT_BGRX_RED |
135 #define RGB_GREEN EXT_BGRX_GREEN | 142 #define RGB_GREEN EXT_BGRX_GREEN |
136 #define RGB_BLUE EXT_BGRX_BLUE | 143 #define RGB_BLUE EXT_BGRX_BLUE |
137 #define RGB_PIXELSIZE EXT_BGRX_PIXELSIZE | 144 #define RGB_PIXELSIZE EXT_BGRX_PIXELSIZE |
138 #define rgb_ycc_convert_internal extbgrx_ycc_convert_internal | 145 #define rgb_ycc_convert_internal extbgrx_ycc_convert_internal |
139 #define rgb_gray_convert_internal extbgrx_gray_convert_internal | 146 #define rgb_gray_convert_internal extbgrx_gray_convert_internal |
| 147 #define rgb_rgb_convert_internal extbgrx_rgb_convert_internal |
140 #include "jccolext.c" | 148 #include "jccolext.c" |
141 #undef RGB_RED | 149 #undef RGB_RED |
142 #undef RGB_GREEN | 150 #undef RGB_GREEN |
143 #undef RGB_BLUE | 151 #undef RGB_BLUE |
144 #undef RGB_PIXELSIZE | 152 #undef RGB_PIXELSIZE |
145 #undef rgb_ycc_convert_internal | 153 #undef rgb_ycc_convert_internal |
146 #undef rgb_gray_convert_internal | 154 #undef rgb_gray_convert_internal |
| 155 #undef rgb_rgb_convert_internal |
147 | 156 |
148 #define RGB_RED EXT_XBGR_RED | 157 #define RGB_RED EXT_XBGR_RED |
149 #define RGB_GREEN EXT_XBGR_GREEN | 158 #define RGB_GREEN EXT_XBGR_GREEN |
150 #define RGB_BLUE EXT_XBGR_BLUE | 159 #define RGB_BLUE EXT_XBGR_BLUE |
151 #define RGB_PIXELSIZE EXT_XBGR_PIXELSIZE | 160 #define RGB_PIXELSIZE EXT_XBGR_PIXELSIZE |
152 #define rgb_ycc_convert_internal extxbgr_ycc_convert_internal | 161 #define rgb_ycc_convert_internal extxbgr_ycc_convert_internal |
153 #define rgb_gray_convert_internal extxbgr_gray_convert_internal | 162 #define rgb_gray_convert_internal extxbgr_gray_convert_internal |
| 163 #define rgb_rgb_convert_internal extxbgr_rgb_convert_internal |
154 #include "jccolext.c" | 164 #include "jccolext.c" |
155 #undef RGB_RED | 165 #undef RGB_RED |
156 #undef RGB_GREEN | 166 #undef RGB_GREEN |
157 #undef RGB_BLUE | 167 #undef RGB_BLUE |
158 #undef RGB_PIXELSIZE | 168 #undef RGB_PIXELSIZE |
159 #undef rgb_ycc_convert_internal | 169 #undef rgb_ycc_convert_internal |
160 #undef rgb_gray_convert_internal | 170 #undef rgb_gray_convert_internal |
| 171 #undef rgb_rgb_convert_internal |
161 | 172 |
162 #define RGB_RED EXT_XRGB_RED | 173 #define RGB_RED EXT_XRGB_RED |
163 #define RGB_GREEN EXT_XRGB_GREEN | 174 #define RGB_GREEN EXT_XRGB_GREEN |
164 #define RGB_BLUE EXT_XRGB_BLUE | 175 #define RGB_BLUE EXT_XRGB_BLUE |
165 #define RGB_PIXELSIZE EXT_XRGB_PIXELSIZE | 176 #define RGB_PIXELSIZE EXT_XRGB_PIXELSIZE |
166 #define rgb_ycc_convert_internal extxrgb_ycc_convert_internal | 177 #define rgb_ycc_convert_internal extxrgb_ycc_convert_internal |
167 #define rgb_gray_convert_internal extxrgb_gray_convert_internal | 178 #define rgb_gray_convert_internal extxrgb_gray_convert_internal |
| 179 #define rgb_rgb_convert_internal extxrgb_rgb_convert_internal |
168 #include "jccolext.c" | 180 #include "jccolext.c" |
169 #undef RGB_RED | 181 #undef RGB_RED |
170 #undef RGB_GREEN | 182 #undef RGB_GREEN |
171 #undef RGB_BLUE | 183 #undef RGB_BLUE |
172 #undef RGB_PIXELSIZE | 184 #undef RGB_PIXELSIZE |
173 #undef rgb_ycc_convert_internal | 185 #undef rgb_ycc_convert_internal |
174 #undef rgb_gray_convert_internal | 186 #undef rgb_gray_convert_internal |
| 187 #undef rgb_rgb_convert_internal |
175 | 188 |
176 | 189 |
177 /* | 190 /* |
178 * Initialize for RGB->YCC colorspace conversion. | 191 * Initialize for RGB->YCC colorspace conversion. |
179 */ | 192 */ |
180 | 193 |
181 METHODDEF(void) | 194 METHODDEF(void) |
182 rgb_ycc_start (j_compress_ptr cinfo) | 195 rgb_ycc_start (j_compress_ptr cinfo) |
183 { | 196 { |
184 my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; | 197 my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
299 break; | 312 break; |
300 default: | 313 default: |
301 rgb_gray_convert_internal(cinfo, input_buf, output_buf, output_row, | 314 rgb_gray_convert_internal(cinfo, input_buf, output_buf, output_row, |
302 num_rows); | 315 num_rows); |
303 break; | 316 break; |
304 } | 317 } |
305 } | 318 } |
306 | 319 |
307 | 320 |
308 /* | 321 /* |
| 322 * Extended RGB to plain RGB conversion |
| 323 */ |
| 324 |
| 325 METHODDEF(void) |
| 326 rgb_rgb_convert (j_compress_ptr cinfo, |
| 327 JSAMPARRAY input_buf, JSAMPIMAGE output_buf, |
| 328 JDIMENSION output_row, int num_rows) |
| 329 { |
| 330 switch (cinfo->in_color_space) { |
| 331 case JCS_EXT_RGB: |
| 332 extrgb_rgb_convert_internal(cinfo, input_buf, output_buf, output_row, |
| 333 num_rows); |
| 334 break; |
| 335 case JCS_EXT_RGBX: |
| 336 case JCS_EXT_RGBA: |
| 337 extrgbx_rgb_convert_internal(cinfo, input_buf, output_buf, output_row, |
| 338 num_rows); |
| 339 break; |
| 340 case JCS_EXT_BGR: |
| 341 extbgr_rgb_convert_internal(cinfo, input_buf, output_buf, output_row, |
| 342 num_rows); |
| 343 break; |
| 344 case JCS_EXT_BGRX: |
| 345 case JCS_EXT_BGRA: |
| 346 extbgrx_rgb_convert_internal(cinfo, input_buf, output_buf, output_row, |
| 347 num_rows); |
| 348 break; |
| 349 case JCS_EXT_XBGR: |
| 350 case JCS_EXT_ABGR: |
| 351 extxbgr_rgb_convert_internal(cinfo, input_buf, output_buf, output_row, |
| 352 num_rows); |
| 353 break; |
| 354 case JCS_EXT_XRGB: |
| 355 case JCS_EXT_ARGB: |
| 356 extxrgb_rgb_convert_internal(cinfo, input_buf, output_buf, output_row, |
| 357 num_rows); |
| 358 break; |
| 359 default: |
| 360 rgb_rgb_convert_internal(cinfo, input_buf, output_buf, output_row, |
| 361 num_rows); |
| 362 break; |
| 363 } |
| 364 } |
| 365 |
| 366 |
| 367 /* |
309 * Convert some rows of samples to the JPEG colorspace. | 368 * Convert some rows of samples to the JPEG colorspace. |
310 * This version handles Adobe-style CMYK->YCCK conversion, | 369 * This version handles Adobe-style CMYK->YCCK conversion, |
311 * where we convert R=1-C, G=1-M, and B=1-Y to YCbCr using the same | 370 * where we convert R=1-C, G=1-M, and B=1-Y to YCbCr using the same |
312 * conversion as above, while passing K (black) unchanged. | 371 * conversion as above, while passing K (black) unchanged. |
313 * We assume rgb_ycc_start has been called. | 372 * We assume rgb_ycc_start has been called. |
314 */ | 373 */ |
315 | 374 |
316 METHODDEF(void) | 375 METHODDEF(void) |
317 cmyk_ycck_convert (j_compress_ptr cinfo, | 376 cmyk_ycck_convert (j_compress_ptr cinfo, |
318 JSAMPARRAY input_buf, JSAMPIMAGE output_buf, | 377 JSAMPARRAY input_buf, JSAMPIMAGE output_buf, |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
515 cconvert->pub.start_pass = rgb_ycc_start; | 574 cconvert->pub.start_pass = rgb_ycc_start; |
516 cconvert->pub.color_convert = rgb_gray_convert; | 575 cconvert->pub.color_convert = rgb_gray_convert; |
517 } | 576 } |
518 } else if (cinfo->in_color_space == JCS_YCbCr) | 577 } else if (cinfo->in_color_space == JCS_YCbCr) |
519 cconvert->pub.color_convert = grayscale_convert; | 578 cconvert->pub.color_convert = grayscale_convert; |
520 else | 579 else |
521 ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); | 580 ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); |
522 break; | 581 break; |
523 | 582 |
524 case JCS_RGB: | 583 case JCS_RGB: |
525 case JCS_EXT_RGB: | |
526 case JCS_EXT_RGBX: | |
527 case JCS_EXT_BGR: | |
528 case JCS_EXT_BGRX: | |
529 case JCS_EXT_XBGR: | |
530 case JCS_EXT_XRGB: | |
531 case JCS_EXT_RGBA: | |
532 case JCS_EXT_BGRA: | |
533 case JCS_EXT_ABGR: | |
534 case JCS_EXT_ARGB: | |
535 if (cinfo->num_components != 3) | 584 if (cinfo->num_components != 3) |
536 ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); | 585 ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); |
537 if (cinfo->in_color_space == cinfo->jpeg_color_space && | 586 if (rgb_red[cinfo->in_color_space] == 0 && |
538 rgb_pixelsize[cinfo->in_color_space] == 3) | 587 rgb_green[cinfo->in_color_space] == 1 && |
| 588 rgb_blue[cinfo->in_color_space] == 2 && |
| 589 rgb_pixelsize[cinfo->in_color_space] == 3) |
539 cconvert->pub.color_convert = null_convert; | 590 cconvert->pub.color_convert = null_convert; |
| 591 else if (cinfo->in_color_space == JCS_RGB || |
| 592 cinfo->in_color_space == JCS_EXT_RGB || |
| 593 cinfo->in_color_space == JCS_EXT_RGBX || |
| 594 cinfo->in_color_space == JCS_EXT_BGR || |
| 595 cinfo->in_color_space == JCS_EXT_BGRX || |
| 596 cinfo->in_color_space == JCS_EXT_XBGR || |
| 597 cinfo->in_color_space == JCS_EXT_XRGB || |
| 598 cinfo->in_color_space == JCS_EXT_RGBA || |
| 599 cinfo->in_color_space == JCS_EXT_BGRA || |
| 600 cinfo->in_color_space == JCS_EXT_ABGR || |
| 601 cinfo->in_color_space == JCS_EXT_ARGB) |
| 602 cconvert->pub.color_convert = rgb_rgb_convert; |
540 else | 603 else |
541 ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); | 604 ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); |
542 break; | 605 break; |
543 | 606 |
544 case JCS_YCbCr: | 607 case JCS_YCbCr: |
545 if (cinfo->num_components != 3) | 608 if (cinfo->num_components != 3) |
546 ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); | 609 ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); |
547 if (cinfo->in_color_space == JCS_RGB || | 610 if (cinfo->in_color_space == JCS_RGB || |
548 cinfo->in_color_space == JCS_EXT_RGB || | 611 cinfo->in_color_space == JCS_EXT_RGB || |
549 cinfo->in_color_space == JCS_EXT_RGBX || | 612 cinfo->in_color_space == JCS_EXT_RGBX || |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
589 break; | 652 break; |
590 | 653 |
591 default: /* allow null conversion of JCS_UNKNOWN */ | 654 default: /* allow null conversion of JCS_UNKNOWN */ |
592 if (cinfo->jpeg_color_space != cinfo->in_color_space || | 655 if (cinfo->jpeg_color_space != cinfo->in_color_space || |
593 cinfo->num_components != cinfo->input_components) | 656 cinfo->num_components != cinfo->input_components) |
594 ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); | 657 ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); |
595 cconvert->pub.color_convert = null_convert; | 658 cconvert->pub.color_convert = null_convert; |
596 break; | 659 break; |
597 } | 660 } |
598 } | 661 } |
OLD | NEW |