Index: ui/gfx/icc_profile.cc |
diff --git a/ui/gfx/icc_profile.cc b/ui/gfx/icc_profile.cc |
index d2ddfef45f3a6a04c5c27791f32ca0f27f937850..b845c7d8d05165c6cc60aed0a89677ba3464e3b3 100644 |
--- a/ui/gfx/icc_profile.cc |
+++ b/ui/gfx/icc_profile.cc |
@@ -9,6 +9,7 @@ |
#include "base/containers/mru_cache.h" |
#include "base/lazy_instance.h" |
#include "base/synchronization/lock.h" |
+#include "third_party/skia/include/core/SkColorSpaceXform.h" |
#include "third_party/skia/include/core/SkICC.h" |
#include "ui/gfx/color_transform.h" |
#include "ui/gfx/skia_color_space_util.h" |
@@ -71,10 +72,8 @@ ICCProfile ICCProfile::FromData(const void* data, size_t size) { |
ICCProfile ICCProfile::FromDataWithId(const void* data, |
size_t size, |
uint64_t new_profile_id) { |
- if (!size) { |
- DLOG(ERROR) << "Invalid empty ICC profile."; |
+ if (!size) |
return ICCProfile(); |
- } |
const char* data_as_char = reinterpret_cast<const char*>(data); |
{ |
@@ -176,8 +175,20 @@ void ICCProfile::ComputeColorSpaceAndCache() { |
} |
} |
+ // Parse the profile and attempt to create a SkColorSpaceXform out of it. |
+ sk_sp<SkColorSpace> sk_srgb_color_space = SkColorSpace::MakeSRGB(); |
sk_sp<SkICC> sk_icc = SkICC::Make(data_.data(), data_.size()); |
- if (sk_icc) { |
+ sk_sp<SkColorSpace> sk_icc_color_space; |
+ std::unique_ptr<SkColorSpaceXform> sk_color_space_xform; |
+ if (sk_icc) |
+ sk_icc_color_space = SkColorSpace::MakeICC(data_.data(), data_.size()); |
+ if (sk_icc_color_space) { |
+ sk_color_space_xform = SkColorSpaceXform::New(sk_srgb_color_space.get(), |
+ sk_icc_color_space.get()); |
+ } |
+ |
+ // Attempt to extract a parametric represetation for this space. |
+ if (sk_color_space_xform) { |
bool parametric_color_space_is_accurate = false; |
successfully_parsed_by_sk_icc_ = true; |
@@ -226,11 +237,14 @@ void ICCProfile::ComputeColorSpaceAndCache() { |
color_space_ = ColorSpace(ColorSpace::PrimaryID::ICC_BASED, |
ColorSpace::TransferID::ICC_BASED); |
color_space_.icc_profile_id_ = id_; |
- color_space_.icc_profile_sk_color_space_ = |
- SkColorSpace::MakeICC(data_.data(), data_.size()); |
+ color_space_.icc_profile_sk_color_space_ = sk_icc_color_space; |
} |
+ } else if (sk_icc_color_space) { |
+ DLOG(ERROR) << "Parsed ICCProfile, but unable to create an " |
+ "SkColorSpaceXform from it."; |
+ successfully_parsed_by_sk_icc_ = false; |
} else { |
- DLOG(ERROR) << "Unable parse ICCProfile."; |
+ DLOG(ERROR) << "Unable to parse ICCProfile."; |
successfully_parsed_by_sk_icc_ = false; |
} |