BlurRoundRectBench.cpp revision 7b0565907272bfe6682b09a36f7a8fef85e0f73d
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 227b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.comclass BlurRoundRectBench : public SkBenchmark { 237b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.compublic: 247b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com BlurRoundRectBench(int width, int height, 257b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com // X and Y radii for the upper left corner 267b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com int ulX, int ulY, 277b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com // X and Y radii for the upper right corner 287b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com int urX, int urY, 297b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com // X and Y radii for the lower right corner 307b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com int lrX, int lrY, 317b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com // X and Y radii for the lower left corner 327b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com int llX, int llY) 337b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com : fName("blurroundrect") 347b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com , fWidth(width) 357b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com , fHeight(height) { 367b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com fName.appendf("_WH[%ix%i]_UL[%ix%i]_UR[%ix%i]_LR[%ix%i]_LL[%ix%i]", 377b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com width, height, 387b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com ulX, ulY, 397b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com urX, urY, 407b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com lrX, lrY, 417b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com llX, llY); 427b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com fRadii[0].set(SkIntToScalar(ulX), SkIntToScalar(ulY)); 437b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com fRadii[1].set(SkIntToScalar(urX), SkIntToScalar(urY)); 447b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com fRadii[2].set(SkIntToScalar(lrX), SkIntToScalar(lrY)); 457b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com fRadii[3].set(SkIntToScalar(llX), SkIntToScalar(llY)); 467b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 477b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 487b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com virtual const char* onGetName() SK_OVERRIDE { 497b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com return fName.c_str(); 507b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 517b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 527b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com virtual SkIPoint onGetSize() SK_OVERRIDE { 537b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com return SkIPoint::Make(fWidth, fHeight); 547b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 557b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 567b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 577b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com for (int i = 0; i < this->getLoops(); i++) { 587b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkLayerDrawLooper* looper = new SkLayerDrawLooper; 597b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com { 607b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkLayerDrawLooper::LayerInfo info; 617b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com info.fFlagsMask = 0; 627b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com info.fPaintBits = 40; 637b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com info.fColorMode = SkXfermode::kSrc_Mode; 647b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com info.fOffset = SkPoint::Make(SkIntToScalar(-1), SkIntToScalar(0)); 657b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com info.fPostTranslate = false; 667b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkPaint* paint = looper->addLayerOnTop(info); 677b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkMaskFilter* maskFilter = SkBlurMaskFilter::Create(SK_ScalarHalf, 687b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkBlurMaskFilter::kNormal_BlurStyle, 697b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkBlurMaskFilter::kHighQuality_BlurFlag); 707b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com paint->setMaskFilter(maskFilter)->unref(); 717b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkColorFilter* colorFilter = SkColorFilter::CreateModeFilter(4279308561, 727b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkXfermode::kSrcIn_Mode); 737b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com paint->setColorFilter(colorFilter)->unref(); 747b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com paint->setColor(4278190080); 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; 817b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkRect rect = SkRect::MakeWH(fWidth, fHeight); 827b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com canvas->drawRect(rect, paint); 837b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 847b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com paint.setLooper(looper)->unref(); 857b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com paint.setColor(4293848814); 867b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com paint.setAntiAlias(true); 877b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 887b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkRRect rrect; 897b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com rrect.setRectRadii(rect, fRadii); 907b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com canvas->drawRRect(rrect, paint); 917b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 927b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com } 937b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 947b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.comprivate: 957b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkString fName; 967b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com const int fWidth; 977b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com const int fHeight; 987b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com SkVector fRadii[4]; 997b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com typedef SkBenchmark INHERITED; 1007b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com}; 1017b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com 1027b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com// Create one with dimensions/rounded corners based on the skp 1037b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.comDEF_BENCH(return new BlurRoundRectBench(600, 5514, 6, 6, 6, 6, 6, 6, 6, 6);) 1047b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com// Same radii, much smaller rectangle 1057b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.comDEF_BENCH(return new BlurRoundRectBench(100, 100, 6, 6, 6, 6, 6, 6, 6, 6);) 1067b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com// Rounded rect with two opposite corners with large radii, the other two 1077b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com// small. 1087b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.comDEF_BENCH(return new BlurRoundRectBench(100, 100, 30, 30, 10, 10, 30, 30, 10, 10);) 1097b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.comDEF_BENCH(return new BlurRoundRectBench(100, 100, 90, 90, 90, 90, 90, 90, 90, 90);) 110