196ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 296ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com/* 396ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com * Copyright 2013 Google Inc. 496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com * 596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com * Use of this source code is governed by a BSD-style license that can be 696ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com * found in the LICENSE file. 796ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com */ 896ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 996ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com#include "gm.h" 1096ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com#include "SkBlurMask.h" 1196ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com#include "SkBlurMaskFilter.h" 1296ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 1396ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.comnamespace skiagm { 1496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 1596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com// This GM exercises the blurred rect nine-patching special cases when the 1696ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com// blurred rect is very large and/or very far from the origin. 17ab7442c8d733e0642d1cd80af23cdab43d77039eskia.committer@gmail.com// It creates a large blurred rect/rectori then renders the 4 corners and the 1896ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com// middle. 1996ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.comclass BigBlursGM : public GM { 2096ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.compublic: 2196ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com BigBlursGM() { 2296ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com this->setBGColor(0xFFDDDDDD); 2396ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com } 2496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 2596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.comprotected: 2696ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com virtual SkString onShortName() SK_OVERRIDE { 2796ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com return SkString("bigblurs"); 2896ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com } 2996ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 3096ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com virtual SkISize onISize() SK_OVERRIDE { 31f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina return SkISize::Make(kWidth, kHeight); 3296ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com } 3396ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 3496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 3596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com static const int kBig = 65536; 3696ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com static const SkScalar kSigma = SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(4)); 3796ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 3896ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com const SkRect bigRect = SkRect::MakeWH(SkIntToScalar(kBig), SkIntToScalar(kBig)); 3996ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com SkRect insetRect = bigRect; 4096ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com insetRect.inset(20, 20); 4196ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 4296ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com SkPath rectori; 4396ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 4496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com rectori.addRect(bigRect); 4596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com rectori.addRect(insetRect, SkPath::kCCW_Direction); 4696ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 4796ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com // The blur extends 3*kSigma out from the big rect. 4896ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com // Offset the close-up windows so we get the entire blur 4996ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com static const SkScalar kLeftTopPad = 3*kSigma; // use on left & up of big rect 5096ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com static const SkScalar kRightBotPad = kCloseUpSize-3*kSigma; // use on right and bot sides 5196ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 5296ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com // UL hand corners of the rendered closeups 5396ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com const SkPoint origins[] = { 5496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com { -kLeftTopPad, -kLeftTopPad }, // UL 5596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com { kBig-kRightBotPad, -kLeftTopPad }, // UR 5696ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com { kBig-kRightBotPad, kBig-kRightBotPad }, // LR 5796ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com { -kLeftTopPad, kBig-kRightBotPad }, // LL 5896ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com { kBig/2-kCloseUpSize/2, kBig/2-kCloseUpSize/2 }, // center 5996ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com }; 6096ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 6196ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com SkPaint outlinePaint; 6296ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com outlinePaint.setColor(SK_ColorRED); 6396ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com outlinePaint.setStyle(SkPaint::kStroke_Style); 6496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 6596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com SkPaint blurPaint; 6696ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com blurPaint.setAntiAlias(true); 6796ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com blurPaint.setColor(SK_ColorBLACK); 6896ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 6996ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com int desiredX = 0, desiredY = 0; 7096ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 7196ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com for (int i = 0; i < 2; ++i) { 72e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org for (int j = 0; j <= kLastEnum_SkBlurStyle; ++j) { 73e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org SkMaskFilter* mf = SkBlurMaskFilter::Create((SkBlurStyle)j, kSigma); 7496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com blurPaint.setMaskFilter(mf)->unref(); 7596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 7696ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com for (int k = 0; k < (int)SK_ARRAY_COUNT(origins); ++k) { 7796ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com canvas->save(); 7896ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 79ab7442c8d733e0642d1cd80af23cdab43d77039eskia.committer@gmail.com SkRect clipRect = SkRect::MakeXYWH(SkIntToScalar(desiredX), 8096ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com SkIntToScalar(desiredY), 81ab7442c8d733e0642d1cd80af23cdab43d77039eskia.committer@gmail.com SkIntToScalar(kCloseUpSize), 8296ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com SkIntToScalar(kCloseUpSize)); 8396ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 8496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com canvas->clipRect(clipRect, SkRegion::kReplace_Op, false); 8596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 86ab7442c8d733e0642d1cd80af23cdab43d77039eskia.committer@gmail.com canvas->translate(desiredX-origins[k].fX, 8796ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com desiredY-origins[k].fY); 8896ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 8996ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com if (0 == i) { 9096ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com canvas->drawRect(bigRect, blurPaint); 9196ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com } else { 9296ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com canvas->drawPath(rectori, blurPaint); 9396ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com } 9496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com canvas->restore(); 9596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com canvas->drawRect(clipRect, outlinePaint); 9696ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 9796ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com desiredX += kCloseUpSize; 9896ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com } 9996ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 10096ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com desiredX = 0; 10196ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com desiredY += kCloseUpSize; 10296ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com } 10396ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com } 10496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com } 10596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 10696ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.comprivate: 10796ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com static const int kCloseUpSize = 64; 10896ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com static const int kWidth = 5 * kCloseUpSize; 109e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org static const int kHeight = 2 * (kLastEnum_SkBlurStyle + 1) * kCloseUpSize; 11096ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 11196ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com typedef GM INHERITED; 11296ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com}; 11396ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 11496ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.comDEF_GM( return SkNEW(BigBlursGM); ) 11596ac2f693b3a4b7bb504ec2a13b15eeeaa5ff1fdrobertphillips@google.com 116f3db546a4bf1717126a7ba4dd47ece077a6e76f7robertphillips@google.com} 117