| OLD | NEW |
| 1 /* | 1 /* |
| 2 * jdcolor.c | 2 * jdcolor.c |
| 3 * | 3 * |
| 4 * Copyright (C) 1991-1997, Thomas G. Lane. | 4 * Copyright (C) 1991-1997, 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, 2011-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 output colorspace conversion routines. | 10 * This file contains output 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_deconverter pub; /* public fields */ | 23 struct jpeg_color_deconverter pub; /* public fields */ |
| 23 | 24 |
| 24 /* Private state for YCC->RGB conversion */ | 25 /* Private state for YCC->RGB conversion */ |
| 25 int * Cr_r_tab; /* => table for Cr to R conversion */ | 26 int * Cr_r_tab; /* => table for Cr to R conversion */ |
| 26 int * Cb_b_tab; /* => table for Cb to B conversion */ | 27 int * Cb_b_tab; /* => table for Cb to B conversion */ |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 #undef RGB_GREEN | 73 #undef RGB_GREEN |
| 73 #undef RGB_BLUE | 74 #undef RGB_BLUE |
| 74 #undef RGB_PIXELSIZE | 75 #undef RGB_PIXELSIZE |
| 75 | 76 |
| 76 #define RGB_RED EXT_RGB_RED | 77 #define RGB_RED EXT_RGB_RED |
| 77 #define RGB_GREEN EXT_RGB_GREEN | 78 #define RGB_GREEN EXT_RGB_GREEN |
| 78 #define RGB_BLUE EXT_RGB_BLUE | 79 #define RGB_BLUE EXT_RGB_BLUE |
| 79 #define RGB_PIXELSIZE EXT_RGB_PIXELSIZE | 80 #define RGB_PIXELSIZE EXT_RGB_PIXELSIZE |
| 80 #define ycc_rgb_convert_internal ycc_extrgb_convert_internal | 81 #define ycc_rgb_convert_internal ycc_extrgb_convert_internal |
| 81 #define gray_rgb_convert_internal gray_extrgb_convert_internal | 82 #define gray_rgb_convert_internal gray_extrgb_convert_internal |
| 83 #define rgb_rgb_convert_internal rgb_extrgb_convert_internal |
| 82 #include "jdcolext.c" | 84 #include "jdcolext.c" |
| 83 #undef RGB_RED | 85 #undef RGB_RED |
| 84 #undef RGB_GREEN | 86 #undef RGB_GREEN |
| 85 #undef RGB_BLUE | 87 #undef RGB_BLUE |
| 86 #undef RGB_PIXELSIZE | 88 #undef RGB_PIXELSIZE |
| 87 #undef ycc_rgb_convert_internal | 89 #undef ycc_rgb_convert_internal |
| 88 #undef gray_rgb_convert_internal | 90 #undef gray_rgb_convert_internal |
| 91 #undef rgb_rgb_convert_internal |
| 89 | 92 |
| 90 #define RGB_RED EXT_RGBX_RED | 93 #define RGB_RED EXT_RGBX_RED |
| 91 #define RGB_GREEN EXT_RGBX_GREEN | 94 #define RGB_GREEN EXT_RGBX_GREEN |
| 92 #define RGB_BLUE EXT_RGBX_BLUE | 95 #define RGB_BLUE EXT_RGBX_BLUE |
| 93 #define RGB_ALPHA 3 | 96 #define RGB_ALPHA 3 |
| 94 #define RGB_PIXELSIZE EXT_RGBX_PIXELSIZE | 97 #define RGB_PIXELSIZE EXT_RGBX_PIXELSIZE |
| 95 #define ycc_rgb_convert_internal ycc_extrgbx_convert_internal | 98 #define ycc_rgb_convert_internal ycc_extrgbx_convert_internal |
| 96 #define gray_rgb_convert_internal gray_extrgbx_convert_internal | 99 #define gray_rgb_convert_internal gray_extrgbx_convert_internal |
| 100 #define rgb_rgb_convert_internal rgb_extrgbx_convert_internal |
| 97 #include "jdcolext.c" | 101 #include "jdcolext.c" |
| 98 #undef RGB_RED | 102 #undef RGB_RED |
| 99 #undef RGB_GREEN | 103 #undef RGB_GREEN |
| 100 #undef RGB_BLUE | 104 #undef RGB_BLUE |
| 101 #undef RGB_ALPHA | 105 #undef RGB_ALPHA |
| 102 #undef RGB_PIXELSIZE | 106 #undef RGB_PIXELSIZE |
| 103 #undef ycc_rgb_convert_internal | 107 #undef ycc_rgb_convert_internal |
| 104 #undef gray_rgb_convert_internal | 108 #undef gray_rgb_convert_internal |
| 109 #undef rgb_rgb_convert_internal |
| 105 | 110 |
| 106 #define RGB_RED EXT_BGR_RED | 111 #define RGB_RED EXT_BGR_RED |
| 107 #define RGB_GREEN EXT_BGR_GREEN | 112 #define RGB_GREEN EXT_BGR_GREEN |
| 108 #define RGB_BLUE EXT_BGR_BLUE | 113 #define RGB_BLUE EXT_BGR_BLUE |
| 109 #define RGB_PIXELSIZE EXT_BGR_PIXELSIZE | 114 #define RGB_PIXELSIZE EXT_BGR_PIXELSIZE |
| 110 #define ycc_rgb_convert_internal ycc_extbgr_convert_internal | 115 #define ycc_rgb_convert_internal ycc_extbgr_convert_internal |
| 111 #define gray_rgb_convert_internal gray_extbgr_convert_internal | 116 #define gray_rgb_convert_internal gray_extbgr_convert_internal |
| 117 #define rgb_rgb_convert_internal rgb_extbgr_convert_internal |
| 112 #include "jdcolext.c" | 118 #include "jdcolext.c" |
| 113 #undef RGB_RED | 119 #undef RGB_RED |
| 114 #undef RGB_GREEN | 120 #undef RGB_GREEN |
| 115 #undef RGB_BLUE | 121 #undef RGB_BLUE |
| 116 #undef RGB_PIXELSIZE | 122 #undef RGB_PIXELSIZE |
| 117 #undef ycc_rgb_convert_internal | 123 #undef ycc_rgb_convert_internal |
| 118 #undef gray_rgb_convert_internal | 124 #undef gray_rgb_convert_internal |
| 125 #undef rgb_rgb_convert_internal |
| 119 | 126 |
| 120 #define RGB_RED EXT_BGRX_RED | 127 #define RGB_RED EXT_BGRX_RED |
| 121 #define RGB_GREEN EXT_BGRX_GREEN | 128 #define RGB_GREEN EXT_BGRX_GREEN |
| 122 #define RGB_BLUE EXT_BGRX_BLUE | 129 #define RGB_BLUE EXT_BGRX_BLUE |
| 123 #define RGB_ALPHA 3 | 130 #define RGB_ALPHA 3 |
| 124 #define RGB_PIXELSIZE EXT_BGRX_PIXELSIZE | 131 #define RGB_PIXELSIZE EXT_BGRX_PIXELSIZE |
| 125 #define ycc_rgb_convert_internal ycc_extbgrx_convert_internal | 132 #define ycc_rgb_convert_internal ycc_extbgrx_convert_internal |
| 126 #define gray_rgb_convert_internal gray_extbgrx_convert_internal | 133 #define gray_rgb_convert_internal gray_extbgrx_convert_internal |
| 134 #define rgb_rgb_convert_internal rgb_extbgrx_convert_internal |
| 127 #include "jdcolext.c" | 135 #include "jdcolext.c" |
| 128 #undef RGB_RED | 136 #undef RGB_RED |
| 129 #undef RGB_GREEN | 137 #undef RGB_GREEN |
| 130 #undef RGB_BLUE | 138 #undef RGB_BLUE |
| 131 #undef RGB_ALPHA | 139 #undef RGB_ALPHA |
| 132 #undef RGB_PIXELSIZE | 140 #undef RGB_PIXELSIZE |
| 133 #undef ycc_rgb_convert_internal | 141 #undef ycc_rgb_convert_internal |
| 134 #undef gray_rgb_convert_internal | 142 #undef gray_rgb_convert_internal |
| 143 #undef rgb_rgb_convert_internal |
| 135 | 144 |
| 136 #define RGB_RED EXT_XBGR_RED | 145 #define RGB_RED EXT_XBGR_RED |
| 137 #define RGB_GREEN EXT_XBGR_GREEN | 146 #define RGB_GREEN EXT_XBGR_GREEN |
| 138 #define RGB_BLUE EXT_XBGR_BLUE | 147 #define RGB_BLUE EXT_XBGR_BLUE |
| 139 #define RGB_ALPHA 0 | 148 #define RGB_ALPHA 0 |
| 140 #define RGB_PIXELSIZE EXT_XBGR_PIXELSIZE | 149 #define RGB_PIXELSIZE EXT_XBGR_PIXELSIZE |
| 141 #define ycc_rgb_convert_internal ycc_extxbgr_convert_internal | 150 #define ycc_rgb_convert_internal ycc_extxbgr_convert_internal |
| 142 #define gray_rgb_convert_internal gray_extxbgr_convert_internal | 151 #define gray_rgb_convert_internal gray_extxbgr_convert_internal |
| 152 #define rgb_rgb_convert_internal rgb_extxbgr_convert_internal |
| 143 #include "jdcolext.c" | 153 #include "jdcolext.c" |
| 144 #undef RGB_RED | 154 #undef RGB_RED |
| 145 #undef RGB_GREEN | 155 #undef RGB_GREEN |
| 146 #undef RGB_BLUE | 156 #undef RGB_BLUE |
| 147 #undef RGB_ALPHA | 157 #undef RGB_ALPHA |
| 148 #undef RGB_PIXELSIZE | 158 #undef RGB_PIXELSIZE |
| 149 #undef ycc_rgb_convert_internal | 159 #undef ycc_rgb_convert_internal |
| 150 #undef gray_rgb_convert_internal | 160 #undef gray_rgb_convert_internal |
| 161 #undef rgb_rgb_convert_internal |
| 151 | 162 |
| 152 #define RGB_RED EXT_XRGB_RED | 163 #define RGB_RED EXT_XRGB_RED |
| 153 #define RGB_GREEN EXT_XRGB_GREEN | 164 #define RGB_GREEN EXT_XRGB_GREEN |
| 154 #define RGB_BLUE EXT_XRGB_BLUE | 165 #define RGB_BLUE EXT_XRGB_BLUE |
| 155 #define RGB_ALPHA 0 | 166 #define RGB_ALPHA 0 |
| 156 #define RGB_PIXELSIZE EXT_XRGB_PIXELSIZE | 167 #define RGB_PIXELSIZE EXT_XRGB_PIXELSIZE |
| 157 #define ycc_rgb_convert_internal ycc_extxrgb_convert_internal | 168 #define ycc_rgb_convert_internal ycc_extxrgb_convert_internal |
| 158 #define gray_rgb_convert_internal gray_extxrgb_convert_internal | 169 #define gray_rgb_convert_internal gray_extxrgb_convert_internal |
| 170 #define rgb_rgb_convert_internal rgb_extxrgb_convert_internal |
| 159 #include "jdcolext.c" | 171 #include "jdcolext.c" |
| 160 #undef RGB_RED | 172 #undef RGB_RED |
| 161 #undef RGB_GREEN | 173 #undef RGB_GREEN |
| 162 #undef RGB_BLUE | 174 #undef RGB_BLUE |
| 163 #undef RGB_ALPHA | 175 #undef RGB_ALPHA |
| 164 #undef RGB_PIXELSIZE | 176 #undef RGB_PIXELSIZE |
| 165 #undef ycc_rgb_convert_internal | 177 #undef ycc_rgb_convert_internal |
| 166 #undef gray_rgb_convert_internal | 178 #undef gray_rgb_convert_internal |
| 179 #undef rgb_rgb_convert_internal |
| 167 | 180 |
| 168 | 181 |
| 169 /* | 182 /* |
| 170 * Initialize tables for YCC->RGB colorspace conversion. | 183 * Initialize tables for YCC->RGB colorspace conversion. |
| 171 */ | 184 */ |
| 172 | 185 |
| 173 LOCAL(void) | 186 LOCAL(void) |
| 174 build_ycc_rgb_table (j_decompress_ptr cinfo) | 187 build_ycc_rgb_table (j_decompress_ptr cinfo) |
| 175 { | 188 { |
| 176 my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; | 189 my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 345 break; | 358 break; |
| 346 default: | 359 default: |
| 347 gray_rgb_convert_internal(cinfo, input_buf, input_row, output_buf, | 360 gray_rgb_convert_internal(cinfo, input_buf, input_row, output_buf, |
| 348 num_rows); | 361 num_rows); |
| 349 break; | 362 break; |
| 350 } | 363 } |
| 351 } | 364 } |
| 352 | 365 |
| 353 | 366 |
| 354 /* | 367 /* |
| 368 * Convert plain RGB to extended RGB |
| 369 */ |
| 370 |
| 371 METHODDEF(void) |
| 372 rgb_rgb_convert (j_decompress_ptr cinfo, |
| 373 JSAMPIMAGE input_buf, JDIMENSION input_row, |
| 374 JSAMPARRAY output_buf, int num_rows) |
| 375 { |
| 376 switch (cinfo->out_color_space) { |
| 377 case JCS_EXT_RGB: |
| 378 rgb_extrgb_convert_internal(cinfo, input_buf, input_row, output_buf, |
| 379 num_rows); |
| 380 break; |
| 381 case JCS_EXT_RGBX: |
| 382 case JCS_EXT_RGBA: |
| 383 rgb_extrgbx_convert_internal(cinfo, input_buf, input_row, output_buf, |
| 384 num_rows); |
| 385 break; |
| 386 case JCS_EXT_BGR: |
| 387 rgb_extbgr_convert_internal(cinfo, input_buf, input_row, output_buf, |
| 388 num_rows); |
| 389 break; |
| 390 case JCS_EXT_BGRX: |
| 391 case JCS_EXT_BGRA: |
| 392 rgb_extbgrx_convert_internal(cinfo, input_buf, input_row, output_buf, |
| 393 num_rows); |
| 394 break; |
| 395 case JCS_EXT_XBGR: |
| 396 case JCS_EXT_ABGR: |
| 397 rgb_extxbgr_convert_internal(cinfo, input_buf, input_row, output_buf, |
| 398 num_rows); |
| 399 break; |
| 400 case JCS_EXT_XRGB: |
| 401 case JCS_EXT_ARGB: |
| 402 rgb_extxrgb_convert_internal(cinfo, input_buf, input_row, output_buf, |
| 403 num_rows); |
| 404 break; |
| 405 default: |
| 406 rgb_rgb_convert_internal(cinfo, input_buf, input_row, output_buf, |
| 407 num_rows); |
| 408 break; |
| 409 } |
| 410 } |
| 411 |
| 412 /* |
| 355 * Adobe-style YCCK->CMYK conversion. | 413 * Adobe-style YCCK->CMYK conversion. |
| 356 * We convert YCbCr to R=1-C, G=1-M, and B=1-Y using the same | 414 * We convert YCbCr to R=1-C, G=1-M, and B=1-Y using the same |
| 357 * conversion as above, while passing K (black) unchanged. | 415 * conversion as above, while passing K (black) unchanged. |
| 358 * We assume build_ycc_rgb_table has been called. | 416 * We assume build_ycc_rgb_table has been called. |
| 359 */ | 417 */ |
| 360 | 418 |
| 361 METHODDEF(void) | 419 METHODDEF(void) |
| 362 ycck_cmyk_convert (j_decompress_ptr cinfo, | 420 ycck_cmyk_convert (j_decompress_ptr cinfo, |
| 363 JSAMPIMAGE input_buf, JDIMENSION input_row, | 421 JSAMPIMAGE input_buf, JDIMENSION input_row, |
| 364 JSAMPARRAY output_buf, int num_rows) | 422 JSAMPARRAY output_buf, int num_rows) |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 486 cinfo->out_color_components = rgb_pixelsize[cinfo->out_color_space]; | 544 cinfo->out_color_components = rgb_pixelsize[cinfo->out_color_space]; |
| 487 if (cinfo->jpeg_color_space == JCS_YCbCr) { | 545 if (cinfo->jpeg_color_space == JCS_YCbCr) { |
| 488 if (jsimd_can_ycc_rgb()) | 546 if (jsimd_can_ycc_rgb()) |
| 489 cconvert->pub.color_convert = jsimd_ycc_rgb_convert; | 547 cconvert->pub.color_convert = jsimd_ycc_rgb_convert; |
| 490 else { | 548 else { |
| 491 cconvert->pub.color_convert = ycc_rgb_convert; | 549 cconvert->pub.color_convert = ycc_rgb_convert; |
| 492 build_ycc_rgb_table(cinfo); | 550 build_ycc_rgb_table(cinfo); |
| 493 } | 551 } |
| 494 } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) { | 552 } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) { |
| 495 cconvert->pub.color_convert = gray_rgb_convert; | 553 cconvert->pub.color_convert = gray_rgb_convert; |
| 496 } else if (cinfo->jpeg_color_space == cinfo->out_color_space && | 554 } else if (cinfo->jpeg_color_space == JCS_RGB) { |
| 497 rgb_pixelsize[cinfo->out_color_space] == 3) { | 555 if (rgb_red[cinfo->out_color_space] == 0 && |
| 498 cconvert->pub.color_convert = null_convert; | 556 rgb_green[cinfo->out_color_space] == 1 && |
| 557 rgb_blue[cinfo->out_color_space] == 2 && |
| 558 rgb_pixelsize[cinfo->out_color_space] == 3) |
| 559 cconvert->pub.color_convert = null_convert; |
| 560 else |
| 561 cconvert->pub.color_convert = rgb_rgb_convert; |
| 499 } else | 562 } else |
| 500 ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); | 563 ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); |
| 501 break; | 564 break; |
| 502 | 565 |
| 503 case JCS_CMYK: | 566 case JCS_CMYK: |
| 504 cinfo->out_color_components = 4; | 567 cinfo->out_color_components = 4; |
| 505 if (cinfo->jpeg_color_space == JCS_YCCK) { | 568 if (cinfo->jpeg_color_space == JCS_YCCK) { |
| 506 cconvert->pub.color_convert = ycck_cmyk_convert; | 569 cconvert->pub.color_convert = ycck_cmyk_convert; |
| 507 build_ycc_rgb_table(cinfo); | 570 build_ycc_rgb_table(cinfo); |
| 508 } else if (cinfo->jpeg_color_space == JCS_CMYK) { | 571 } else if (cinfo->jpeg_color_space == JCS_CMYK) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 519 } else /* unsupported non-null conversion */ | 582 } else /* unsupported non-null conversion */ |
| 520 ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); | 583 ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); |
| 521 break; | 584 break; |
| 522 } | 585 } |
| 523 | 586 |
| 524 if (cinfo->quantize_colors) | 587 if (cinfo->quantize_colors) |
| 525 cinfo->output_components = 1; /* single colormapped output component */ | 588 cinfo->output_components = 1; /* single colormapped output component */ |
| 526 else | 589 else |
| 527 cinfo->output_components = cinfo->out_color_components; | 590 cinfo->output_components = cinfo->out_color_components; |
| 528 } | 591 } |
| OLD | NEW |