xfermodes2.cpp revision 9c9005a347e9996f357bd79591bd34f74f8bbc66
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 { 268c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com return make_isize(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