Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(180)

Side by Side Diff: ui/gfx/color_space.cc

Issue 2697863003: color: Clarify default behaviors (Closed)
Patch Set: Remove more refs from chromecast Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/gfx/color_space.h" 5 #include "ui/gfx/color_space.h"
6 6
7 #include <map> 7 #include <map>
8 8
9 #include "base/lazy_instance.h" 9 #include "base/lazy_instance.h"
10 #include "base/synchronization/lock.h" 10 #include "base/synchronization/lock.h"
11 #include "third_party/skia/include/core/SkColorSpace.h" 11 #include "third_party/skia/include/core/SkColorSpace.h"
12 #include "ui/gfx/icc_profile.h" 12 #include "ui/gfx/icc_profile.h"
13 #include "ui/gfx/skia_color_space_util.h" 13 #include "ui/gfx/skia_color_space_util.h"
14 #include "ui/gfx/transform.h" 14 #include "ui/gfx/transform.h"
15 15
16 namespace gfx { 16 namespace gfx {
17 17
18 ColorSpace::PrimaryID ColorSpace::PrimaryIDFromInt(int primary_id) { 18 // static
19 if (primary_id < 0 || primary_id > static_cast<int>(PrimaryID::LAST)) 19 ColorSpace ColorSpace::CreateVideo(int video_primary,
20 return PrimaryID::UNKNOWN; 20 int video_transfer,
21 if (primary_id > static_cast<int>(PrimaryID::LAST_STANDARD_VALUE) && 21 int video_matrix,
22 primary_id < 1000) 22 RangeID range_id) {
23 return PrimaryID::UNKNOWN; 23 ColorSpace result;
24 return static_cast<PrimaryID>(primary_id); 24 switch (video_primary) {
hubbe 2017/02/16 08:20:50 Add TODO to make this smarter so that UNSPECIFIED
ccameron 2017/02/16 20:45:27 Done.
25 } 25 default:
26 26 case 0: // RESERVED0
27 ColorSpace::TransferID ColorSpace::TransferIDFromInt(int transfer_id) { 27 case 1: // BT709
28 if (transfer_id < 0 || transfer_id > static_cast<int>(TransferID::LAST)) 28 case 2: // UNSPECIFIED
29 return TransferID::UNKNOWN; 29 case 3: // RESERVED
30 if (transfer_id > static_cast<int>(TransferID::LAST_STANDARD_VALUE) && 30 result.primaries_ = PrimaryID::BT709;
31 transfer_id < 1000) 31 break;
32 return TransferID::UNKNOWN; 32 case 4: // BT470M
33 return static_cast<TransferID>(transfer_id); 33 result.primaries_ = PrimaryID::BT470M;
34 } 34 break;
35 35 case 5: // BT470BG
36 ColorSpace::MatrixID ColorSpace::MatrixIDFromInt(int matrix_id) { 36 result.primaries_ = PrimaryID::BT470BG;
37 if (matrix_id < 0 || matrix_id > static_cast<int>(MatrixID::LAST)) 37 break;
38 return MatrixID::UNKNOWN; 38 case 6: // SMPTE170M
39 if (matrix_id > static_cast<int>(MatrixID::LAST_STANDARD_VALUE) && 39 result.primaries_ = PrimaryID::SMPTE170M;
40 matrix_id < 1000) 40 break;
41 return MatrixID::UNKNOWN; 41 case 7: // SMPTE240M
42 return static_cast<MatrixID>(matrix_id); 42 result.primaries_ = PrimaryID::SMPTE240M;
43 break;
44 case 8: // FILM
45 result.primaries_ = PrimaryID::FILM;
46 break;
47 case 9: // BT2020
48 result.primaries_ = PrimaryID::BT2020;
49 break;
50 case 10: // SMPTEST428_1
51 result.primaries_ = PrimaryID::SMPTEST428_1;
52 break;
53 case 11: // SMPTEST431_2
54 result.primaries_ = PrimaryID::SMPTEST431_2;
55 break;
56 case 12: // SMPTEST432_1
57 result.primaries_ = PrimaryID::SMPTEST432_1;
58 break;
59 }
60 switch (video_transfer) {
61 default:
62 case 0: // RESERVED0
63 case 1: // BT709
64 case 2: // UNSPECIFIED
65 case 3: // RESERVED
66 result.transfer_ = TransferID::BT709;
67 break;
68 case 4: // GAMMA22
69 result.transfer_ = TransferID::GAMMA22;
70 break;
71 case 5: // GAMMA28
72 result.transfer_ = TransferID::GAMMA28;
73 break;
74 case 6: // SMPTE170M
75 result.transfer_ = TransferID::SMPTE170M;
76 break;
77 case 7: // SMPTE240M
78 result.transfer_ = TransferID::SMPTE240M;
79 break;
80 case 8: // LINEAR
81 result.transfer_ = TransferID::LINEAR;
82 break;
83 case 9: // LOG
84 result.transfer_ = TransferID::LOG;
85 break;
86 case 10: // LOG_SQRT
87 result.transfer_ = TransferID::LOG_SQRT;
88 break;
89 case 11: // IEC61966_2_4
90 result.transfer_ = TransferID::IEC61966_2_4;
91 break;
92 case 12: // BT1361_ECG
93 result.transfer_ = TransferID::BT1361_ECG;
94 break;
95 case 13: // IEC61966_2_1
96 result.transfer_ = TransferID::IEC61966_2_1;
97 break;
98 case 14: // BT2020_10
99 result.transfer_ = TransferID::BT2020_10;
100 break;
101 case 15: // BT2020_12
102 result.transfer_ = TransferID::BT2020_12;
103 break;
104 case 16: // SMPTEST2084
105 result.transfer_ = TransferID::SMPTEST2084;
106 break;
107 case 17: // SMPTEST428_1
108 result.transfer_ = TransferID::SMPTEST428_1;
109 break;
110 case 18: // ARIB_STD_B67
111 result.transfer_ = TransferID::ARIB_STD_B67;
112 break;
113 }
114 switch (video_matrix) {
115 case 0: // RGB
116 result.matrix_ = MatrixID::RGB;
117 break;
118 default:
119 case 1: // BT709
120 case 2: // UNSPECIFIED
121 break;
122 case 3: // RESERVED
123 result.matrix_ = MatrixID::BT709;
124 break;
125 case 4: // FCC
126 result.matrix_ = MatrixID::FCC;
127 break;
128 case 5: // BT470BG
129 result.matrix_ = MatrixID::BT470BG;
130 break;
131 case 6: // SMPTE170M
132 result.matrix_ = MatrixID::SMPTE170M;
133 break;
134 case 7: // SMPTE240M
135 result.matrix_ = MatrixID::SMPTE240M;
136 break;
137 case 8: // YCOCG
138 result.matrix_ = MatrixID::YCOCG;
139 break;
140 case 9: // BT2020_NCL
141 result.matrix_ = MatrixID::BT2020_NCL;
142 break;
143 case 10: // BT2020_CL
144 result.matrix_ = MatrixID::BT2020_CL;
145 break;
146 case 11: // YDZDX
147 result.matrix_ = MatrixID::YDZDX;
148 break;
149 }
150 result.range_ = range_id;
151 return result;
43 } 152 }
44 153
45 ColorSpace::ColorSpace() {} 154 ColorSpace::ColorSpace() {}
46 155
47 ColorSpace::ColorSpace(PrimaryID primaries, 156 ColorSpace::ColorSpace(PrimaryID primaries,
48 TransferID transfer) 157 TransferID transfer)
49 : primaries_(primaries), 158 : primaries_(primaries),
50 transfer_(transfer), 159 transfer_(transfer),
51 matrix_(MatrixID::RGB), 160 matrix_(MatrixID::RGB),
52 range_(RangeID::FULL) {} 161 range_(RangeID::FULL) {}
53 162
54 ColorSpace::ColorSpace(PrimaryID primaries, 163 ColorSpace::ColorSpace(PrimaryID primaries,
55 TransferID transfer, 164 TransferID transfer,
56 MatrixID matrix, 165 MatrixID matrix,
57 RangeID range) 166 RangeID range)
58 : primaries_(primaries), 167 : primaries_(primaries),
59 transfer_(transfer), 168 transfer_(transfer),
60 matrix_(matrix), 169 matrix_(matrix),
61 range_(range) {} 170 range_(range) {}
62 171
63 ColorSpace::ColorSpace(int primaries, int transfer, int matrix, RangeID range)
64 : primaries_(PrimaryIDFromInt(primaries)),
65 transfer_(TransferIDFromInt(transfer)),
66 matrix_(MatrixIDFromInt(matrix)),
67 range_(range) {}
68
69 ColorSpace::ColorSpace(const ColorSpace& other) 172 ColorSpace::ColorSpace(const ColorSpace& other)
70 : primaries_(other.primaries_), 173 : primaries_(other.primaries_),
71 transfer_(other.transfer_), 174 transfer_(other.transfer_),
72 matrix_(other.matrix_), 175 matrix_(other.matrix_),
73 range_(other.range_), 176 range_(other.range_),
74 icc_profile_id_(other.icc_profile_id_), 177 icc_profile_id_(other.icc_profile_id_),
75 icc_profile_sk_color_space_(other.icc_profile_sk_color_space_) { 178 icc_profile_sk_color_space_(other.icc_profile_sk_color_space_) {
76 if (transfer_ == TransferID::CUSTOM) { 179 if (transfer_ == TransferID::CUSTOM) {
77 memcpy(custom_transfer_params_, other.custom_transfer_params_, 180 memcpy(custom_transfer_params_, other.custom_transfer_params_,
78 sizeof(custom_transfer_params_)); 181 sizeof(custom_transfer_params_));
79 } 182 }
80 if (primaries_ == PrimaryID::CUSTOM) { 183 if (primaries_ == PrimaryID::CUSTOM) {
81 memcpy(custom_primary_matrix_, other.custom_primary_matrix_, 184 memcpy(custom_primary_matrix_, other.custom_primary_matrix_,
82 sizeof(custom_primary_matrix_)); 185 sizeof(custom_primary_matrix_));
83 } 186 }
84 } 187 }
85
86 ColorSpace::~ColorSpace() = default; 188 ColorSpace::~ColorSpace() = default;
87 189
88 bool ColorSpace::IsValid() const { 190 bool ColorSpace::IsValid() const {
89 return *this != gfx::ColorSpace(); 191 return primaries_ != PrimaryID::INVALID && transfer_ != TransferID::INVALID &&
192 matrix_ != MatrixID::INVALID && range_ != RangeID::INVALID;
90 } 193 }
91 194
92 // static 195 // static
93 ColorSpace ColorSpace::CreateSRGB() { 196 ColorSpace ColorSpace::CreateSRGB() {
94 return ColorSpace(PrimaryID::BT709, TransferID::IEC61966_2_1, MatrixID::RGB, 197 return ColorSpace(PrimaryID::BT709, TransferID::IEC61966_2_1, MatrixID::RGB,
95 RangeID::FULL); 198 RangeID::FULL);
96 } 199 }
97 200
98 // static 201 // static
99 ColorSpace ColorSpace::CreateSCRGBLinear() { 202 ColorSpace ColorSpace::CreateSCRGBLinear() {
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 return false; 293 return false;
191 } 294 }
192 295
193 sk_sp<SkColorSpace> ColorSpace::ToSkColorSpace() const { 296 sk_sp<SkColorSpace> ColorSpace::ToSkColorSpace() const {
194 // If we got a specific SkColorSpace from the ICCProfile that this color space 297 // If we got a specific SkColorSpace from the ICCProfile that this color space
195 // was created from, use that. 298 // was created from, use that.
196 if (icc_profile_sk_color_space_) 299 if (icc_profile_sk_color_space_)
197 return icc_profile_sk_color_space_; 300 return icc_profile_sk_color_space_;
198 301
199 // Unspecified color spaces correspond to the null SkColorSpace. 302 // Unspecified color spaces correspond to the null SkColorSpace.
200 if (primaries_ == PrimaryID::UNSPECIFIED || 303 if (!IsValid())
201 transfer_ == TransferID::UNSPECIFIED) {
202 return nullptr; 304 return nullptr;
203 }
204 305
205 // Handle only full-range RGB spaces. 306 // Handle only full-range RGB spaces.
206 if (matrix_ != MatrixID::RGB) { 307 if (matrix_ != MatrixID::RGB) {
207 DLOG(ERROR) << "Not creating non-RGB SkColorSpace"; 308 DLOG(ERROR) << "Not creating non-RGB SkColorSpace";
208 return nullptr; 309 return nullptr;
209 } 310 }
210 if (range_ != RangeID::FULL) { 311 if (range_ != RangeID::FULL) {
211 DLOG(ERROR) << "Not creating non-full-range SkColorSpace"; 312 DLOG(ERROR) << "Not creating non-full-range SkColorSpace";
212 return nullptr; 313 return nullptr;
213 } 314 }
(...skipping 28 matching lines...) Expand all
242 return SkColorSpace::MakeRGB(fn, to_xyz_d50); 343 return SkColorSpace::MakeRGB(fn, to_xyz_d50);
243 } 344 }
244 345
245 void ColorSpace::GetPrimaryMatrix(SkMatrix44* to_XYZD50) const { 346 void ColorSpace::GetPrimaryMatrix(SkMatrix44* to_XYZD50) const {
246 SkColorSpacePrimaries primaries = {0}; 347 SkColorSpacePrimaries primaries = {0};
247 switch (primaries_) { 348 switch (primaries_) {
248 case ColorSpace::PrimaryID::CUSTOM: 349 case ColorSpace::PrimaryID::CUSTOM:
249 to_XYZD50->set3x3RowMajorf(custom_primary_matrix_); 350 to_XYZD50->set3x3RowMajorf(custom_primary_matrix_);
250 return; 351 return;
251 352
252 case ColorSpace::PrimaryID::RESERVED0: 353 case ColorSpace::PrimaryID::INVALID:
253 case ColorSpace::PrimaryID::RESERVED: 354 to_XYZD50->setIdentity();
254 case ColorSpace::PrimaryID::UNSPECIFIED: 355 return;
255 case ColorSpace::PrimaryID::UNKNOWN: 356
256 case ColorSpace::PrimaryID::BT709: 357 case ColorSpace::PrimaryID::BT709:
257 // BT709 is our default case. Put it after the switch just 358 // BT709 is our default case. Put it after the switch just
258 // in case we somehow get an id which is not listed in the switch. 359 // in case we somehow get an id which is not listed in the switch.
259 // (We don't want to use "default", because we want the compiler 360 // (We don't want to use "default", because we want the compiler
260 // to tell us if we forgot some enum values.) 361 // to tell us if we forgot some enum values.)
261 primaries.fRX = 0.640f; 362 primaries.fRX = 0.640f;
262 primaries.fRY = 0.330f; 363 primaries.fRY = 0.330f;
263 primaries.fGX = 0.300f; 364 primaries.fGX = 0.300f;
264 primaries.fGY = 0.600f; 365 primaries.fGY = 0.600f;
265 primaries.fBX = 0.150f; 366 primaries.fBX = 0.150f;
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 return true; 508 return true;
408 case ColorSpace::TransferID::GAMMA22: 509 case ColorSpace::TransferID::GAMMA22:
409 fn->fG = 2.2f; 510 fn->fG = 2.2f;
410 return true; 511 return true;
411 case ColorSpace::TransferID::GAMMA24: 512 case ColorSpace::TransferID::GAMMA24:
412 fn->fG = 2.4f; 513 fn->fG = 2.4f;
413 return true; 514 return true;
414 case ColorSpace::TransferID::GAMMA28: 515 case ColorSpace::TransferID::GAMMA28:
415 fn->fG = 2.8f; 516 fn->fG = 2.8f;
416 return true; 517 return true;
417 case ColorSpace::TransferID::RESERVED0:
418 case ColorSpace::TransferID::RESERVED:
419 case ColorSpace::TransferID::UNSPECIFIED:
420 case ColorSpace::TransferID::UNKNOWN:
421 // All unknown values default to BT709
422 case ColorSpace::TransferID::BT709: 518 case ColorSpace::TransferID::BT709:
423 case ColorSpace::TransferID::SMPTE170M: 519 case ColorSpace::TransferID::SMPTE170M:
424 case ColorSpace::TransferID::BT2020_10: 520 case ColorSpace::TransferID::BT2020_10:
425 case ColorSpace::TransferID::BT2020_12: 521 case ColorSpace::TransferID::BT2020_12:
426 fn->fA = 0.909672431050f; 522 fn->fA = 0.909672431050f;
427 fn->fB = 0.090327568950f; 523 fn->fB = 0.090327568950f;
428 fn->fC = 0.222222222222f; 524 fn->fC = 0.222222222222f;
429 fn->fD = 0.081242862158f; 525 fn->fD = 0.081242862158f;
430 fn->fG = 2.222222222222f; 526 fn->fG = 2.222222222222f;
431 return true; 527 return true;
(...skipping 19 matching lines...) Expand all
451 case ColorSpace::TransferID::IEC61966_2_4: 547 case ColorSpace::TransferID::IEC61966_2_4:
452 // This could potentially be represented the same as IEC61966_2_1, but 548 // This could potentially be represented the same as IEC61966_2_1, but
453 // it handles negative values differently. 549 // it handles negative values differently.
454 break; 550 break;
455 case ColorSpace::TransferID::ARIB_STD_B67: 551 case ColorSpace::TransferID::ARIB_STD_B67:
456 case ColorSpace::TransferID::BT1361_ECG: 552 case ColorSpace::TransferID::BT1361_ECG:
457 case ColorSpace::TransferID::LOG: 553 case ColorSpace::TransferID::LOG:
458 case ColorSpace::TransferID::LOG_SQRT: 554 case ColorSpace::TransferID::LOG_SQRT:
459 case ColorSpace::TransferID::SMPTEST2084: 555 case ColorSpace::TransferID::SMPTEST2084:
460 case ColorSpace::TransferID::SMPTEST2084_NON_HDR: 556 case ColorSpace::TransferID::SMPTEST2084_NON_HDR:
557 case ColorSpace::TransferID::INVALID:
461 break; 558 break;
462 } 559 }
463 560
464 return false; 561 return false;
465 } 562 }
466 563
467 bool ColorSpace::GetInverseTransferFunction(SkColorSpaceTransferFn* fn) const { 564 bool ColorSpace::GetInverseTransferFunction(SkColorSpaceTransferFn* fn) const {
468 if (!GetTransferFunction(fn)) 565 if (!GetTransferFunction(fn))
469 return false; 566 return false;
470 *fn = SkTransferFnInverse(*fn); 567 *fn = SkTransferFnInverse(*fn);
471 return true; 568 return true;
472 } 569 }
473 570
474 void ColorSpace::GetTransferMatrix(SkMatrix44* matrix) const { 571 void ColorSpace::GetTransferMatrix(SkMatrix44* matrix) const {
475 float Kr = 0; 572 float Kr = 0;
476 float Kb = 0; 573 float Kb = 0;
477 switch (matrix_) { 574 switch (matrix_) {
478 case ColorSpace::MatrixID::RGB: 575 case ColorSpace::MatrixID::RGB:
576 case ColorSpace::MatrixID::INVALID:
479 matrix->setIdentity(); 577 matrix->setIdentity();
480 return; 578 return;
481 579
482 case ColorSpace::MatrixID::BT709: 580 case ColorSpace::MatrixID::BT709:
483 case ColorSpace::MatrixID::UNSPECIFIED:
484 case ColorSpace::MatrixID::RESERVED:
485 case ColorSpace::MatrixID::UNKNOWN:
486 Kr = 0.2126f; 581 Kr = 0.2126f;
487 Kb = 0.0722f; 582 Kb = 0.0722f;
488 break; 583 break;
489 584
490 case ColorSpace::MatrixID::FCC: 585 case ColorSpace::MatrixID::FCC:
491 Kr = 0.30f; 586 Kr = 0.30f;
492 Kb = 0.11f; 587 Kb = 0.11f;
493 break; 588 break;
494 589
495 case ColorSpace::MatrixID::BT470BG: 590 case ColorSpace::MatrixID::BT470BG:
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
555 u_m * -Kr, u_m * -Kg, u_m * (1.0f - Kb), 0.5f, // U 650 u_m * -Kr, u_m * -Kg, u_m * (1.0f - Kb), 0.5f, // U
556 v_m * (1.0f - Kr), v_m * -Kg, v_m * -Kb, 0.5f, // V 651 v_m * (1.0f - Kr), v_m * -Kg, v_m * -Kb, 0.5f, // V
557 0.0f, 0.0f, 0.0f, 1.0f, 652 0.0f, 0.0f, 0.0f, 1.0f,
558 }; 653 };
559 matrix->setRowMajorf(data); 654 matrix->setRowMajorf(data);
560 } 655 }
561 656
562 void ColorSpace::GetRangeAdjustMatrix(SkMatrix44* matrix) const { 657 void ColorSpace::GetRangeAdjustMatrix(SkMatrix44* matrix) const {
563 switch (range_) { 658 switch (range_) {
564 case RangeID::FULL: 659 case RangeID::FULL:
565 case RangeID::UNSPECIFIED: 660 case RangeID::INVALID:
566 matrix->setIdentity(); 661 matrix->setIdentity();
567 return; 662 return;
568 663
569 case RangeID::DERIVED: 664 case RangeID::DERIVED:
570 case RangeID::LIMITED: 665 case RangeID::LIMITED:
571 break; 666 break;
572 } 667 }
573 switch (matrix_) { 668 switch (matrix_) {
574 case MatrixID::RGB: 669 case MatrixID::RGB:
670 case MatrixID::INVALID:
575 case MatrixID::YCOCG: 671 case MatrixID::YCOCG:
576 matrix->setScale(255.0f/219.0f, 255.0f/219.0f, 255.0f/219.0f); 672 matrix->setScale(255.0f/219.0f, 255.0f/219.0f, 255.0f/219.0f);
577 matrix->postTranslate(-16.0f/219.0f, -16.0f/219.0f, -16.0f/219.0f); 673 matrix->postTranslate(-16.0f/219.0f, -16.0f/219.0f, -16.0f/219.0f);
578 break; 674 break;
579 675
580 case MatrixID::BT709: 676 case MatrixID::BT709:
581 case MatrixID::UNSPECIFIED:
582 case MatrixID::RESERVED:
583 case MatrixID::FCC: 677 case MatrixID::FCC:
584 case MatrixID::BT470BG: 678 case MatrixID::BT470BG:
585 case MatrixID::SMPTE170M: 679 case MatrixID::SMPTE170M:
586 case MatrixID::SMPTE240M: 680 case MatrixID::SMPTE240M:
587 case MatrixID::BT2020_NCL: 681 case MatrixID::BT2020_NCL:
588 case MatrixID::BT2020_CL: 682 case MatrixID::BT2020_CL:
589 case MatrixID::YDZDX: 683 case MatrixID::YDZDX:
590 case MatrixID::UNKNOWN:
591 matrix->setScale(255.0f/219.0f, 255.0f/224.0f, 255.0f/224.0f); 684 matrix->setScale(255.0f/219.0f, 255.0f/224.0f, 255.0f/224.0f);
592 matrix->postTranslate(-16.0f/219.0f, -15.5f/224.0f, -15.5f/224.0f); 685 matrix->postTranslate(-16.0f/219.0f, -15.5f/224.0f, -15.5f/224.0f);
593 break; 686 break;
594 } 687 }
595 } 688 }
596 689
597 } // namespace gfx 690 } // namespace gfx
OLDNEW
« ui/gfx/color_space.h ('K') | « ui/gfx/color_space.h ('k') | ui/gfx/color_space_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698