18c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com/* 28c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com * Copyright 2013 Google Inc. 38c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com * 48c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be 58c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com * found in the LICENSE file. 68c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com */ 78c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com#include "gm.h" 833d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h" 98c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com#include "SkBitmap.h" 108c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com#include "SkShader.h" 11d47067392848ba132d4e86ffbeebe2dcacda9534Mike Reed#include "SkBlendModePriv.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); 371818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark 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; 43d47067392848ba132d4e86ffbeebe2dcacda9534Mike Reed for (size_t m = 0; m <= (size_t)SkBlendMode::kLastMode; m++) { 44374772bd61951f01bf84fe17bf53d8867681c9aereed SkBlendMode mode = static_cast<SkBlendMode>(m); 458c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com 468c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com canvas->save(); 478c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com 488c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com canvas->translate(x, y); 498c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com SkPaint p; 508c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com p.setAntiAlias(false); 518c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com p.setStyle(SkPaint::kFill_Style); 528c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com p.setShader(fBG); 538c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com SkRect r = SkRect::MakeWH(w, h); 548c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com canvas->drawRect(r, p); 558c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com 5696fcdcc219d2a0d3579719b84b28bede76efba64halcanary canvas->saveLayer(&r, nullptr); 578c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com 588c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com p.setShader(fDst); 598c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com canvas->drawRect(r, p); 608c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com p.setShader(fSrc); 61374772bd61951f01bf84fe17bf53d8867681c9aereed p.setBlendMode(mode); 628c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com canvas->drawRect(r, p); 638c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com 648c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com canvas->restore(); 658c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com 668c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com r.inset(-SK_ScalarHalf, -SK_ScalarHalf); 678c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com p.setStyle(SkPaint::kStroke_Style); 6896fcdcc219d2a0d3579719b84b28bede76efba64halcanary p.setShader(nullptr); 69374772bd61951f01bf84fe17bf53d8867681c9aereed p.setBlendMode(SkBlendMode::kSrcOver); 708c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com canvas->drawRect(r, p); 718c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com 728c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com canvas->restore(); 738c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com 748c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com#if 1 752a475eae622adc1e8fa29206be1eaf862c23548eCary Clark canvas->drawString(SkBlendMode_Name(mode), 762a475eae622adc1e8fa29206be1eaf862c23548eCary Clark x + w/2, y - labelP.getTextSize()/2, labelP); 778c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com#endif 788c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com x += w + SkIntToScalar(10); 798c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com if ((m % W) == W - 1) { 808c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com x = 0; 818c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com y += h + SkIntToScalar(30); 828c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com } 838c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com } 848c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com } 858c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com 868c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.comprivate: 8736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onOnceBeforeDraw() override { 88dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein const uint32_t kCheckData[] = { 894ec1ac6a2dc7e43c4179638f3dd801be6f3b386ecaryclark SkPackARGB32(0xFF, 0x42, 0x41, 0x42), 904ec1ac6a2dc7e43c4179638f3dd801be6f3b386ecaryclark SkPackARGB32(0xFF, 0xD6, 0xD3, 0xD6), 914ec1ac6a2dc7e43c4179638f3dd801be6f3b386ecaryclark SkPackARGB32(0xFF, 0xD6, 0xD3, 0xD6), 924ec1ac6a2dc7e43c4179638f3dd801be6f3b386ecaryclark SkPackARGB32(0xFF, 0x42, 0x41, 0x42) 938c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com }; 948c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com SkBitmap bg; 95eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com bg.allocN32Pixels(2, 2, true); 968c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com memcpy(bg.getPixels(), kCheckData, sizeof(kCheckData)); 97cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com 988c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com SkMatrix lm; 998c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com lm.setScale(SkIntToScalar(16), SkIntToScalar(16)); 1001a9b9640843a64af8d9d90337ec3b3fea663196areed fBG = SkShader::MakeBitmapShader(bg, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, 1011a9b9640843a64af8d9d90337ec3b3fea663196areed &lm); 102cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com 103d3e919123d46fc98fbe5f70a23afdfa9f8d92131cdalton SkBitmap srcBmp; 104d3e919123d46fc98fbe5f70a23afdfa9f8d92131cdalton srcBmp.allocN32Pixels(kSize, kSize); 105d3e919123d46fc98fbe5f70a23afdfa9f8d92131cdalton SkPMColor* pixels = reinterpret_cast<SkPMColor*>(srcBmp.getPixels()); 106cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com 1078c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com for (int y = 0; y < kSize; ++y) { 1088c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com int c = y * (1 << kShift); 1098c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com SkPMColor rowColor = SkPackARGB32(c, c, 0, c/2); 1108c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com for (int x = 0; x < kSize; ++x) { 1118c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com pixels[kSize * y + x] = rowColor; 1128c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com } 1138c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com } 1141a9b9640843a64af8d9d90337ec3b3fea663196areed fSrc = SkShader::MakeBitmapShader(srcBmp, SkShader::kClamp_TileMode, 1151a9b9640843a64af8d9d90337ec3b3fea663196areed SkShader::kClamp_TileMode); 116d3e919123d46fc98fbe5f70a23afdfa9f8d92131cdalton SkBitmap dstBmp; 117d3e919123d46fc98fbe5f70a23afdfa9f8d92131cdalton dstBmp.allocN32Pixels(kSize, kSize); 118d3e919123d46fc98fbe5f70a23afdfa9f8d92131cdalton pixels = reinterpret_cast<SkPMColor*>(dstBmp.getPixels()); 119cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com 1208c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com for (int x = 0; x < kSize; ++x) { 1218c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com int c = x * (1 << kShift); 1228c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com SkPMColor colColor = SkPackARGB32(c, 0, c, c/2); 1238c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com for (int y = 0; y < kSize; ++y) { 1248c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com pixels[kSize * y + x] = colColor; 1258c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com } 1268c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com } 1271a9b9640843a64af8d9d90337ec3b3fea663196areed fDst = SkShader::MakeBitmapShader(dstBmp, SkShader::kClamp_TileMode, 1281a9b9640843a64af8d9d90337ec3b3fea663196areed SkShader::kClamp_TileMode); 1298c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com } 130cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com 1318c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com enum { 1328c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com kShift = 2, 1338c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com kSize = 256 >> kShift, 1348c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com }; 135cbbdab5513ee013af0f590cf8aad09634c90c7aaskia.committer@gmail.com 1361a9b9640843a64af8d9d90337ec3b3fea663196areed sk_sp<SkShader> fBG; 1371a9b9640843a64af8d9d90337ec3b3fea663196areed sk_sp<SkShader> fSrc; 1381a9b9640843a64af8d9d90337ec3b3fea663196areed sk_sp<SkShader> fDst; 1398c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com 1408c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com typedef GM INHERITED; 1418c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com}; 1428c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com 1438c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com////////////////////////////////////////////////////////////////////////////// 1448c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com 1458c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.comstatic GM* MyFactory(void*) { return new Xfermodes2GM; } 1468c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.comstatic GMRegistry reg(MyFactory); 1478c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com 1488c463b02d9bc1ed430ac92dbcea47a1394994ba4bsalomon@google.com} 149