| Index: ui/gfx/icc_profile.cc
|
| diff --git a/ui/gfx/icc_profile.cc b/ui/gfx/icc_profile.cc
|
| index 9fbbdd0358121f75ef03f43623fa4a218eac51ae..f293cda2162efe0d2fd93009e6de15adacebfca0 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 "ui/gfx/color_transform.h"
|
|
|
| namespace gfx {
|
|
|
| @@ -90,8 +91,9 @@ ICCProfile ICCProfile::FromColorSpace(const gfx::ColorSpace& color_space) {
|
| base::AutoLock lock(cache.lock);
|
|
|
| auto found = cache.id_to_icc_profile_mru.Get(color_space.icc_profile_id_);
|
| - if (found != cache.id_to_icc_profile_mru.end())
|
| + if (found != cache.id_to_icc_profile_mru.end()) {
|
| return found->second;
|
| + }
|
| }
|
| // TODO(ccameron): Support constructing ICC profiles from arbitrary ColorSpace
|
| // objects.
|
| @@ -117,6 +119,50 @@ ColorSpace ICCProfile::GetColorSpace() const {
|
| if (found == cache.id_to_icc_profile_mru.end())
|
| cache.id_to_icc_profile_mru.Put(id_, *this);
|
| }
|
| +
|
| + ColorSpace unity_colorspace(
|
| + ColorSpace::PrimaryID::CUSTOM, ColorSpace::TransferID::LINEAR,
|
| + ColorSpace::MatrixID::RGB, ColorSpace::RangeID::FULL);
|
| + unity_colorspace.custom_primary_matrix_[0] = 1.0f;
|
| + unity_colorspace.custom_primary_matrix_[1] = 0.0f;
|
| + unity_colorspace.custom_primary_matrix_[2] = 0.0f;
|
| + unity_colorspace.custom_primary_matrix_[3] = 0.0f;
|
| +
|
| + unity_colorspace.custom_primary_matrix_[4] = 0.0f;
|
| + unity_colorspace.custom_primary_matrix_[5] = 1.0f;
|
| + unity_colorspace.custom_primary_matrix_[6] = 0.0f;
|
| + unity_colorspace.custom_primary_matrix_[7] = 0.0f;
|
| +
|
| + unity_colorspace.custom_primary_matrix_[8] = 0.0f;
|
| + unity_colorspace.custom_primary_matrix_[9] = 0.0f;
|
| + unity_colorspace.custom_primary_matrix_[10] = 1.0f;
|
| + unity_colorspace.custom_primary_matrix_[11] = 0.0f;
|
| +
|
| + // This will look up and use the ICC profile.
|
| + std::unique_ptr<ColorTransform> transform(ColorTransform::NewColorTransform(
|
| + color_space, unity_colorspace, ColorTransform::Intent::INTENT_ABSOLUTE));
|
| +
|
| + ColorTransform::TriStim tmp[4];
|
| + tmp[0].set_x(1.0f);
|
| + tmp[1].set_y(1.0f);
|
| + tmp[2].set_z(1.0f);
|
| + transform->transform(tmp, arraysize(tmp));
|
| +
|
| + color_space.custom_primary_matrix_[0] = tmp[0].x() - tmp[3].x();
|
| + color_space.custom_primary_matrix_[1] = tmp[1].x() - tmp[3].x();
|
| + color_space.custom_primary_matrix_[2] = tmp[2].x() - tmp[3].x();
|
| + color_space.custom_primary_matrix_[3] = tmp[3].x();
|
| +
|
| + color_space.custom_primary_matrix_[4] = tmp[0].y() - tmp[3].y();
|
| + color_space.custom_primary_matrix_[5] = tmp[1].y() - tmp[3].y();
|
| + color_space.custom_primary_matrix_[6] = tmp[2].y() - tmp[3].y();
|
| + color_space.custom_primary_matrix_[7] = tmp[3].y();
|
| +
|
| + color_space.custom_primary_matrix_[8] = tmp[0].z() - tmp[3].z();
|
| + color_space.custom_primary_matrix_[9] = tmp[1].z() - tmp[3].z();
|
| + color_space.custom_primary_matrix_[10] = tmp[2].z() - tmp[3].z();
|
| + color_space.custom_primary_matrix_[11] = tmp[3].z();
|
| +
|
| return color_space;
|
| }
|
|
|
|
|