Index: ui/gfx/color_transform.cc |
diff --git a/ui/gfx/color_transform.cc b/ui/gfx/color_transform.cc |
index a594e57e34e58881dc5d24f4ecb9bdf709092d14..0cb1fc4fe7d316b3ad542f776bb7fc7fafa5260b 100644 |
--- a/ui/gfx/color_transform.cc |
+++ b/ui/gfx/color_transform.cc |
@@ -7,16 +7,11 @@ |
#include <vector> |
#include "base/logging.h" |
+#include "third_party/skia/include/core/SkColorSpaceXform.h" |
+#include "third_party/skia/include/core/SkImageInfo.h" |
#include "ui/gfx/color_space.h" |
#include "ui/gfx/icc_profile.h" |
#include "ui/gfx/transform.h" |
-#include "third_party/qcms/src/qcms.h" |
- |
-#ifndef THIS_MUST_BE_INCLUDED_AFTER_QCMS_H |
-extern "C" { |
-#include "third_party/qcms/src/chain.h" |
-}; |
-#endif |
namespace gfx { |
@@ -565,6 +560,7 @@ Transform GetRangeAdjustMatrix(ColorSpace::RangeID range, |
switch (matrix) { |
case ColorSpace::MatrixID::RGB: |
case ColorSpace::MatrixID::YCOCG: |
+ DCHECK(0); |
return Transform(255.0f / 219.0f, 0.0f, 0.0f, -16.0f / 219.0f, // 1 |
0.0f, 255.0f / 219.0f, 0.0f, -16.0f / 219.0f, // 2 |
0.0f, 0.0f, 255.0f / 219.0f, -16.0f / 219.0f, // 3 |
@@ -680,29 +676,24 @@ class ColorSpaceToColorSpaceTransform : public ColorTransform { |
Transform c_; |
}; |
-class QCMSColorTransform : public ColorTransform { |
+class SkColorTransform : public ColorTransform { |
public: |
- // Takes ownership of the profiles |
- QCMSColorTransform(qcms_profile* from, qcms_profile* to) |
- : from_(from), to_(to) {} |
- ~QCMSColorTransform() override { |
- qcms_profile_release(from_); |
- qcms_profile_release(to_); |
+ SkColorTransform(SkColorSpace* src, SkColorSpace* dst) { |
+ DCHECK(src && dst); |
+ sk_xform_ = SkColorSpaceXform::New(src, dst); |
+ DCHECK(sk_xform_); |
} |
+ private: |
void transform(TriStim* colors, size_t num) override { |
- CHECK(sizeof(TriStim) == sizeof(float[3])); |
- // QCMS doesn't like numbers outside 0..1 |
- for (size_t i = 0; i < num; i++) { |
- colors[i].set_x(fmin(1.0f, fmax(0.0f, colors[i].x()))); |
- colors[i].set_y(fmin(1.0f, fmax(0.0f, colors[i].y()))); |
- colors[i].set_z(fmin(1.0f, fmax(0.0f, colors[i].z()))); |
+ for (size_t i = 0; i < num; ++i) { |
+ float in[4] = {colors[i].x(), colors[i].y(), colors[i].z(), 1.f}; |
+ float out[4] = {0, 0, 0, 1}; |
+ sk_xform_->apply(SkColorSpaceXform::kRGBA_F32_ColorFormat, out, |
+ SkColorSpaceXform::kRGBA_F32_ColorFormat, in, 1, |
+ kOpaque_SkAlphaType); |
} |
- qcms_chain_transform(from_, to_, reinterpret_cast<float*>(colors), |
- reinterpret_cast<float*>(colors), num * 3); |
} |
- |
- private: |
- qcms_profile *from_, *to_; |
+ std::unique_ptr<SkColorSpaceXform> sk_xform_; |
}; |
class ChainColorTransform : public ColorTransform { |
@@ -720,64 +711,68 @@ class ChainColorTransform : public ColorTransform { |
std::unique_ptr<ColorTransform> b_; |
}; |
-qcms_profile* GetQCMSProfileIfAvailable(const ColorSpace& color_space) { |
- ICCProfile icc_profile = ICCProfile::FromColorSpace(color_space); |
- if (icc_profile.GetData().empty()) |
- return nullptr; |
- return qcms_profile_from_memory(icc_profile.GetData().data(), |
- icc_profile.GetData().size()); |
-} |
- |
-qcms_profile* GetXYZD50Profile() { |
- // QCMS is trixy, it has a datatype called qcms_CIE_xyY, but what it expects |
- // is in fact not xyY color coordinates, it just wants the x/y values of the |
- // primaries with Y equal to 1.0. |
- qcms_CIE_xyYTRIPLE xyz; |
- qcms_CIE_xyY w; |
- xyz.red.x = 1.0f; |
- xyz.red.y = 0.0f; |
- xyz.red.Y = 1.0f; |
- xyz.green.x = 0.0f; |
- xyz.green.y = 1.0f; |
- xyz.green.Y = 1.0f; |
- xyz.blue.x = 0.0f; |
- xyz.blue.y = 0.0f; |
- xyz.blue.Y = 1.0f; |
- w.x = 0.34567f; |
- w.y = 0.35850f; |
- w.Y = 1.0f; |
- return qcms_profile_create_rgb_with_gamma(w, xyz, 1.0f); |
+sk_sp<SkColorSpace> GetXYZD50ColorSpace() { |
+ printf("GetXYZD50ColorSpace\n"); |
+ SkMatrix44 should_be_eye; |
+ SkColorSpacePrimaries primaries; |
+ primaries.fRX = 1.0f; |
+ primaries.fRY = 0.0f; |
+ primaries.fGX = 0.0f; |
+ primaries.fGY = 1.0f; |
+ primaries.fBX = 0.0f; |
+ primaries.fBY = 0.0f; |
+ primaries.fWX = 0.34567f; |
+ primaries.fWY = 0.35850f; |
+ primaries.toXYZD50(&should_be_eye); |
+ should_be_eye.dump(); |
+ |
+ SkMatrix44 to_xyzd50_matrix; |
+ to_xyzd50_matrix.dump(); |
+ return SkColorSpace::MakeRGB(SkColorSpace::kLinear_RenderTargetGamma, to_xyzd50_matrix); |
} |
std::unique_ptr<ColorTransform> ColorTransform::NewColorTransform( |
- const ColorSpace& from, |
- const ColorSpace& to, |
+ const ColorSpace& src, |
+ const ColorSpace& dst, |
Intent intent) { |
- qcms_profile* from_profile = GetQCMSProfileIfAvailable(from); |
- qcms_profile* to_profile = GetQCMSProfileIfAvailable(to); |
- if (from_profile) { |
- if (to_profile) { |
- return std::unique_ptr<ColorTransform>( |
- new QCMSColorTransform(from_profile, to_profile)); |
- } else { |
- return std::unique_ptr<ColorTransform>(new ChainColorTransform( |
- std::unique_ptr<ColorTransform>( |
- new QCMSColorTransform(from_profile, GetXYZD50Profile())), |
- std::unique_ptr<ColorTransform>(new ColorSpaceToColorSpaceTransform( |
- ColorSpace::CreateXYZD50(), to, intent)))); |
- } |
+ sk_sp<SkColorSpace> src_sk_color_space = src.ToSkColorSpace(); |
+ sk_sp<SkColorSpace> dst_sk_color_space = dst.ToSkColorSpace(); |
+ |
+ printf("XFORM: %p %p\n", src_sk_color_space.get(), dst_sk_color_space.get()); |
+ |
+ // Single SkColorSpaceXForm object. |
+ if (src_sk_color_space && dst_sk_color_space) { |
+ return std::unique_ptr<ColorTransform>(new SkColorTransform( |
+ src_sk_color_space.get(), dst_sk_color_space.get())); |
+ } |
+ |
+ // Single ColorSpaceToColorSpaceTransform object. |
+ if (!src_sk_color_space && !dst_sk_color_space) { |
+ return std::unique_ptr<ColorTransform>( |
+ new ColorSpaceToColorSpaceTransform(src, dst, intent)); |
+ } |
+ |
+ // Chained SkColorSpaceXForm then ColorSpaceToColorSpaceTransform or |
+ // ColorSpaceToColorSpaceTransform then SkColorSpaceXForm. |
+ std::unique_ptr<ColorTransform> src_to_xyzD50; |
+ std::unique_ptr<ColorTransform> xyzD50_to_dst; |
+ |
+ if (src_sk_color_space) { |
+ src_to_xyzD50.reset(new SkColorTransform( |
+ src_sk_color_space.get(), GetXYZD50ColorSpace().get())); |
} else { |
- if (to_profile) { |
- return std::unique_ptr<ColorTransform>(new ChainColorTransform( |
- std::unique_ptr<ColorTransform>(new ColorSpaceToColorSpaceTransform( |
- from, ColorSpace::CreateXYZD50(), intent)), |
- std::unique_ptr<ColorTransform>( |
- new QCMSColorTransform(GetXYZD50Profile(), to_profile)))); |
- } else { |
- return std::unique_ptr<ColorTransform>( |
- new ColorSpaceToColorSpaceTransform(from, to, intent)); |
- } |
+ src_to_xyzD50.reset(new ColorSpaceToColorSpaceTransform( |
+ src, ColorSpace::CreateXYZD50(), intent)); |
+ } |
+ if (dst_sk_color_space) { |
+ src_to_xyzD50.reset(new SkColorTransform( |
+ GetXYZD50ColorSpace().get(), dst_sk_color_space.get())); |
+ } else { |
+ xyzD50_to_dst.reset(new ColorSpaceToColorSpaceTransform( |
+ ColorSpace::CreateXYZD50(), dst, intent)); |
} |
+ return std::unique_ptr<ColorTransform>(new ChainColorTransform( |
+ std::move(src_to_xyzD50), std::move(xyzD50_to_dst))); |
} |
} // namespace gfx |