BlurRoundRectBench.cpp revision e396455d2d60ddf8e625b5037254f3c09fbcdcf5
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 423361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { 4373cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org SkLayerDrawLooper::Builder looperBuilder; 448610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com { 458610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkLayerDrawLooper::LayerInfo info; 468610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com info.fPaintBits = SkLayerDrawLooper::kMaskFilter_Bit 478610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com | SkLayerDrawLooper::kColorFilter_Bit; 488610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com info.fColorMode = SkXfermode::kSrc_Mode; 498610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com info.fOffset = SkPoint::Make(SkIntToScalar(-1), SkIntToScalar(0)); 508610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com info.fPostTranslate = false; 5173cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org SkPaint* paint = looperBuilder.addLayerOnTop(info); 526c1e49af8de1f6dfdc5fb09cd0edfc2e469e945frobertphillips@google.com SkMaskFilter* maskFilter = SkBlurMaskFilter::Create( 53e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org kNormal_SkBlurStyle, 546c1e49af8de1f6dfdc5fb09cd0edfc2e469e945frobertphillips@google.com SkBlurMask::ConvertRadiusToSigma(SK_ScalarHalf), 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; 6473cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org looperBuilder.addLayerOnTop(info); 658610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com } 668610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkPaint dullPaint; 678610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com dullPaint.setAntiAlias(true); 687b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 698610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com SkPaint loopedPaint; 7073cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org loopedPaint.setLooper(looperBuilder.detachLooper())->unref(); 718610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com loopedPaint.setAntiAlias(true); 728610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com loopedPaint.setColor(SK_ColorCYAN); 737b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 743361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; 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