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:
218c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    virtual SkString onShortName() SK_OVERRIDE {
228c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        return SkString("xfermodes2");
238c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    }
248c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
258c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    virtual SkISize onISize() SK_OVERRIDE {
26f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(455, 475);
278c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    }
288c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
298c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    virtual void onDraw(SkCanvas* canvas) SK_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);
378c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        labelP.setTextAlign(SkPaint::kCenter_Align);
388c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
398c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        const int W = 6;
408c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
418c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        SkScalar x = 0, y = 0;
428c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        for (size_t m = 0; m <= SkXfermode::kLastMode; m++) {
438c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            SkXfermode::Mode mode = static_cast<SkXfermode::Mode>(m);
448c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            SkXfermode* xm = SkXfermode::Create(mode);
458c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            SkAutoUnref aur(xm);
468c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
478c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->save();
488c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
498c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->translate(x, y);
508c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            SkPaint p;
518c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            p.setAntiAlias(false);
528c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            p.setStyle(SkPaint::kFill_Style);
538c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            p.setShader(fBG);
548c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            SkRect r = SkRect::MakeWH(w, h);
558c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->drawRect(r, p);
568c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
57091a594dbc4116ec2e54724432472bf37dae794acommit-bot@chromium.org            canvas->saveLayer(&r, NULL);
588c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
598c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            p.setShader(fDst);
608c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->drawRect(r, p);
618c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            p.setShader(fSrc);
628c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            p.setXfermode(xm);
638c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->drawRect(r, p);
648c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
658c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->restore();
668c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
678c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            r.inset(-SK_ScalarHalf, -SK_ScalarHalf);
688c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            p.setStyle(SkPaint::kStroke_Style);
698c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            p.setShader(NULL);
708c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            p.setXfermode(NULL);
718c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->drawRect(r, p);
728c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
738c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->restore();
748c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
758c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com#if 1
768c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            canvas->drawText(SkXfermode::ModeName(mode), strlen(SkXfermode::ModeName(mode)),
778c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com                             x + w/2, y - labelP.getTextSize()/2, labelP);
788c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com#endif
798c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            x += w + SkIntToScalar(10);
808c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            if ((m % W) == W - 1) {
818c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com                x = 0;
828c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com                y += h + SkIntToScalar(30);
838c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            }
848c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        }
858c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    }
868c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
878c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.comprivate:
888c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    virtual void onOnceBeforeDraw() SK_OVERRIDE {
89051be8e062c0b7e9a2e7a07f477d6baaf75d1a08jvanverth@google.com        static const uint32_t kCheckData[] = {
908c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            SkPackARGB32(0xFF, 0x40, 0x40, 0x40),
918c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            SkPackARGB32(0xFF, 0xD0, 0xD0, 0xD0),
928c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            SkPackARGB32(0xFF, 0xD0, 0xD0, 0xD0),
938c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            SkPackARGB32(0xFF, 0x40, 0x40, 0x40)
948c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        };
958c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        SkBitmap bg;
96eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com        bg.allocN32Pixels(2, 2, true);
978c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        memcpy(bg.getPixels(), kCheckData, sizeof(kCheckData));
98cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com
998c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        SkMatrix lm;
1008c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        lm.setScale(SkIntToScalar(16), SkIntToScalar(16));
1019c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org        fBG.reset(SkShader::CreateBitmapShader(bg,
1029c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                                               SkShader::kRepeat_TileMode,
1039c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                                               SkShader::kRepeat_TileMode,
1049c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                                               &lm));
105cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com
1068c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        SkBitmap dstBmp;
107eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com        dstBmp.allocN32Pixels(kSize, kSize);
1088c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        SkPMColor* pixels = reinterpret_cast<SkPMColor*>(dstBmp.getPixels());
109cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com
1108c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        for (int y = 0; y < kSize; ++y) {
1118c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            int c = y * (1 << kShift);
1128c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            SkPMColor rowColor = SkPackARGB32(c, c, 0, c/2);
1138c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            for (int x = 0; x < kSize; ++x) {
1148c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com                pixels[kSize * y + x] = rowColor;
1158c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            }
1168c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        }
1178c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        fSrc.reset(SkShader::CreateBitmapShader(dstBmp,
1188c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com                                                SkShader::kClamp_TileMode,
1198c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com                                                SkShader::kClamp_TileMode));
1208c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        SkBitmap srcBmp;
121eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com        srcBmp.allocN32Pixels(kSize, kSize);
1228c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        pixels = reinterpret_cast<SkPMColor*>(srcBmp.getPixels());
123cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com
1248c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        for (int x = 0; x < kSize; ++x) {
1258c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            int c = x * (1 << kShift);
1268c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            SkPMColor colColor = SkPackARGB32(c, 0, c, c/2);
1278c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            for (int y = 0; y < kSize; ++y) {
1288c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com                pixels[kSize * y + x] = colColor;
1298c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com            }
1308c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        }
1318c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        fDst.reset(SkShader::CreateBitmapShader(srcBmp,
1328c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com                                                SkShader::kClamp_TileMode,
1338c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com                                                SkShader::kClamp_TileMode));
1348c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    }
135cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com
1368c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    enum {
1378c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        kShift = 2,
1388c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com        kSize = 256 >> kShift,
1398c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    };
140cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com
1418c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    SkAutoTUnref<SkShader> fBG;
1428c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    SkAutoTUnref<SkShader> fSrc;
1438c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    SkAutoTUnref<SkShader> fDst;
1448c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
1458c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com    typedef GM INHERITED;
1468c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com};
1478c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
1488c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com//////////////////////////////////////////////////////////////////////////////
1498c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
1508c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.comstatic GM* MyFactory(void*) { return new Xfermodes2GM; }
1518c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.comstatic GMRegistry reg(MyFactory);
1528c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com
1538c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com}
154