BlurRectBench.cpp revision 7c7292c6071898d73dc935c3b66b9816183806f0
17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch/* 37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * Copyright 2013 Google Inc. 47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * 57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * Use of this source code is governed by a BSD-style license that can be 67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * found in the LICENSE file. 77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch */ 87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "SkBenchmark.h" 97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "SkCanvas.h" 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "SkPaint.h" 117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "SkRandom.h" 127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "SkShader.h" 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "SkString.h" 147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "SkBlurMask.h" 157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define SMALL SkIntToScalar(2) 177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define REAL SkFloatToScalar(1.5f) 187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define BIG SkIntToScalar(10) 197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define REALBIG SkFloatToScalar(30.5f) 207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass BlurRectBench: public SkBenchmark { 227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkScalar fRadius; 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkString fName; 247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochpublic: 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch BlurRectBench(void *param, SkScalar rad) : INHERITED(param) { 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch fRadius = rad; 287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochprotected: 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual const char* onGetName() { 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return fName.c_str(); 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkScalar radius() const { 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return fRadius; 377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void setName( SkString name ) { 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch fName = name; 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void onDraw(SkCanvas* canvas) { 447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkPaint paint; 457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch this->setupPaint(&paint); 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch paint.setAntiAlias(true); 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int pad = fRadius * 1.5 + 1; 507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkRect r = SkRect::MakeWH(2 * pad + 1, 2 * pad + 1); 517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int loop_count; 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (fRadius > SkIntToScalar(50)) { 557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch loop_count = 10; 567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else if (fRadius > SkIntToScalar(5)) { 577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch loop_count = 1000; 587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else { 597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch loop_count = 10000; 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch preBenchSetup( r ); 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (int i = 0; i < SkBENCHLOOP(loop_count); i++) { 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch makeBlurryRect( r ); 667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void makeBlurryRect( SkRect &r ) = 0; 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void preBenchSetup( SkRect &r ) {} 717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochprivate: 727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch typedef SkBenchmark INHERITED; 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass BlurRectDirectBench: public BlurRectBench { 777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch BlurRectDirectBench( void *param, SkScalar rad ) : BlurRectBench( param, rad ) { 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkString name; 807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (SkScalarFraction(rad) != 0) { 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch name.printf("blurrect_direct_%.2f", SkScalarToFloat(rad)); 837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else { 847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch name.printf("blurrect_direct_%d", SkScalarRound(rad)); 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch setName( name ); 887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochprotected: 907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void makeBlurryRect( SkRect &r ) { 917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkMask mask; 927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkBlurMask::BlurRect( &mask, r, radius(), SkBlurMask::kNormal_Style, SkBlurMask::kHigh_Quality ); 937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass BlurRectSeparableBench: public BlurRectBench { 977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkMask fSrcMask; 987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochpublic: 997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch BlurRectSeparableBench(void *param, SkScalar rad) : BlurRectBench( param, rad ) { 1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkString name; 1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (SkScalarFraction(rad) != 0) { 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch name.printf("blurrect_separable_%.2f", SkScalarToFloat(rad)); 1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else { 1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch name.printf("blurrect_separable_%d", SkScalarRound(rad)); 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch setName( name ); 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochprotected: 1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void preBenchSetup( SkRect &r ) { 1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch fSrcMask.fFormat = SkMask::kA8_Format; 1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch fSrcMask.fRowBytes = r.width(); 1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch fSrcMask.fBounds = SkIRect::MakeWH(r.width(), r.height()); 1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch fSrcMask.fImage = SkMask::AllocImage( fSrcMask.computeTotalImageSize() ); 1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch memset( fSrcMask.fImage, 0xff, fSrcMask.computeTotalImageSize() ); 1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void makeBlurryRect( SkRect &r ) { 1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkMask mask; 1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkBlurMask::BlurSeparable( &mask, fSrcMask, radius(), SkBlurMask::kNormal_Style, SkBlurMask::kHigh_Quality ); 1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDEF_BENCH(return new BlurRectSeparableBench(p, SMALL);) 1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDEF_BENCH(return new BlurRectSeparableBench(p, BIG);) 1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDEF_BENCH(return new BlurRectSeparableBench(p, REALBIG);) 1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDEF_BENCH(return new BlurRectSeparableBench(p, REAL);) 1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDEF_BENCH(return new BlurRectDirectBench(p, SMALL);) 1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDEF_BENCH(return new BlurRectDirectBench(p, BIG);) 1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDEF_BENCH(return new BlurRectDirectBench(p, REALBIG);) 1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDEF_BENCH(return new BlurRectDirectBench(p, REAL);) 1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch