| 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
|
|
|