1103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
2103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org/*
3103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org * Copyright 2013 Google Inc.
4103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org *
5103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
6103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org * found in the LICENSE file.
7103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org */
8103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org#include "gm.h"
9103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org#include "SkBitmap.h"
10103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org#include "SkGradientShader.h"
11103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org#include "SkXfermode.h"
12103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org#include "SkColorPriv.h"
13103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
14103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org#if SK_SUPPORT_GPU
15103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org#include "GrContext.h"
16103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org#include "SkGpuDevice.h"
17103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org#endif
18103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
19103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.orgnamespace skiagm {
20103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
21103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org/**
22103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org * This tests drawing device-covering rects with solid colors and bitmap shaders over a
23103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org * checkerboard background using different xfermodes.
24103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org */
25103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.orgclass Xfermodes3GM : public GM {
26103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.orgpublic:
27103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org    Xfermodes3GM() {}
28103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
29103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.orgprotected:
30103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org    virtual SkString onShortName() SK_OVERRIDE {
31103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        return SkString("xfermodes3");
32103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org    }
33103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
34103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org    virtual SkISize onISize() SK_OVERRIDE {
35f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(630, 1215);
36103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org    }
37103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
38103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org    virtual void onDrawBackground(SkCanvas* canvas) SK_OVERRIDE {
39103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        SkPaint bgPaint;
40103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        bgPaint.setColor(0xFF70D0E0);
41103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        canvas->drawPaint(bgPaint);
42103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org    }
43103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
44103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
45103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
46103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
47103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        SkPaint labelP;
48103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        labelP.setAntiAlias(true);
49103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
50103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        static const SkColor kSolidColors[] = {
51103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org            SK_ColorTRANSPARENT,
52103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org            SK_ColorBLUE,
53103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org            0x80808000
54103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        };
55103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
56103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        static const SkColor kBmpAlphas[] = {
57103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org            0xff,
58103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org            0x80,
59103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        };
60103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
61103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        SkAutoTUnref<SkCanvas> tempCanvas(this->possiblyCreateTempCanvas(canvas, kSize, kSize));
62103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
63103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        int test = 0;
64103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        int x = 0, y = 0;
65de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org        static const struct { SkPaint::Style fStyle; SkScalar fWidth; } kStrokes[] = {
66de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org            {SkPaint::kFill_Style, 0},
67de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org            {SkPaint::kStroke_Style, SkIntToScalar(kSize) / 2},
68de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org        };
69de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org        for (size_t s = 0; s < SK_ARRAY_COUNT(kStrokes); ++s) {
70de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org            for (size_t m = 0; m <= SkXfermode::kLastMode; ++m) {
71de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                SkXfermode::Mode mode = static_cast<SkXfermode::Mode>(m);
72de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                canvas->drawText(SkXfermode::ModeName(mode),
73de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                                 strlen(SkXfermode::ModeName(mode)),
74de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                                 SkIntToScalar(x),
75de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                                 SkIntToScalar(y + kSize + 3) + labelP.getTextSize(),
76de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                                 labelP);
77de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                for (size_t c = 0; c < SK_ARRAY_COUNT(kSolidColors); ++c) {
78de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                    SkPaint modePaint;
79de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                    modePaint.setXfermodeMode(mode);
80de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                    modePaint.setColor(kSolidColors[c]);
81de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                    modePaint.setStyle(kStrokes[s].fStyle);
82de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                    modePaint.setStrokeWidth(kStrokes[s].fWidth);
83de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org
84de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                    this->drawMode(canvas, x, y, kSize, kSize, modePaint, tempCanvas.get());
85de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org
86de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                    ++test;
87de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                    x += kSize + 10;
88de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                    if (!(test % kTestsPerRow)) {
89de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                        x = 0;
90de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                        y += kSize + 30;
91de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                    }
92103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org                }
93de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                for (size_t a = 0; a < SK_ARRAY_COUNT(kBmpAlphas); ++a) {
94de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                    SkPaint modePaint;
95de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                    modePaint.setXfermodeMode(mode);
96de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                    modePaint.setAlpha(kBmpAlphas[a]);
97de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                    modePaint.setShader(fBmpShader);
98de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                    modePaint.setStyle(kStrokes[s].fStyle);
99de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                    modePaint.setStrokeWidth(kStrokes[s].fWidth);
100de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org
101de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                    this->drawMode(canvas, x, y, kSize, kSize, modePaint, tempCanvas.get());
102de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org
103de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                    ++test;
104de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                    x += kSize + 10;
105de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                    if (!(test % kTestsPerRow)) {
106de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                        x = 0;
107de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                        y += kSize + 30;
108de1559c5a7f1d2affa493e542776c6b71751d948commit-bot@chromium.org                    }
109103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org                }
110103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org            }
111103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        }
112103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org    }
113103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
114103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.orgprivate:
115103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org    /**
116103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org     * GrContext has optimizations around full rendertarget draws that can be replaced with clears.
117103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org     * We are trying to test those. We could use saveLayer() to create small SkGpuDevices but
118103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org     * saveLayer() uses the texture cache. This means that the actual render target may be larger
119103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org     * than the layer. Because the clip will contain the layer's bounds, no draws will be full-RT.
120103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org     * So when running on a GPU canvas we explicitly create a temporary canvas using a texture with
121103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org     * dimensions exactly matching the layer size.
122103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org     */
123103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org    SkCanvas* possiblyCreateTempCanvas(SkCanvas* baseCanvas, int w, int h) {
124103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        SkCanvas* tempCanvas = NULL;
125103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org#if SK_SUPPORT_GPU
126103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        GrRenderTarget* rt = baseCanvas->getDevice()->accessRenderTarget();
127103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        if (NULL != rt) {
128103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org            GrContext* context = rt->getContext();
129103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org            GrTextureDesc desc;
130103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org            desc.fWidth = w;
131103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org            desc.fHeight = h;
132103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org            desc.fConfig = rt->config();
133103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org            desc.fFlags = kRenderTarget_GrTextureFlagBit;
134103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org            SkAutoTUnref<GrSurface> surface(context->createUncachedTexture(desc, NULL, 0));
1351f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com            SkAutoTUnref<SkBaseDevice> device(SkGpuDevice::Create(surface.get()));
136103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org            if (NULL != device.get()) {
137103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org                tempCanvas = SkNEW_ARGS(SkCanvas, (device.get()));
138103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org            }
139103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        }
140103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org#endif
141103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        return tempCanvas;
142103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org    }
143103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
144103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org    void drawMode(SkCanvas* canvas,
145103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org                  int x, int y, int w, int h,
146103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org                  const SkPaint& modePaint, SkCanvas* layerCanvas) {
147103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        canvas->save();
148103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
149103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
150103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
151103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        SkRect r = SkRect::MakeWH(SkIntToScalar(w), SkIntToScalar(h));
152103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
153103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        SkCanvas* modeCanvas;
154103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        if (NULL == layerCanvas) {
155091a594dbc4116ec2e54724432472bf37dae794acommit-bot@chromium.org            canvas->saveLayer(&r, NULL);
156103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org            modeCanvas = canvas;
157103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        } else {
158103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org            modeCanvas = layerCanvas;
159103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        }
160103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
161103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        SkPaint bgPaint;
162103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        bgPaint.setAntiAlias(false);
163103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        bgPaint.setShader(fBGShader);
164103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        modeCanvas->drawRect(r, bgPaint);
165103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        modeCanvas->drawRect(r, modePaint);
166103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        modeCanvas = NULL;
167103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
168103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        if (NULL == layerCanvas) {
169103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org            canvas->restore();
170103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        } else {
171c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org            SkAutoROCanvasPixels ropixels(layerCanvas);
172c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org            SkBitmap bitmap;
173c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org            if (ropixels.asROBitmap(&bitmap)) {
174c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org                canvas->drawBitmap(bitmap, 0, 0);
175c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org            }
176103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        }
177103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
178103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        r.inset(-SK_ScalarHalf, -SK_ScalarHalf);
179103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        SkPaint borderPaint;
180103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        borderPaint.setStyle(SkPaint::kStroke_Style);
181103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        canvas->drawRect(r, borderPaint);
182103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
183103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        canvas->restore();
184103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org    }
185103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
186103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org    virtual void onOnceBeforeDraw() SK_OVERRIDE {
187103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        static const uint32_t kCheckData[] = {
188103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org            SkPackARGB32(0xFF, 0x40, 0x40, 0x40),
189103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org            SkPackARGB32(0xFF, 0xD0, 0xD0, 0xD0),
190103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org            SkPackARGB32(0xFF, 0xD0, 0xD0, 0xD0),
191103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org            SkPackARGB32(0xFF, 0x40, 0x40, 0x40)
192103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        };
193103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        SkBitmap bg;
194eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com        bg.allocN32Pixels(2, 2, true);
195103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        SkAutoLockPixels bgAlp(bg);
196103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        memcpy(bg.getPixels(), kCheckData, sizeof(kCheckData));
197103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
198103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        SkMatrix lm;
199103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        lm.setScale(SkIntToScalar(kCheckSize), SkIntToScalar(kCheckSize));
2009c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org        fBGShader.reset(SkShader::CreateBitmapShader(bg,
2019c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                                                     SkShader::kRepeat_TileMode,
2029c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                                                     SkShader::kRepeat_TileMode,
2039c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                                                     &lm));
204103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
205103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        SkPaint bmpPaint;
206103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        static const SkPoint kCenter = { SkIntToScalar(kSize) / 2, SkIntToScalar(kSize) / 2 };
207103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        static const SkColor kColors[] = { SK_ColorTRANSPARENT, 0x80800000,
208103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org                                          0xF020F060, SK_ColorWHITE };
209103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        bmpPaint.setShader(SkGradientShader::CreateRadial(kCenter,
210103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org                                                          3 * SkIntToScalar(kSize) / 4,
211103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org                                                          kColors,
212103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org                                                          NULL,
213103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org                                                          SK_ARRAY_COUNT(kColors),
214103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org                                                          SkShader::kRepeat_TileMode))->unref();
215103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
216103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        SkBitmap bmp;
217eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com        bmp.allocN32Pixels(kSize, kSize);
218103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        SkCanvas bmpCanvas(bmp);
219103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
220103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        bmpCanvas.clear(SK_ColorTRANSPARENT);
221103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        SkRect rect = { SkIntToScalar(kSize) / 8, SkIntToScalar(kSize) / 8,
222103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org                        7 * SkIntToScalar(kSize) / 8, 7 * SkIntToScalar(kSize) / 8};
223103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        bmpCanvas.drawRect(rect, bmpPaint);
224103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
225103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        fBmpShader.reset(SkShader::CreateBitmapShader(bmp,
226103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org                                                      SkShader::kClamp_TileMode,
227103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org                                                      SkShader::kClamp_TileMode));
228103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org    }
229103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
230103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org    enum {
231103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        kCheckSize = 8,
232103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        kSize = 30,
233103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org        kTestsPerRow = 15,
234103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org    };
235103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
236103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org    SkAutoTUnref<SkShader> fBGShader;
237103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org    SkAutoTUnref<SkShader> fBmpShader;
238103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
239103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org    typedef GM INHERITED;
240103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org};
241103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
242103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
243103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
244103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.orgDEF_GM(return new Xfermodes3GM;)
245103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org
246103f2d0f2218f1576f8838ec490ddc4e43d1956ecommit-bot@chromium.org}
247