aboutsummaryrefslogtreecommitdiffhomepage
path: root/dm
diff options
context:
space:
mode:
authorGravatar Matt Sarett <msarett@google.com>2017-03-15 15:48:19 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-03-15 21:17:18 +0000
commitcb01aec63bcb3dee52afcf3605bcd64166b873c0 (patch)
tree3feb4c702f66bec0245d1b9f960a2ae701b011d3 /dm
parent8336e949b8aecc664a4f2690b56369d3821b2a1b (diff)
Add color spin test for SkColorSpaceXformCanvas
Also changes behavior to treat nullptr srcs as sRGB. Testing locally, it looks like 353 gms have no diffs from 8888. There are 269 diffs - some are fine (gms that do color space stuff) and some are bugs. BUG=skia: Change-Id: I55c2825f4f4b857e0b0a0ec050c6db82ac881492 Reviewed-on: https://skia-review.googlesource.com/9738 Reviewed-by: Brian Osman <brianosman@google.com> Commit-Queue: Matt Sarett <msarett@google.com>
Diffstat (limited to 'dm')
-rw-r--r--dm/DM.cpp20
-rw-r--r--dm/DMSrcSink.cpp32
-rw-r--r--dm/DMSrcSink.h3
3 files changed, 51 insertions, 4 deletions
diff --git a/dm/DM.cpp b/dm/DM.cpp
index 4b51030557..d3d12393a6 100644
--- a/dm/DM.cpp
+++ b/dm/DM.cpp
@@ -14,6 +14,7 @@
#include "SkCodec.h"
#include "SkColorPriv.h"
#include "SkColorSpace.h"
+#include "SkColorSpacePriv.h"
#include "SkCommonFlags.h"
#include "SkCommonFlagsConfig.h"
#include "SkCommonFlagsPathRenderer.h"
@@ -895,9 +896,26 @@ static sk_sp<SkColorSpace> adobe_rgb() {
SkColorSpace::kAdobeRGB_Gamut);
}
+static sk_sp<SkColorSpace> rgb_to_gbr() {
+ float gbr[9];
+ gbr[0] = gSRGB_toXYZD50[1];
+ gbr[1] = gSRGB_toXYZD50[2];
+ gbr[2] = gSRGB_toXYZD50[0];
+ gbr[3] = gSRGB_toXYZD50[4];
+ gbr[4] = gSRGB_toXYZD50[5];
+ gbr[5] = gSRGB_toXYZD50[3];
+ gbr[6] = gSRGB_toXYZD50[7];
+ gbr[7] = gSRGB_toXYZD50[8];
+ gbr[8] = gSRGB_toXYZD50[6];
+ SkMatrix44 toXYZD50(SkMatrix44::kUninitialized_Constructor);
+ toXYZD50.set3x3RowMajorf(gbr);
+ return SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma, toXYZD50);
+}
+
static Sink* create_via(const SkString& tag, Sink* wrapped) {
#define VIA(t, via, ...) if (tag.equals(t)) { return new via(__VA_ARGS__); }
- VIA("adobe", ViaCSXform, wrapped, adobe_rgb());
+ VIA("adobe", ViaCSXform, wrapped, adobe_rgb(), false);
+ VIA("gbr", ViaCSXform, wrapped, rgb_to_gbr(), true);
VIA("lite", ViaLite, wrapped);
VIA("pipe", ViaPipe, wrapped);
VIA("twice", ViaTwice, wrapped);
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
index 4f5cd43af8..14d5552789 100644
--- a/dm/DMSrcSink.cpp
+++ b/dm/DMSrcSink.cpp
@@ -1842,13 +1842,41 @@ Error ViaLite::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStrin
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
-ViaCSXform::ViaCSXform(Sink* sink, sk_sp<SkColorSpace> cs) : Via(sink), fCS(std::move(cs)) {}
+ViaCSXform::ViaCSXform(Sink* sink, sk_sp<SkColorSpace> cs, bool colorSpin)
+ : Via(sink)
+ , fCS(std::move(cs))
+ , fColorSpin(colorSpin) {}
Error ViaCSXform::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) const {
return draw_to_canvas(fSink.get(), bitmap, stream, log, src.size(),
[&](SkCanvas* canvas) -> Error {
auto proxy = SkCreateColorSpaceXformCanvas(canvas, fCS);
- return src.draw(proxy.get());
+ Error err = src.draw(proxy.get());
+ if (!err.isEmpty()) {
+ return err;
+ }
+
+ // Undo the color spin, so we can look at the pixels in Gold.
+ if (fColorSpin) {
+ SkBitmap pixels;
+ pixels.allocPixels(canvas->imageInfo());
+ canvas->readPixels(&pixels, 0, 0);
+ for (int y = 0; y < pixels.height(); y++) {
+ for (int x = 0; x < pixels.width(); x++) {
+ uint32_t pixel = *pixels.getAddr32(x, y);
+ uint8_t r = SkGetPackedR32(pixel);
+ uint8_t g = SkGetPackedG32(pixel);
+ uint8_t b = SkGetPackedB32(pixel);
+ uint8_t a = SkGetPackedA32(pixel);
+ *pixels.getAddr32(x, y) =
+ SkSwizzle_RGBA_to_PMColor(b << 0 | r << 8 | g << 16 | a << 24);
+ }
+ }
+
+ canvas->writePixels(pixels, 0, 0);
+ }
+
+ return "";
});
}
diff --git a/dm/DMSrcSink.h b/dm/DMSrcSink.h
index c973e3b393..b6e1b5955c 100644
--- a/dm/DMSrcSink.h
+++ b/dm/DMSrcSink.h
@@ -496,10 +496,11 @@ public:
class ViaCSXform : public Via {
public:
- explicit ViaCSXform(Sink*, sk_sp<SkColorSpace>);
+ explicit ViaCSXform(Sink*, sk_sp<SkColorSpace>, bool colorSpin);
Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
private:
sk_sp<SkColorSpace> fCS;
+ bool fColorSpin;
};
} // namespace DM