xfermodes2.cpp revision 1a9b9640843a64af8d9d90337ec3b3fea663196a
18c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
28c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com/*
38c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com * Copyright 2013 Google Inc.
48c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com *
58c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be
68c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com * found in the LICENSE file.
78c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com */
88c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com#include "gm.h"
98c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com#include "SkBitmap.h"
108c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com#include "SkShader.h"
118c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com#include "SkXfermode.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;
438c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        for (size_t m = 0; m <= SkXfermode::kLastMode; m++) {
448c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            SkXfermode::Mode mode = static_cast<SkXfermode::Mode>(m);
458c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            SkXfermode* xm = SkXfermode::Create(mode);
468c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            SkAutoUnref aur(xm);
478c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
488c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->save();
498c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
508c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->translate(x, y);
518c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            SkPaint p;
528c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            p.setAntiAlias(false);
538c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            p.setStyle(SkPaint::kFill_Style);
548c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            p.setShader(fBG);
558c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            SkRect r = SkRect::MakeWH(w, h);
568c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->drawRect(r, p);
578c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
5896fcdcc219d2a0d3579719b84b28bede76efba64halcanary            canvas->saveLayer(&r, nullptr);
598c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
608c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            p.setShader(fDst);
618c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->drawRect(r, p);
628c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            p.setShader(fSrc);
638c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            p.setXfermode(xm);
648c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->drawRect(r, p);
658c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
668c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->restore();
678c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
688c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            r.inset(-SK_ScalarHalf, -SK_ScalarHalf);
698c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            p.setStyle(SkPaint::kStroke_Style);
7096fcdcc219d2a0d3579719b84b28bede76efba64halcanary            p.setShader(nullptr);
7196fcdcc219d2a0d3579719b84b28bede76efba64halcanary            p.setXfermode(nullptr);
728c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->drawRect(r, p);
738c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
748c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->restore();
758c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
768c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com#if 1
778c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->drawText(SkXfermode::ModeName(mode), strlen(SkXfermode::ModeName(mode)),
788c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com                             x + w/2, y - labelP.getTextSize()/2, labelP);
798c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com#endif
808c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            x += w + SkIntToScalar(10);
818c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            if ((m % W) == W - 1) {
828c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com                x = 0;
838c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com                y += h + SkIntToScalar(30);
848c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            }
858c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        }
868c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    }
878c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
888c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.comprivate:
8936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onOnceBeforeDraw() override {
90051be8e062c0b7e9a2e7a07f477d6baaf75d1a08jvanverth@google.com        static const uint32_t kCheckData[] = {
914ec1ac6a2dc7e43c4179638f3dd801be6f3b386ecaryclark            SkPackARGB32(0xFF, 0x42, 0x41, 0x42),
924ec1ac6a2dc7e43c4179638f3dd801be6f3b386ecaryclark            SkPackARGB32(0xFF, 0xD6, 0xD3, 0xD6),
934ec1ac6a2dc7e43c4179638f3dd801be6f3b386ecaryclark            SkPackARGB32(0xFF, 0xD6, 0xD3, 0xD6),
944ec1ac6a2dc7e43c4179638f3dd801be6f3b386ecaryclark            SkPackARGB32(0xFF, 0x42, 0x41, 0x42)
958c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        };
968c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        SkBitmap bg;
97eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com        bg.allocN32Pixels(2, 2, true);
988c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        memcpy(bg.getPixels(), kCheckData, sizeof(kCheckData));
99cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com
1008c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        SkMatrix lm;
1018c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        lm.setScale(SkIntToScalar(16), SkIntToScalar(16));
1021a9b9640843a64af8d9d90337ec3b3fea663196areed        fBG = SkShader::MakeBitmapShader(bg, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode,
1031a9b9640843a64af8d9d90337ec3b3fea663196areed                                         &lm);
104cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com
105d3e919123d46fc98fbe5f70a23afdfa9f8d92131cdalton        SkBitmap srcBmp;
106d3e919123d46fc98fbe5f70a23afdfa9f8d92131cdalton        srcBmp.allocN32Pixels(kSize, kSize);
107d3e919123d46fc98fbe5f70a23afdfa9f8d92131cdalton        SkPMColor* pixels = reinterpret_cast<SkPMColor*>(srcBmp.getPixels());
108cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com
1098c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        for (int y = 0; y < kSize; ++y) {
1108c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            int c = y * (1 << kShift);
1118c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            SkPMColor rowColor = SkPackARGB32(c, c, 0, c/2);
1128c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            for (int x = 0; x < kSize; ++x) {
1138c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com                pixels[kSize * y + x] = rowColor;
1148c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            }
1158c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        }
1161a9b9640843a64af8d9d90337ec3b3fea663196areed        fSrc = SkShader::MakeBitmapShader(srcBmp, SkShader::kClamp_TileMode,
1171a9b9640843a64af8d9d90337ec3b3fea663196areed                                          SkShader::kClamp_TileMode);
118d3e919123d46fc98fbe5f70a23afdfa9f8d92131cdalton        SkBitmap dstBmp;
119d3e919123d46fc98fbe5f70a23afdfa9f8d92131cdalton        dstBmp.allocN32Pixels(kSize, kSize);
120d3e919123d46fc98fbe5f70a23afdfa9f8d92131cdalton        pixels = reinterpret_cast<SkPMColor*>(dstBmp.getPixels());
121cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com
1228c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        for (int x = 0; x < kSize; ++x) {
1238c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            int c = x * (1 << kShift);
1248c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            SkPMColor colColor = SkPackARGB32(c, 0, c, c/2);
1258c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            for (int y = 0; y < kSize; ++y) {
1268c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com                pixels[kSize * y + x] = colColor;
1278c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            }
1288c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        }
1291a9b9640843a64af8d9d90337ec3b3fea663196areed        fDst = SkShader::MakeBitmapShader(dstBmp, SkShader::kClamp_TileMode,
1301a9b9640843a64af8d9d90337ec3b3fea663196areed                                          SkShader::kClamp_TileMode);
1318c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    }
132cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com
1338c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    enum {
1348c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        kShift = 2,
1358c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        kSize = 256 >> kShift,
1368c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    };
137cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com
1381a9b9640843a64af8d9d90337ec3b3fea663196areed    sk_sp<SkShader> fBG;
1391a9b9640843a64af8d9d90337ec3b3fea663196areed    sk_sp<SkShader> fSrc;
1401a9b9640843a64af8d9d90337ec3b3fea663196areed    sk_sp<SkShader> fDst;
1418c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
1428c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    typedef GM INHERITED;
1438c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com};
1448c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
1458c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com//////////////////////////////////////////////////////////////////////////////
1468c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
1478c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.comstatic GM* MyFactory(void*) { return new Xfermodes2GM; }
1488c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.comstatic GMRegistry reg(MyFactory);
1498c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
1508c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com}
151