18c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com/*
28c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com * Copyright 2013 Google Inc.
38c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com *
48c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be
58c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com * found in the LICENSE file.
68c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com */
78c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com#include "gm.h"
833d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h"
98c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com#include "SkBitmap.h"
108c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com#include "SkShader.h"
11d47067392848ba132d4e86ffbeebe2dcacda9534Mike Reed#include "SkBlendModePriv.h"
128c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com#include "SkColorPriv.h"
138c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
148c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.comnamespace skiagm {
158c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
168c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.comclass Xfermodes2GM : public GM {
178c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.compublic:
188c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    Xfermodes2GM() {}
198c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
208c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.comprotected:
2136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override {
228c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        return SkString("xfermodes2");
238c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    }
248c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
2536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override {
26f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(455, 475);
278c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    }
288c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
2936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
308c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
318c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
328c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        const SkScalar w = SkIntToScalar(kSize);
338c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        const SkScalar h = SkIntToScalar(kSize);
348c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
358c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        SkPaint labelP;
368c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        labelP.setAntiAlias(true);
371818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark        sk_tool_utils::set_portable_typeface(&labelP);
388c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        labelP.setTextAlign(SkPaint::kCenter_Align);
398c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
408c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        const int W = 6;
418c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
428c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        SkScalar x = 0, y = 0;
43d47067392848ba132d4e86ffbeebe2dcacda9534Mike Reed        for (size_t m = 0; m <= (size_t)SkBlendMode::kLastMode; m++) {
44374772bd61951f01bf84fe17bf53d8867681c9aereed            SkBlendMode mode = static_cast<SkBlendMode>(m);
458c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
468c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->save();
478c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
488c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->translate(x, y);
498c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            SkPaint p;
508c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            p.setAntiAlias(false);
518c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            p.setStyle(SkPaint::kFill_Style);
528c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            p.setShader(fBG);
538c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            SkRect r = SkRect::MakeWH(w, h);
548c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->drawRect(r, p);
558c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
5696fcdcc219d2a0d3579719b84b28bede76efba64halcanary            canvas->saveLayer(&r, nullptr);
578c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
588c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            p.setShader(fDst);
598c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->drawRect(r, p);
608c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            p.setShader(fSrc);
61374772bd61951f01bf84fe17bf53d8867681c9aereed            p.setBlendMode(mode);
628c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->drawRect(r, p);
638c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
648c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->restore();
658c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
668c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            r.inset(-SK_ScalarHalf, -SK_ScalarHalf);
678c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            p.setStyle(SkPaint::kStroke_Style);
6896fcdcc219d2a0d3579719b84b28bede76efba64halcanary            p.setShader(nullptr);
69374772bd61951f01bf84fe17bf53d8867681c9aereed            p.setBlendMode(SkBlendMode::kSrcOver);
708c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->drawRect(r, p);
718c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
728c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->restore();
738c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
748c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com#if 1
752a475eae622adc1e8fa29206be1eaf862c23548eCary Clark            canvas->drawString(SkBlendMode_Name(mode),
762a475eae622adc1e8fa29206be1eaf862c23548eCary Clark                               x + w/2, y - labelP.getTextSize()/2, labelP);
778c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com#endif
788c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            x += w + SkIntToScalar(10);
798c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            if ((m % W) == W - 1) {
808c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com                x = 0;
818c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com                y += h + SkIntToScalar(30);
828c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            }
838c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        }
848c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    }
858c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
868c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.comprivate:
8736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onOnceBeforeDraw() override {
88dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein        const uint32_t kCheckData[] = {
894ec1ac6a2dc7e43c4179638f3dd801be6f3b386ecaryclark            SkPackARGB32(0xFF, 0x42, 0x41, 0x42),
904ec1ac6a2dc7e43c4179638f3dd801be6f3b386ecaryclark            SkPackARGB32(0xFF, 0xD6, 0xD3, 0xD6),
914ec1ac6a2dc7e43c4179638f3dd801be6f3b386ecaryclark            SkPackARGB32(0xFF, 0xD6, 0xD3, 0xD6),
924ec1ac6a2dc7e43c4179638f3dd801be6f3b386ecaryclark            SkPackARGB32(0xFF, 0x42, 0x41, 0x42)
938c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        };
948c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        SkBitmap bg;
95eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com        bg.allocN32Pixels(2, 2, true);
968c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        memcpy(bg.getPixels(), kCheckData, sizeof(kCheckData));
97cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com
988c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        SkMatrix lm;
998c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        lm.setScale(SkIntToScalar(16), SkIntToScalar(16));
1001a9b9640843a64af8d9d90337ec3b3fea663196areed        fBG = SkShader::MakeBitmapShader(bg, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode,
1011a9b9640843a64af8d9d90337ec3b3fea663196areed                                         &lm);
102cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com
103d3e919123d46fc98fbe5f70a23afdfa9f8d92131cdalton        SkBitmap srcBmp;
104d3e919123d46fc98fbe5f70a23afdfa9f8d92131cdalton        srcBmp.allocN32Pixels(kSize, kSize);
105d3e919123d46fc98fbe5f70a23afdfa9f8d92131cdalton        SkPMColor* pixels = reinterpret_cast<SkPMColor*>(srcBmp.getPixels());
106cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com
1078c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        for (int y = 0; y < kSize; ++y) {
1088c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            int c = y * (1 << kShift);
1098c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            SkPMColor rowColor = SkPackARGB32(c, c, 0, c/2);
1108c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            for (int x = 0; x < kSize; ++x) {
1118c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com                pixels[kSize * y + x] = rowColor;
1128c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            }
1138c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        }
1141a9b9640843a64af8d9d90337ec3b3fea663196areed        fSrc = SkShader::MakeBitmapShader(srcBmp, SkShader::kClamp_TileMode,
1151a9b9640843a64af8d9d90337ec3b3fea663196areed                                          SkShader::kClamp_TileMode);
116d3e919123d46fc98fbe5f70a23afdfa9f8d92131cdalton        SkBitmap dstBmp;
117d3e919123d46fc98fbe5f70a23afdfa9f8d92131cdalton        dstBmp.allocN32Pixels(kSize, kSize);
118d3e919123d46fc98fbe5f70a23afdfa9f8d92131cdalton        pixels = reinterpret_cast<SkPMColor*>(dstBmp.getPixels());
119cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com
1208c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        for (int x = 0; x < kSize; ++x) {
1218c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            int c = x * (1 << kShift);
1228c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            SkPMColor colColor = SkPackARGB32(c, 0, c, c/2);
1238c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            for (int y = 0; y < kSize; ++y) {
1248c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com                pixels[kSize * y + x] = colColor;
1258c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            }
1268c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        }
1271a9b9640843a64af8d9d90337ec3b3fea663196areed        fDst = SkShader::MakeBitmapShader(dstBmp, SkShader::kClamp_TileMode,
1281a9b9640843a64af8d9d90337ec3b3fea663196areed                                          SkShader::kClamp_TileMode);
1298c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    }
130cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com
1318c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    enum {
1328c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        kShift = 2,
1338c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        kSize = 256 >> kShift,
1348c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    };
135cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com
1361a9b9640843a64af8d9d90337ec3b3fea663196areed    sk_sp<SkShader> fBG;
1371a9b9640843a64af8d9d90337ec3b3fea663196areed    sk_sp<SkShader> fSrc;
1381a9b9640843a64af8d9d90337ec3b3fea663196areed    sk_sp<SkShader> fDst;
1398c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
1408c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    typedef GM INHERITED;
1418c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com};
1428c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
1438c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com//////////////////////////////////////////////////////////////////////////////
1448c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
1458c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.comstatic GM* MyFactory(void*) { return new Xfermodes2GM; }
1468c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.comstatic GMRegistry reg(MyFactory);
1478c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
1488c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com}
149