BlurRoundRectBench.cpp revision 8610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485
1551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer/* 263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman* Copyright 2013 Google Inc. 36c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke* 46c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke* Use of this source code is governed by a BSD-style license that can be 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner* found in the LICENSE file. 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner*/ 763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman 86c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#include "SkBenchmark.h" 96c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#include "SkBlurMask.h" 106c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#include "SkBlurMaskFilter.h" 116c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#include "SkCanvas.h" 1263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman#include "SkColorFilter.h" 139a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson#include "SkLayerDrawLooper.h" 149a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson#include "SkPaint.h" 159a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson#include "SkPath.h" 169a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson#include "SkPoint.h" 176c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#include "SkRect.h" 186c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#include "SkRRect.h" 196c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#include "SkString.h" 20551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "SkXfermode.h" 21551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer 22551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer// Large blurred RR appear frequently on web pages. This benchmark measures our 231f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer// performance in this case. 246c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeclass BlurRoundRectBench : public SkBenchmark { 256c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekepublic: 266c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke BlurRoundRectBench(int width, int height, int cornerRadius) 276c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke : fName("blurroundrect") { 286c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke fName.appendf("_WH[%ix%i]_cr[%i]", width, height, cornerRadius); 296c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SkRect r = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height)); 306c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke fRRect.setRectXY(r, SkIntToScalar(cornerRadius), SkIntToScalar(cornerRadius)); 316c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke } 32c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer 336c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke virtual const char* onGetName() SK_OVERRIDE { 34c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer return fName.c_str(); 356c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke } 36620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke 37620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke virtual SkIPoint onGetSize() SK_OVERRIDE { 38c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer return SkIPoint::Make(SkScalarCeilToInt(fRRect.rect().width()), 39620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke SkScalarCeilToInt(fRRect.rect().height())); 40c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer } 41620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke 42c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 43620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke SkLayerDrawLooper* looper = new SkLayerDrawLooper; 446c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke { 45757c1f9d87b516a1e3bc4cd678245b207ae9c559Brian Gaeke SkLayerDrawLooper::LayerInfo info; 466c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke info.fFlagsMask = 0; 479a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson info.fPaintBits = SkLayerDrawLooper::kMaskFilter_Bit 489a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson | SkLayerDrawLooper::kColorFilter_Bit; 499a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson info.fColorMode = SkXfermode::kSrc_Mode; 509a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson info.fOffset = SkPoint::Make(SkIntToScalar(-1), SkIntToScalar(0)); 519a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson info.fPostTranslate = false; 529a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson SkPaint* paint = looper->addLayerOnTop(info); 539a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson SkMaskFilter* maskFilter = SkBlurMaskFilter::Create(SK_ScalarHalf, 549a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson SkBlurMaskFilter::kNormal_BlurStyle, 559a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson SkBlurMaskFilter::kHighQuality_BlurFlag); 569a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson paint->setMaskFilter(maskFilter)->unref(); 579a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson SkColorFilter* colorFilter = SkColorFilter::CreateModeFilter(SK_ColorLTGRAY, 589a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson SkXfermode::kSrcIn_Mode); 599a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson paint->setColorFilter(colorFilter)->unref(); 609a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson paint->setColor(SK_ColorGRAY); 619a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson } 626c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke { 639a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson SkLayerDrawLooper::LayerInfo info; 646c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke looper->addLayerOnTop(info); 656c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke } 666c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SkPaint dullPaint; 676c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke dullPaint.setAntiAlias(true); 686c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 696c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SkPaint loopedPaint; 706c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke loopedPaint.setLooper(looper)->unref(); 716c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke loopedPaint.setAntiAlias(true); 726c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke loopedPaint.setColor(SK_ColorCYAN); 736c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 746c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke for (int i = 0; i < this->getLoops(); i++) { 756c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke canvas->drawRect(fRRect.rect(), dullPaint); 766c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke canvas->drawRRect(fRRect, loopedPaint); 77fe4591bfc2b147c10d6a7b1a5af56454fb78daceStephen Wilson } 78314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson } 796c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 809a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilsonprivate: 819a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson SkString fName; 826c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SkRRect fRRect; 836c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 84620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke typedef SkBenchmark INHERITED; 85620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke}; 86e9f6f2c0492af8097166f1b7d62f131f20ca5714Brian Gaeke 879a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson// Create one with dimensions/rounded corners based on the skp 88c8f6c44af46554036084cba21a118266f5e26c0eMichael J. SpencerDEF_BENCH(return new BlurRoundRectBench(600, 5514, 6);) 89c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer// Same radii, much smaller rectangle 90c8f6c44af46554036084cba21a118266f5e26c0eMichael J. SpencerDEF_BENCH(return new BlurRoundRectBench(100, 100, 6);) 91620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke// Other radii options 92620ee02353d8b65959dc01a66b073adfcdef9eacBrian GaekeDEF_BENCH(return new BlurRoundRectBench(100, 100, 30);) 93620ee02353d8b65959dc01a66b073adfcdef9eacBrian GaekeDEF_BENCH(return new BlurRoundRectBench(100, 100, 90);) 94c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer