 Chromium Code Reviews
 Chromium Code Reviews Issue 1975883003:
  Recognize more sRGB gammas  (Closed) 
  Base URL: https://skia.googlesource.com/skia.git@master
    
  
    Issue 1975883003:
  Recognize more sRGB gammas  (Closed) 
  Base URL: https://skia.googlesource.com/skia.git@master| OLD | NEW | 
|---|---|
| 1 /* | 1 /* | 
| 2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. | 
| 3 * | 3 * | 
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be | 
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. | 
| 6 */ | 6 */ | 
| 7 | 7 | 
| 8 #include "SkAtomics.h" | 8 #include "SkAtomics.h" | 
| 9 #include "SkColorSpace.h" | 9 #include "SkColorSpace.h" | 
| 10 #include "SkOnce.h" | 10 #include "SkOnce.h" | 
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 329 } | 329 } | 
| 330 | 330 | 
| 331 // Check for frequently occurring curves and use a fast approxim ation. | 331 // Check for frequently occurring curves and use a fast approxim ation. | 
| 332 // We do this by sampling a few values and see if they match our expectation. | 332 // We do this by sampling a few values and see if they match our expectation. | 
| 333 // A more robust solution would be to compare each value in this curve against | 333 // A more robust solution would be to compare each value in this curve against | 
| 334 // a 2.2f curve see if we remain below an error threshold. At t his time, | 334 // a 2.2f curve see if we remain below an error threshold. At t his time, | 
| 335 // we haven't seen any images in the wild that make this kind of | 335 // we haven't seen any images in the wild that make this kind of | 
| 336 // calculation necessary. We encounter identical gamma curves o ver and | 336 // calculation necessary. We encounter identical gamma curves o ver and | 
| 337 // over again, but relatively few variations. | 337 // over again, but relatively few variations. | 
| 338 if (1024 == count) { | 338 if (1024 == count) { | 
| 339 // The magic values were chosen because they match a very co mmon sRGB | |
| 340 // gamma table and the less common Canon sRGB gamma table (w hich use | |
| 341 // different rounding rules). | |
| 339 if (0 == read_big_endian_short((const uint8_t*) &table[0]) & & | 342 if (0 == read_big_endian_short((const uint8_t*) &table[0]) & & | 
| 340 3341 == read_big_endian_short((const uint8_t*) &tabl e[256]) && | 343 3366 == read_big_endian_short((const uint8_t*) &tabl e[257]) && | 
| 
scroggo
2016/05/13 12:45:24
Does still correctly identify images that were rec
 
msarett
2016/05/13 12:51:48
Yes!
 | |
| 341 14057 == read_big_endian_short((const uint8_t*) &tab le[512]) && | 344 14116 == read_big_endian_short((const uint8_t*) &tab le[513]) && | 
| 342 34318 == read_big_endian_short((const uint8_t*) &tab le[768]) && | 345 34318 == read_big_endian_short((const uint8_t*) &tab le[768]) && | 
| 343 65535 == read_big_endian_short((const uint8_t*) &tab le[1023])) { | 346 65535 == read_big_endian_short((const uint8_t*) &tab le[1023])) { | 
| 344 gammas[i].fValue = 2.2f; | 347 gammas[i].fValue = 2.2f; | 
| 345 break; | 348 break; | 
| 346 } | 349 } | 
| 347 } else if (26 == count) { | 350 } else if (26 == count) { | 
| 351 // The magic values were chosen because they match a very co mmon sRGB | |
| 352 // gamma table. | |
| 348 if (0 == read_big_endian_short((const uint8_t*) &table[0]) & & | 353 if (0 == read_big_endian_short((const uint8_t*) &table[0]) & & | 
| 349 3062 == read_big_endian_short((const uint8_t*) &tabl e[6]) && | 354 3062 == read_big_endian_short((const uint8_t*) &tabl e[6]) && | 
| 350 12824 == read_big_endian_short((const uint8_t*) &tab le[12]) && | 355 12824 == read_big_endian_short((const uint8_t*) &tab le[12]) && | 
| 351 31237 == read_big_endian_short((const uint8_t*) &tab le[18]) && | 356 31237 == read_big_endian_short((const uint8_t*) &tab le[18]) && | 
| 352 65535 == read_big_endian_short((const uint8_t*) &tab le[25])) { | 357 65535 == read_big_endian_short((const uint8_t*) &tab le[25])) { | 
| 353 gammas[i].fValue = 2.2f; | 358 gammas[i].fValue = 2.2f; | 
| 354 break; | 359 break; | 
| 355 } | 360 } | 
| 361 } else if (4096 == count) { | |
| 362 // The magic values were chosen because they match Nikon, Ep son, and | |
| 363 // LCMS sRGB gamma tables (all of which use different roundi ng rules). | |
| 364 if (0 == read_big_endian_short((const uint8_t*) &table[0]) & & | |
| 
scroggo
2016/05/13 12:45:24
As we add more of these, it makes me wonder if we
 
msarett
2016/05/13 12:51:48
I think this is a really good idea.
 | |
| 365 950 == read_big_endian_short((const uint8_t*) &table [515]) && | |
| 366 3342 == read_big_endian_short((const uint8_t*) &tabl e[1025]) && | |
| 367 14079 == read_big_endian_short((const uint8_t*) &tab le[2051]) && | |
| 368 65535 == read_big_endian_short((const uint8_t*) &tab le[4095])) { | |
| 369 gammas[i].fValue = 2.2f; | |
| 370 break; | |
| 371 } | |
| 356 } | 372 } | 
| 357 | 373 | 
| 358 // Otherwise, fill in the interpolation table. | 374 // Otherwise, fill in the interpolation table. | 
| 359 gammas[i].fTableSize = count; | 375 gammas[i].fTableSize = count; | 
| 360 gammas[i].fTable = std::unique_ptr<float[]>(new float[count]); | 376 gammas[i].fTable = std::unique_ptr<float[]>(new float[count]); | 
| 361 for (uint32_t j = 0; j < count; j++) { | 377 for (uint32_t j = 0; j < count; j++) { | 
| 362 gammas[i].fTable[j] = | 378 gammas[i].fTable[j] = | 
| 363 (read_big_endian_short((const uint8_t*) &table[j])) / 65535.0f; | 379 (read_big_endian_short((const uint8_t*) &table[j])) / 65535.0f; | 
| 364 } | 380 } | 
| 365 break; | 381 break; | 
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 659 toXYZ)); | 675 toXYZ)); | 
| 660 } | 676 } | 
| 661 | 677 | 
| 662 } | 678 } | 
| 663 default: | 679 default: | 
| 664 break; | 680 break; | 
| 665 } | 681 } | 
| 666 | 682 | 
| 667 return_null("ICC profile contains unsupported colorspace"); | 683 return_null("ICC profile contains unsupported colorspace"); | 
| 668 } | 684 } | 
| OLD | NEW |