From 37771c349ef3d3b1b524e420d8d1bd634cfe60c1 Mon Sep 17 00:00:00 2001 From: robertphillips Date: Mon, 25 Jan 2016 08:39:08 -0800 Subject: Add GM for SkPixelXorXfermode This is in preparation for adding a gpu implementation GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1601743009 Review URL: https://codereview.chromium.org/1601743009 --- gm/pixelxorxfermode.cpp | 93 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 gm/pixelxorxfermode.cpp diff --git a/gm/pixelxorxfermode.cpp b/gm/pixelxorxfermode.cpp new file mode 100644 index 0000000000..8066959cea --- /dev/null +++ b/gm/pixelxorxfermode.cpp @@ -0,0 +1,93 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "gm.h" +#include "Resources.h" + +#include "SkImageDecoder.h" +#include "SkPixelXorXfermode.h" +#include "SkStream.h" + +class PixelXorXfermodeGM : public skiagm::GM { +public: + PixelXorXfermodeGM() { } + +protected: + SkString onShortName() override { + return SkString("pixelxorxfermode"); + } + + SkISize onISize() override { return SkISize::Make(512, 512); } + + void onOnceBeforeDraw() override { + SkImageDecoder* codec = nullptr; + SkString resourcePath = GetResourcePath("mandrill_512.png"); + SkFILEStream stream(resourcePath.c_str()); + if (stream.isValid()) { + codec = SkImageDecoder::Factory(&stream); + } + if (codec) { + stream.rewind(); + codec->decode(&stream, &fBM, kN32_SkColorType, SkImageDecoder::kDecodePixels_Mode); + delete codec; + } else { + fBM.allocN32Pixels(1, 1); + fBM.eraseARGB(255, 255, 0 , 0); // red == bad + } + } + + void onDraw(SkCanvas* canvas) override { + canvas->drawBitmap(fBM, 0, 0); + + SkRect r = SkRect::MakeIWH(256, 256); + + // Negate the red channel of the dst (via the ancillary color) but leave + // the green & blue channels alone + SkPaint p1; + p1.setColor(SK_ColorBLACK); // noop + p1.setXfermode(SkPixelXorXfermode::Create(SK_ColorRED)); + + canvas->drawRect(r, p1); + + r.offsetTo(256.0f, 0.0f); + + // Negate the dst color via the src color + SkPaint p2; + p2.setColor(SK_ColorWHITE); + p2.setXfermode(SkPixelXorXfermode::Create(SK_ColorBLACK)); // noop + + canvas->drawRect(r, p2); + + r.offsetTo(0.0f, 256.0f); + + // Just return the original color + SkPaint p3; + p3.setColor(SK_ColorBLACK); // noop + p3.setXfermode(SkPixelXorXfermode::Create(SK_ColorBLACK)); // noop + + canvas->drawRect(r, p3); + + r.offsetTo(256.0f, 256.0f); + + // Negate the red & green channels (via the ancillary color) but leave + // the blue channel alone + SkPaint p4; + p4.setColor(SK_ColorBLACK); // noop + p4.setXfermode(SkPixelXorXfermode::Create(SK_ColorYELLOW)); + + canvas->drawRect(r, p4); + } + +private: + SkBitmap fBM; + + typedef GM INHERITED; +}; + +////////////////////////////////////////////////////////////////////////////// + +DEF_GM(return new PixelXorXfermodeGM;) -- cgit v1.2.3