BlurRectBench.cpp revision 8ae714b186ae5f4eaddee239281fbfe7282320c9
1 2/* 3 * Copyright 2013 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8#include "SkBenchmark.h" 9#include "SkCanvas.h" 10#include "SkPaint.h" 11#include "SkRandom.h" 12#include "SkShader.h" 13#include "SkString.h" 14#include "SkBlurMask.h" 15 16#define SMALL SkIntToScalar(2) 17#define REAL SkFloatToScalar(1.5f) 18#define BIG SkIntToScalar(10) 19#define REALBIG SkFloatToScalar(30.5f) 20 21class BlurRectBench: public SkBenchmark { 22 SkScalar fRadius; 23 SkString fName; 24 25public: 26 BlurRectBench(void *param, SkScalar rad) : INHERITED(param) { 27 fRadius = rad; 28 } 29 30protected: 31 virtual const char* onGetName() { 32 return fName.c_str(); 33 } 34 35 SkScalar radius() const { 36 return fRadius; 37 } 38 39 void setName( SkString name ) { 40 fName = name; 41 } 42 43 virtual void onDraw(SkCanvas* canvas) { 44 SkPaint paint; 45 this->setupPaint(&paint); 46 47 paint.setAntiAlias(true); 48 49 int pad = fRadius * 1.5 + 1; 50 SkRect r = SkRect::MakeWH(2 * pad + 1, 2 * pad + 1); 51 52 int loop_count; 53 54 if (fRadius > SkIntToScalar(50)) { 55 loop_count = 10; 56 } else if (fRadius > SkIntToScalar(5)) { 57 loop_count = 1000; 58 } else { 59 loop_count = 10000; 60 } 61 62 preBenchSetup( r ); 63 64 for (int i = 0; i < SkBENCHLOOP(loop_count); i++) { 65 makeBlurryRect( r ); 66 } 67 } 68 69 virtual void makeBlurryRect( SkRect &r ) = 0; 70 virtual void preBenchSetup( SkRect &r ) {} 71private: 72 typedef SkBenchmark INHERITED; 73}; 74 75 76class BlurRectDirectBench: public BlurRectBench { 77 public: 78 BlurRectDirectBench( void *param, SkScalar rad ) : BlurRectBench( param, rad ) { 79 SkString name; 80 81 if (SkScalarFraction(rad) != 0) { 82 name.printf("blurrect_direct_%.2f", SkScalarToFloat(rad)); 83 } else { 84 name.printf("blurrect_direct_%d", SkScalarRound(rad)); 85 } 86 87 setName( name ); 88 } 89protected: 90 virtual void makeBlurryRect( SkRect &r ) { 91 SkMask mask; 92 SkBlurMask::BlurRect( &mask, r, radius(), SkBlurMask::kNormal_Style, SkBlurMask::kHigh_Quality ); 93 } 94}; 95 96class BlurRectSeparableBench: public BlurRectBench { 97 SkMask fSrcMask; 98public: 99 BlurRectSeparableBench(void *param, SkScalar rad) : BlurRectBench( param, rad ) { 100 SkString name; 101 if (SkScalarFraction(rad) != 0) { 102 name.printf("blurrect_separable_%.2f", SkScalarToFloat(rad)); 103 } else { 104 name.printf("blurrect_separable_%d", SkScalarRound(rad)); 105 } 106 107 setName( name ); 108 } 109 110protected: 111 virtual void preBenchSetup( SkRect &r ) { 112 fSrcMask.fFormat = SkMask::kA8_Format; 113 fSrcMask.fRowBytes = r.width(); 114 fSrcMask.fBounds = SkIRect::MakeWH(r.width(), r.height()); 115 fSrcMask.fImage = SkMask::AllocImage( fSrcMask.computeTotalImageSize() ); 116 117 memset( fSrcMask.fImage, 0xff, fSrcMask.computeTotalImageSize() ); 118 } 119 120 virtual void makeBlurryRect( SkRect &r ) { 121 SkMask mask; 122 SkBlurMask::BlurSeparable( &mask, fSrcMask, radius(), SkBlurMask::kNormal_Style, SkBlurMask::kHigh_Quality ); 123 } 124}; 125 126DEF_BENCH(return new BlurRectSeparableBench(p, SMALL);) 127DEF_BENCH(return new BlurRectSeparableBench(p, BIG);) 128DEF_BENCH(return new BlurRectSeparableBench(p, REALBIG);) 129DEF_BENCH(return new BlurRectSeparableBench(p, REAL);) 130DEF_BENCH(return new BlurRectDirectBench(p, SMALL);) 131DEF_BENCH(return new BlurRectDirectBench(p, BIG);) 132DEF_BENCH(return new BlurRectDirectBench(p, REALBIG);) 133DEF_BENCH(return new BlurRectDirectBench(p, REAL);) 134