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