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

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

Issue 2691213007: color: Don't use QCMS for transforms unless necessary (Closed)
Patch Set: Fix cache hit computation of parse result 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 "third_party/skia/include/core/SkData.h"
13 #include "third_party/skia/include/core/SkICC.h"
12 #include "ui/gfx/icc_profile.h" 14 #include "ui/gfx/icc_profile.h"
13 #include "ui/gfx/skia_color_space_util.h" 15 #include "ui/gfx/skia_color_space_util.h"
14 #include "ui/gfx/transform.h" 16 #include "ui/gfx/transform.h"
15 17
16 namespace gfx { 18 namespace gfx {
17 19
18 ColorSpace::PrimaryID ColorSpace::PrimaryIDFromInt(int primary_id) { 20 ColorSpace::PrimaryID ColorSpace::PrimaryIDFromInt(int primary_id) {
19 if (primary_id < 0 || primary_id > static_cast<int>(PrimaryID::LAST)) 21 if (primary_id < 0 || primary_id > static_cast<int>(PrimaryID::LAST))
20 return PrimaryID::UNKNOWN; 22 return PrimaryID::UNKNOWN;
21 if (primary_id > static_cast<int>(PrimaryID::LAST_STANDARD_VALUE) && 23 if (primary_id > static_cast<int>(PrimaryID::LAST_STANDARD_VALUE) &&
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 return *this != gfx::ColorSpace(); 91 return *this != gfx::ColorSpace();
90 } 92 }
91 93
92 // static 94 // static
93 ColorSpace ColorSpace::CreateSRGB() { 95 ColorSpace ColorSpace::CreateSRGB() {
94 return ColorSpace(PrimaryID::BT709, TransferID::IEC61966_2_1, MatrixID::RGB, 96 return ColorSpace(PrimaryID::BT709, TransferID::IEC61966_2_1, MatrixID::RGB,
95 RangeID::FULL); 97 RangeID::FULL);
96 } 98 }
97 99
98 // static 100 // static
101 ColorSpace ColorSpace::CreateCustom(const SkMatrix44& to_XYZD50,
102 const SkColorSpaceTransferFn& fn) {
103 ColorSpace result(ColorSpace::PrimaryID::CUSTOM,
hubbe 2017/02/16 01:28:29 It would be really cool if we could map custom tra
ccameron 2017/02/16 01:58:47 Added a TODO. Might get to it soon (w/ some pendin
104 ColorSpace::TransferID::CUSTOM, ColorSpace::MatrixID::RGB,
105 ColorSpace::RangeID::FULL);
106 for (int row = 0; row < 3; ++row) {
107 for (int col = 0; col < 3; ++col) {
108 result.custom_primary_matrix_[3 * row + col] = to_XYZD50.get(row, col);
109 }
110 }
111 result.custom_transfer_params_[0] = fn.fA;
112 result.custom_transfer_params_[1] = fn.fB;
113 result.custom_transfer_params_[2] = fn.fC;
114 result.custom_transfer_params_[3] = fn.fD;
115 result.custom_transfer_params_[4] = fn.fE;
116 result.custom_transfer_params_[5] = fn.fF;
117 result.custom_transfer_params_[6] = fn.fG;
118 return result;
119 }
120
121 // static
99 ColorSpace ColorSpace::CreateSCRGBLinear() { 122 ColorSpace ColorSpace::CreateSCRGBLinear() {
100 return ColorSpace(PrimaryID::BT709, TransferID::LINEAR_HDR, MatrixID::RGB, 123 return ColorSpace(PrimaryID::BT709, TransferID::LINEAR_HDR, MatrixID::RGB,
101 RangeID::FULL); 124 RangeID::FULL);
102 } 125 }
103 126
104 // Static 127 // Static
105 ColorSpace ColorSpace::CreateXYZD50() { 128 ColorSpace ColorSpace::CreateXYZD50() {
106 return ColorSpace(PrimaryID::XYZ_D50, TransferID::LINEAR, MatrixID::RGB, 129 return ColorSpace(PrimaryID::XYZ_D50, TransferID::LINEAR, MatrixID::RGB,
107 RangeID::FULL); 130 RangeID::FULL);
108 } 131 }
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 258
236 // Use the parametric transfer function if no other option is available. 259 // Use the parametric transfer function if no other option is available.
237 SkColorSpaceTransferFn fn; 260 SkColorSpaceTransferFn fn;
238 if (!GetTransferFunction(&fn)) { 261 if (!GetTransferFunction(&fn)) {
239 DLOG(ERROR) << "Failed to parameterize transfer function for SkColorSpace"; 262 DLOG(ERROR) << "Failed to parameterize transfer function for SkColorSpace";
240 return nullptr; 263 return nullptr;
241 } 264 }
242 return SkColorSpace::MakeRGB(fn, to_xyz_d50); 265 return SkColorSpace::MakeRGB(fn, to_xyz_d50);
243 } 266 }
244 267
268 bool ColorSpace::GetICCProfile(ICCProfile* icc_profile) const {
269 if (!IsValid())
270 return false;
271
272 // If this was created from an ICC profile, retrieve that exact profile.
273 ICCProfile result;
274 if (ICCProfile::FromId(icc_profile_id_, false, icc_profile))
275 return true;
276
277 // Otherwise, construct an ICC profile based on the best approximated
278 // primaries and matrix.
279 SkMatrix44 to_XYZD50_matrix;
280 GetPrimaryMatrix(&to_XYZD50_matrix);
281 SkColorSpaceTransferFn fn;
282 if (!GetTransferFunction(&fn)) {
283 DLOG(ERROR) << "Failed to get ColorSpace transfer function for ICCProfile.";
284 return false;
285 }
286 sk_sp<SkData> data = SkICC::WriteToICC(fn, to_XYZD50_matrix);
287 if (!data) {
288 DLOG(ERROR) << "Failed to create SkICC.";
289 return false;
290 }
291 *icc_profile = ICCProfile::FromData(data->data(), data->size());
292 DCHECK(icc_profile->IsValid());
293 return true;
294 }
295
245 void ColorSpace::GetPrimaryMatrix(SkMatrix44* to_XYZD50) const { 296 void ColorSpace::GetPrimaryMatrix(SkMatrix44* to_XYZD50) const {
246 SkColorSpacePrimaries primaries = {0}; 297 SkColorSpacePrimaries primaries = {0};
247 switch (primaries_) { 298 switch (primaries_) {
248 case ColorSpace::PrimaryID::CUSTOM: 299 case ColorSpace::PrimaryID::CUSTOM:
249 to_XYZD50->set3x3RowMajorf(custom_primary_matrix_); 300 to_XYZD50->set3x3RowMajorf(custom_primary_matrix_);
250 return; 301 return;
251 302
252 case ColorSpace::PrimaryID::RESERVED0: 303 case ColorSpace::PrimaryID::RESERVED0:
253 case ColorSpace::PrimaryID::RESERVED: 304 case ColorSpace::PrimaryID::RESERVED:
254 case ColorSpace::PrimaryID::UNSPECIFIED: 305 case ColorSpace::PrimaryID::UNSPECIFIED:
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after
588 case MatrixID::BT2020_CL: 639 case MatrixID::BT2020_CL:
589 case MatrixID::YDZDX: 640 case MatrixID::YDZDX:
590 case MatrixID::UNKNOWN: 641 case MatrixID::UNKNOWN:
591 matrix->setScale(255.0f/219.0f, 255.0f/224.0f, 255.0f/224.0f); 642 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); 643 matrix->postTranslate(-16.0f/219.0f, -15.5f/224.0f, -15.5f/224.0f);
593 break; 644 break;
594 } 645 }
595 } 646 }
596 647
597 } // namespace gfx 648 } // namespace gfx
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698