| Index: ui/gfx/icc_profile.cc
|
| diff --git a/ui/gfx/icc_profile.cc b/ui/gfx/icc_profile.cc
|
| index e24410b854b26a3a960deb233744130debb7e180..6a1bead8c4f5a8dc921055d4808ab9e65d075b89 100644
|
| --- a/ui/gfx/icc_profile.cc
|
| +++ b/ui/gfx/icc_profile.cc
|
| @@ -74,7 +74,7 @@ ICCProfile ICCProfile::FromData(const char* data, size_t size) {
|
| for (auto iter = cache.id_to_icc_profile_mru.begin();
|
| iter != cache.id_to_icc_profile_mru.end(); ++iter) {
|
| if (icc_profile.data_ == iter->second.data_) {
|
| - icc_profile.id_ = iter->second.id_;
|
| + icc_profile = iter->second;
|
| cache.id_to_icc_profile_mru.Get(icc_profile.id_);
|
| return icc_profile;
|
| }
|
| @@ -82,6 +82,11 @@ ICCProfile ICCProfile::FromData(const char* data, size_t size) {
|
|
|
| // Create a new cached id and add it to the cache.
|
| icc_profile.id_ = cache.next_unused_id++;
|
| + icc_profile.color_space_ =
|
| + ColorSpace(ColorSpace::PrimaryID::CUSTOM, ColorSpace::TransferID::CUSTOM,
|
| + ColorSpace::MatrixID::RGB, ColorSpace::RangeID::FULL);
|
| + icc_profile.color_space_.icc_profile_id_ = icc_profile.id_;
|
| + icc_profile.color_space_.sk_color_space_ = SkColorSpace::MakeICC(data, size);
|
| cache.id_to_icc_profile_mru.Put(icc_profile.id_, icc_profile);
|
| return icc_profile;
|
| }
|
| @@ -118,6 +123,30 @@ ICCProfile ICCProfile::FromColorSpace(const gfx::ColorSpace& color_space) {
|
| return icc_profile;
|
| }
|
|
|
| +ICCProfile ICCProfile::FromSkColorSpace(sk_sp<SkColorSpace> color_space) {
|
| + ICCProfile icc_profile;
|
| +
|
| + Cache& cache = g_cache.Get();
|
| + base::AutoLock lock(cache.lock);
|
| +
|
| + // Linearly search the cached ICC profiles to find one with the same data.
|
| + // If it exists, re-use its id and touch it in the cache.
|
| + for (auto iter = cache.id_to_icc_profile_mru.begin();
|
| + iter != cache.id_to_icc_profile_mru.end(); ++iter) {
|
| + sk_sp<SkColorSpace> iter_color_space =
|
| + iter->second.color_space_.ToSkColorSpace();
|
| + if (SkColorSpace::Equals(color_space.get(), iter_color_space.get())) {
|
| + icc_profile = iter->second;
|
| + cache.id_to_icc_profile_mru.Get(icc_profile.id_);
|
| + return icc_profile;
|
| + }
|
| + }
|
| +
|
| + // TODO(ccameron): Support constructing ICC profiles from arbitrary
|
| + // SkColorSpace objects.
|
| + return icc_profile;
|
| +}
|
| +
|
| const std::vector<char>& ICCProfile::GetData() const {
|
| return data_;
|
| }
|
| @@ -128,10 +157,7 @@ ColorSpace ICCProfile::GetColorSpace() const {
|
| if (type_ == Type::FROM_COLOR_SPACE)
|
| return color_space_;
|
|
|
| - ColorSpace color_space(ColorSpace::PrimaryID::CUSTOM,
|
| - ColorSpace::TransferID::CUSTOM,
|
| - ColorSpace::MatrixID::RGB, ColorSpace::RangeID::FULL);
|
| - color_space.icc_profile_id_ = id_;
|
| + ColorSpace color_space = color_space_;
|
|
|
| // Move this ICC profile to the most recently used end of the cache.
|
| {
|
|
|