BlurRoundRectBench.cpp revision 8610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485
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 "SkBenchmark.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// Large blurred RR appear frequently on web pages. This benchmark measures our 238610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com// performance in this case. 247b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.comclass BlurRoundRectBench : public SkBenchmark { 257b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.compublic: 268610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com BlurRoundRectBench(int width, int height, int cornerRadius) 278610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com : fName("blurroundrect") { 288610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com fName.appendf("_WH[%ix%i]_cr[%i]", width, height, cornerRadius); 298610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkRect r = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height)); 308610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com fRRect.setRectXY(r, SkIntToScalar(cornerRadius), SkIntToScalar(cornerRadius)); 317b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 327b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 337b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com virtual const char* onGetName() SK_OVERRIDE { 347b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com return fName.c_str(); 357b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 367b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 377b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com virtual SkIPoint onGetSize() SK_OVERRIDE { 388610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com return SkIPoint::Make(SkScalarCeilToInt(fRRect.rect().width()), 398610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkScalarCeilToInt(fRRect.rect().height())); 407b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 417b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 427b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 438610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkLayerDrawLooper* looper = new SkLayerDrawLooper; 448610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com { 458610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkLayerDrawLooper::LayerInfo info; 468610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com info.fFlagsMask = 0; 478610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com info.fPaintBits = SkLayerDrawLooper::kMaskFilter_Bit 488610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com | SkLayerDrawLooper::kColorFilter_Bit; 498610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com info.fColorMode = SkXfermode::kSrc_Mode; 508610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com info.fOffset = SkPoint::Make(SkIntToScalar(-1), SkIntToScalar(0)); 518610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com info.fPostTranslate = false; 528610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkPaint* paint = looper->addLayerOnTop(info); 538610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkMaskFilter* maskFilter = SkBlurMaskFilter::Create(SK_ScalarHalf, 548610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkBlurMaskFilter::kNormal_BlurStyle, 558610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkBlurMaskFilter::kHighQuality_BlurFlag); 568610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com paint->setMaskFilter(maskFilter)->unref(); 578610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkColorFilter* colorFilter = SkColorFilter::CreateModeFilter(SK_ColorLTGRAY, 588610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkXfermode::kSrcIn_Mode); 598610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com paint->setColorFilter(colorFilter)->unref(); 608610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com paint->setColor(SK_ColorGRAY); 618610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com } 628610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com { 638610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkLayerDrawLooper::LayerInfo info; 648610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com looper->addLayerOnTop(info); 658610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com } 668610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkPaint dullPaint; 678610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com dullPaint.setAntiAlias(true); 687b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 698610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkPaint loopedPaint; 708610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com loopedPaint.setLooper(looper)->unref(); 718610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com loopedPaint.setAntiAlias(true); 728610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com loopedPaint.setColor(SK_ColorCYAN); 737b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 748610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com for (int i = 0; i < this->getLoops(); i++) { 758610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com canvas->drawRect(fRRect.rect(), dullPaint); 768610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com canvas->drawRRect(fRRect, loopedPaint); 777b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 787b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 797b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 807b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.comprivate: 818610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkString fName; 828610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkRRect fRRect; 838610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com 848610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com typedef SkBenchmark INHERITED; 857b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com}; 867b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 877b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com// Create one with dimensions/rounded corners based on the skp 888610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.comDEF_BENCH(return new BlurRoundRectBench(600, 5514, 6);) 897b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com// Same radii, much smaller rectangle 908610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.comDEF_BENCH(return new BlurRoundRectBench(100, 100, 6);) 918610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com// Other radii options 928610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.comDEF_BENCH(return new BlurRoundRectBench(100, 100, 30);) 938610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.comDEF_BENCH(return new BlurRoundRectBench(100, 100, 90);) 94