blurroundrect.cpp revision 73cb15351f33459e0c861a96135c634dec77ef9d
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 { 5673cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org SkLayerDrawLooper::Builder looperBuilder; 577b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com { 587b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkLayerDrawLooper::LayerInfo info; 598610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com info.fPaintBits = SkLayerDrawLooper::kMaskFilter_Bit 608610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com | SkLayerDrawLooper::kColorFilter_Bit; 617b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com info.fColorMode = SkXfermode::kSrc_Mode; 627b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com info.fOffset = SkPoint::Make(SkIntToScalar(-1), SkIntToScalar(0)); 637b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com info.fPostTranslate = false; 6473cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org SkPaint* paint = looperBuilder.addLayerOnTop(info); 656c1e49af8de1f6dfdc5fb09cd0edfc2e469e945frobertphillips@google.com SkMaskFilter* maskFilter = SkBlurMaskFilter::Create( 667b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkBlurMaskFilter::kNormal_BlurStyle, 676c1e49af8de1f6dfdc5fb09cd0edfc2e469e945frobertphillips@google.com SkBlurMask::ConvertRadiusToSigma(SK_ScalarHalf), 687b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkBlurMaskFilter::kHighQuality_BlurFlag); 697b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com paint->setMaskFilter(maskFilter)->unref(); 705fdef98f627697966763b88d770a8a8e45c8197ascroggo@google.com SkColorFilter* colorFilter = SkColorFilter::CreateModeFilter(SK_ColorLTGRAY, 717b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkXfermode::kSrcIn_Mode); 727b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com paint->setColorFilter(colorFilter)->unref(); 735fdef98f627697966763b88d770a8a8e45c8197ascroggo@google.com paint->setColor(SK_ColorGRAY); 747b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 757b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com { 767b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkLayerDrawLooper::LayerInfo info; 7773cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org looperBuilder.addLayerOnTop(info); 787b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 797b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkPaint paint; 808610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com canvas->drawRect(fRRect.rect(), paint); 817b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 8273cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org paint.setLooper(looperBuilder.detachLooper())->unref(); 835fdef98f627697966763b88d770a8a8e45c8197ascroggo@google.com paint.setColor(SK_ColorCYAN); 847b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com paint.setAntiAlias(true); 857b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 868610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com canvas->drawRRect(fRRect, paint); 877b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 887b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 897b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.comprivate: 908610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkString fName; 918610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkRRect fRRect; 928610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com 938610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com typedef skiagm::GM INHERITED; 947b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com}; 957b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 968610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com// Simpler blurred RR test cases where all the radii are the same. 978610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.comclass SimpleBlurRoundRectGM : public skiagm::GM { 987b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.compublic: 998610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SimpleBlurRoundRectGM() 1008610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com : fName("simpleblurroundrect") { 1017b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 1027b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 1037b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.comprotected: 1048610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com virtual SkString onShortName() SK_OVERRIDE { 1058610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com return fName; 1068610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com } 1078610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com 1088610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com virtual SkISize onISize() SK_OVERRIDE { 1094ef88a213bd44f4be76eb5b48ee99f2f5d7d6bb8scroggo@google.com return SkISize::Make(750, 750); 1107b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 1117b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 1127b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 1134b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org canvas->scale(1.5f, 1.5f); 1148610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com 1158610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com const int blurRadii[] = { 1, 3, 6, 10 }; 1168610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com const int cornerRadii[] = { 1, 3, 6, 10 }; 1178610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com const SkRect r = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100)); 1188610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(blurRadii); ++i) { 1198610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkAutoCanvasRestore autoRestore(canvas, true); 1208610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com canvas->translate(0, (r.height() + SkIntToScalar(20)) * i); 1218610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com for (size_t j = 0; j < SK_ARRAY_COUNT(cornerRadii); ++j) { 1226c1e49af8de1f6dfdc5fb09cd0edfc2e469e945frobertphillips@google.com SkMaskFilter* filter = SkBlurMaskFilter::Create( 1236c1e49af8de1f6dfdc5fb09cd0edfc2e469e945frobertphillips@google.com SkBlurMaskFilter::kNormal_BlurStyle, 1246c1e49af8de1f6dfdc5fb09cd0edfc2e469e945frobertphillips@google.com SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(blurRadii[i]))); 1258610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkPaint paint; 1268610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com paint.setColor(SK_ColorBLUE); 1278610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com paint.setMaskFilter(filter)->unref(); 1288610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com 1298610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkRRect rrect; 1308610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com rrect.setRectXY(r, SkIntToScalar(cornerRadii[j]), SkIntToScalar(cornerRadii[j])); 1318610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com canvas->drawRRect(rrect, paint); 1328610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com canvas->translate(r.width() + SkIntToScalar(10), 0); 1338610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com } 1348610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com } 1357b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 1367b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.comprivate: 1378610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com const SkString fName; 1387b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 1398610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com typedef skiagm::GM INHERITED; 1407b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com}; 1417b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 1427b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com// Create one with dimensions/rounded corners based on the skp 1437e6e80a6eba2ce4250466d4d61e91ad8c609a593epoger@google.com// 1447e6e80a6eba2ce4250466d4d61e91ad8c609a593epoger@google.com// TODO(scroggo): Disabled in an attempt to rememdy 1457e6e80a6eba2ce4250466d4d61e91ad8c609a593epoger@google.com// https://code.google.com/p/skia/issues/detail?id=1801 ('Win7 Test bots all failing GenerateGMs: 1467e6e80a6eba2ce4250466d4d61e91ad8c609a593epoger@google.com// ran wrong number of tests') 1477e6e80a6eba2ce4250466d4d61e91ad8c609a593epoger@google.com//DEF_GM(return new BlurRoundRectGM(600, 5514, 6);) 1487e6e80a6eba2ce4250466d4d61e91ad8c609a593epoger@google.com 1497b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com// Rounded rect with two opposite corners with large radii, the other two 1507b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com// small. 1518610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.comDEF_GM(return new BlurRoundRectGM(100, 100);) 1528610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com 1538610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.comDEF_GM(return new SimpleBlurRoundRectGM();) 154