xfermodes2.cpp revision 36352bf5e38f45a70ee4f4fc132a38048d38206d
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); 37992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark 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 58091a594dbc4116ec2e54724432472bf37dae794acommit-bot@chromium.org canvas->saveLayer(&r, NULL); 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); 708c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com p.setShader(NULL); 718c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com p.setXfermode(NULL); 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[] = { 918c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com SkPackARGB32(0xFF, 0x40, 0x40, 0x40), 928c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com SkPackARGB32(0xFF, 0xD0, 0xD0, 0xD0), 938c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com SkPackARGB32(0xFF, 0xD0, 0xD0, 0xD0), 948c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com SkPackARGB32(0xFF, 0x40, 0x40, 0x40) 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)); 1029c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org fBG.reset(SkShader::CreateBitmapShader(bg, 1039c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org SkShader::kRepeat_TileMode, 1049c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org SkShader::kRepeat_TileMode, 1059c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org &lm)); 106cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com 1078c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com SkBitmap dstBmp; 108eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com dstBmp.allocN32Pixels(kSize, kSize); 1098c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com SkPMColor* pixels = reinterpret_cast<SkPMColor*>(dstBmp.getPixels()); 110cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com 1118c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com for (int y = 0; y < kSize; ++y) { 1128c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com int c = y * (1 << kShift); 1138c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com SkPMColor rowColor = SkPackARGB32(c, c, 0, c/2); 1148c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com for (int x = 0; x < kSize; ++x) { 1158c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com pixels[kSize * y + x] = rowColor; 1168c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com } 1178c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com } 1188c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com fSrc.reset(SkShader::CreateBitmapShader(dstBmp, 1198c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com SkShader::kClamp_TileMode, 1208c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com SkShader::kClamp_TileMode)); 1218c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com SkBitmap srcBmp; 122eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com srcBmp.allocN32Pixels(kSize, kSize); 1238c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com pixels = reinterpret_cast<SkPMColor*>(srcBmp.getPixels()); 124cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com 1258c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com for (int x = 0; x < kSize; ++x) { 1268c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com int c = x * (1 << kShift); 1278c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com SkPMColor colColor = SkPackARGB32(c, 0, c, c/2); 1288c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com for (int y = 0; y < kSize; ++y) { 1298c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com pixels[kSize * y + x] = colColor; 1308c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com } 1318c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com } 1328c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com fDst.reset(SkShader::CreateBitmapShader(srcBmp, 1338c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com SkShader::kClamp_TileMode, 1348c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com SkShader::kClamp_TileMode)); 1358c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com } 136cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com 1378c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com enum { 1388c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com kShift = 2, 1398c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com kSize = 256 >> kShift, 1408c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com }; 141cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com 1428c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com SkAutoTUnref<SkShader> fBG; 1438c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com SkAutoTUnref<SkShader> fSrc; 1448c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com SkAutoTUnref<SkShader> fDst; 1458c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com 1468c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com typedef GM INHERITED; 1478c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com}; 1488c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com 1498c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com////////////////////////////////////////////////////////////////////////////// 1508c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com 1518c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.comstatic GM* MyFactory(void*) { return new Xfermodes2GM; } 1528c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.comstatic GMRegistry reg(MyFactory); 1538c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com 1548c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com} 155