blurroundrect.cpp revision 4b413c8bb123e42ca4b9c7bfa6bc2167283cb84c
17b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com/* 27b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com* Copyright 2013 Google Inc. 37b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com* 47b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com* Use of this source code is governed by a BSD-style license that can be 57b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com* found in the LICENSE file. 67b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com*/ 77b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 87b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "gm.h" 97b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkBlurMask.h" 107b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkBlurMaskFilter.h" 117b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkCanvas.h" 127b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkColorFilter.h" 137b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkLayerDrawLooper.h" 147b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkPaint.h" 157b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkPath.h" 167b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkPoint.h" 177b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkRect.h" 187b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkRRect.h" 197b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkString.h" 207b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkXfermode.h" 217b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 228610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com// This GM mimics a blurred RR seen in the wild. 237b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.comclass BlurRoundRectGM : public skiagm::GM { 247b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.compublic: 258610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com BlurRoundRectGM(int width, int height, int radius) 267b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com : fName("blurroundrect") 278610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com { 288610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkRect r = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height)); 298610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com fRRect.setRectXY(r, SkIntToScalar(radius), SkIntToScalar(radius)); 308610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com fName.appendf("-WH[%ix%i]-corner[%i]", width, height, radius); 318610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com } 328610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com 338610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com BlurRoundRectGM(int width, int height) 348610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com : fName("blurroundrect") { 358610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com fName.appendf("-WH[%ix%i]-unevenCorners", 368610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com width, height); 377b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkVector radii[4]; 388610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com radii[0].set(SkIntToScalar(30), SkIntToScalar(30)); 398610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com radii[1].set(SkIntToScalar(10), SkIntToScalar(10)); 408610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com radii[2].set(SkIntToScalar(30), SkIntToScalar(30)); 418610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com radii[3].set(SkIntToScalar(10), SkIntToScalar(10)); 428610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkRect r = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height)); 437b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com fRRect.setRectRadii(r, radii); 447b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 457b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 467b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com virtual SkString onShortName() SK_OVERRIDE { 477b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com return fName; 487b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 497b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 507b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com virtual SkISize onISize() SK_OVERRIDE { 518610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com return SkISize::Make(SkScalarCeilToInt(fRRect.rect().width()), 528610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkScalarCeilToInt(fRRect.rect().height())); 537b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 547b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 557b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 567b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkLayerDrawLooper* looper = new SkLayerDrawLooper; 577b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com { 587b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkLayerDrawLooper::LayerInfo info; 597b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com info.fFlagsMask = 0; 608610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com info.fPaintBits = SkLayerDrawLooper::kMaskFilter_Bit 618610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com | SkLayerDrawLooper::kColorFilter_Bit; 627b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com info.fColorMode = SkXfermode::kSrc_Mode; 637b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com info.fOffset = SkPoint::Make(SkIntToScalar(-1), SkIntToScalar(0)); 647b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com info.fPostTranslate = false; 657b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkPaint* paint = looper->addLayerOnTop(info); 666c1e49af8de1f6dfdc5fb09cd0edfc2e469e945frobertphillips@google.com SkMaskFilter* maskFilter = SkBlurMaskFilter::Create( 677b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkBlurMaskFilter::kNormal_BlurStyle, 686c1e49af8de1f6dfdc5fb09cd0edfc2e469e945frobertphillips@google.com SkBlurMask::ConvertRadiusToSigma(SK_ScalarHalf), 697b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkBlurMaskFilter::kHighQuality_BlurFlag); 707b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com paint->setMaskFilter(maskFilter)->unref(); 715fdef98f627697966763b88d770a8a8e45c8197ascroggo@google.com SkColorFilter* colorFilter = SkColorFilter::CreateModeFilter(SK_ColorLTGRAY, 727b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkXfermode::kSrcIn_Mode); 737b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com paint->setColorFilter(colorFilter)->unref(); 745fdef98f627697966763b88d770a8a8e45c8197ascroggo@google.com paint->setColor(SK_ColorGRAY); 757b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 767b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com { 777b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkLayerDrawLooper::LayerInfo info; 787b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com looper->addLayerOnTop(info); 797b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 807b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkPaint paint; 818610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com canvas->drawRect(fRRect.rect(), paint); 827b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 837b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com paint.setLooper(looper)->unref(); 845fdef98f627697966763b88d770a8a8e45c8197ascroggo@google.com paint.setColor(SK_ColorCYAN); 857b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com paint.setAntiAlias(true); 867b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 878610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com canvas->drawRRect(fRRect, paint); 887b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 897b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 907b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.comprivate: 918610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkString fName; 928610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkRRect fRRect; 938610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com 948610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com typedef skiagm::GM INHERITED; 957b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com}; 967b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 978610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com// Simpler blurred RR test cases where all the radii are the same. 988610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.comclass SimpleBlurRoundRectGM : public skiagm::GM { 997b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.compublic: 1008610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SimpleBlurRoundRectGM() 1018610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com : fName("simpleblurroundrect") { 1027b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 1037b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 1047b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.comprotected: 1058610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com virtual SkString onShortName() SK_OVERRIDE { 1068610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com return fName; 1078610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com } 1088610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com 1098610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com virtual SkISize onISize() SK_OVERRIDE { 1104ef88a213bd44f4be76eb5b48ee99f2f5d7d6bb8scroggo@google.com return SkISize::Make(750, 750); 1117b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 1127b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 1137b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 1144b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org canvas->scale(1.5f, 1.5f); 1158610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com 1168610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com const int blurRadii[] = { 1, 3, 6, 10 }; 1178610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com const int cornerRadii[] = { 1, 3, 6, 10 }; 1188610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com const SkRect r = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100)); 1198610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(blurRadii); ++i) { 1208610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkAutoCanvasRestore autoRestore(canvas, true); 1218610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com canvas->translate(0, (r.height() + SkIntToScalar(20)) * i); 1228610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com for (size_t j = 0; j < SK_ARRAY_COUNT(cornerRadii); ++j) { 1236c1e49af8de1f6dfdc5fb09cd0edfc2e469e945frobertphillips@google.com SkMaskFilter* filter = SkBlurMaskFilter::Create( 1246c1e49af8de1f6dfdc5fb09cd0edfc2e469e945frobertphillips@google.com SkBlurMaskFilter::kNormal_BlurStyle, 1256c1e49af8de1f6dfdc5fb09cd0edfc2e469e945frobertphillips@google.com SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(blurRadii[i]))); 1268610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkPaint paint; 1278610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com paint.setColor(SK_ColorBLUE); 1288610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com paint.setMaskFilter(filter)->unref(); 1298610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com 1308610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkRRect rrect; 1318610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com rrect.setRectXY(r, SkIntToScalar(cornerRadii[j]), SkIntToScalar(cornerRadii[j])); 1328610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com canvas->drawRRect(rrect, paint); 1338610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com canvas->translate(r.width() + SkIntToScalar(10), 0); 1348610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com } 1358610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com } 1367b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 1377b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.comprivate: 1388610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com const SkString fName; 1397b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 1408610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com typedef skiagm::GM INHERITED; 1417b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com}; 1427b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 1437b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com// Create one with dimensions/rounded corners based on the skp 1447e6e80a6eba2ce4250466d4d61e91ad8c609a593epoger@google.com// 1457e6e80a6eba2ce4250466d4d61e91ad8c609a593epoger@google.com// TODO(scroggo): Disabled in an attempt to rememdy 1467e6e80a6eba2ce4250466d4d61e91ad8c609a593epoger@google.com// https://code.google.com/p/skia/issues/detail?id=1801 ('Win7 Test bots all failing GenerateGMs: 1477e6e80a6eba2ce4250466d4d61e91ad8c609a593epoger@google.com// ran wrong number of tests') 1487e6e80a6eba2ce4250466d4d61e91ad8c609a593epoger@google.com//DEF_GM(return new BlurRoundRectGM(600, 5514, 6);) 1497e6e80a6eba2ce4250466d4d61e91ad8c609a593epoger@google.com 1507b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com// Rounded rect with two opposite corners with large radii, the other two 1517b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com// small. 1528610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.comDEF_GM(return new BlurRoundRectGM(100, 100);) 1538610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com 1548610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.comDEF_GM(return new SimpleBlurRoundRectGM();) 155