Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(864)

Unified Diff: ui/gfx/color_transform.cc

Issue 2632533003: Use skia for transform ... but it didnt work (Closed)
Patch Set: Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/base/media_switches.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « media/base/media_switches.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698