BlurBench.cpp revision b3ec29d2d81ae391e433fbdf8aabc791e426ee38
1 2/* 3 * Copyright 2011 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 "SkBlurMask.h" 10#include "SkCanvas.h" 11#include "SkPaint.h" 12#include "SkRandom.h" 13#include "SkShader.h" 14#include "SkString.h" 15#include "SkBlurMaskFilter.h" 16 17#define SMALL SkIntToScalar(2) 18#define REAL SkFloatToScalar(1.5f) 19#define BIG SkIntToScalar(10) 20#define REALBIG SkFloatToScalar(100.5f) 21 22static const char* gStyleName[] = { 23 "normal", 24 "solid", 25 "outer", 26 "inner" 27}; 28 29class BlurBench : public SkBenchmark { 30 SkScalar fRadius; 31 SkBlurMaskFilter::BlurStyle fStyle; 32 uint32_t fFlags; 33 SkString fName; 34 35public: 36 BlurBench(void* param, SkScalar rad, SkBlurMaskFilter::BlurStyle bs, uint32_t flags = 0) 37 : INHERITED(param) { 38 fRadius = rad; 39 fStyle = bs; 40 fFlags = flags; 41 const char* name = rad > 0 ? gStyleName[bs] : "none"; 42 const char* quality = flags & SkBlurMaskFilter::kHighQuality_BlurFlag ? "high_quality" 43 : "low_quality"; 44 if (SkScalarFraction(rad) != 0) { 45 fName.printf("blur_%.2f_%s_%s", SkScalarToFloat(rad), name, quality); 46 } else { 47 fName.printf("blur_%d_%s_%s", SkScalarRound(rad), name, quality); 48 } 49 } 50 51protected: 52 virtual const char* onGetName() { 53 return fName.c_str(); 54 } 55 56 virtual void onDraw(SkCanvas* canvas) { 57 SkPaint paint; 58 this->setupPaint(&paint); 59 60 paint.setAntiAlias(true); 61 62 SkMWCRandom rand; 63 for (int i = 0; i < SkBENCHLOOP(10); i++) { 64 SkRect r = SkRect::MakeWH(rand.nextUScalar1() * 400, 65 rand.nextUScalar1() * 400); 66 r.offset(fRadius, fRadius); 67 68 if (fRadius > 0) { 69 SkMaskFilter* mf = SkBlurMaskFilter::Create(fStyle, 70 SkBlurMask::ConvertRadiusToSigma(fRadius), 71 fFlags); 72 paint.setMaskFilter(mf)->unref(); 73 } 74 canvas->drawOval(r, paint); 75 } 76 } 77 78private: 79 typedef SkBenchmark INHERITED; 80}; 81 82DEF_BENCH(return new BlurBench(p, SMALL, SkBlurMaskFilter::kNormal_BlurStyle);) 83DEF_BENCH(return new BlurBench(p, SMALL, SkBlurMaskFilter::kSolid_BlurStyle);) 84DEF_BENCH(return new BlurBench(p, SMALL, SkBlurMaskFilter::kOuter_BlurStyle);) 85DEF_BENCH(return new BlurBench(p, SMALL, SkBlurMaskFilter::kInner_BlurStyle);) 86 87DEF_BENCH(return new BlurBench(p, BIG, SkBlurMaskFilter::kNormal_BlurStyle);) 88DEF_BENCH(return new BlurBench(p, BIG, SkBlurMaskFilter::kSolid_BlurStyle);) 89DEF_BENCH(return new BlurBench(p, BIG, SkBlurMaskFilter::kOuter_BlurStyle);) 90DEF_BENCH(return new BlurBench(p, BIG, SkBlurMaskFilter::kInner_BlurStyle);) 91 92DEF_BENCH(return new BlurBench(p, REALBIG, SkBlurMaskFilter::kNormal_BlurStyle);) 93DEF_BENCH(return new BlurBench(p, REALBIG, SkBlurMaskFilter::kSolid_BlurStyle);) 94DEF_BENCH(return new BlurBench(p, REALBIG, SkBlurMaskFilter::kOuter_BlurStyle);) 95DEF_BENCH(return new BlurBench(p, REALBIG, SkBlurMaskFilter::kInner_BlurStyle);) 96 97DEF_BENCH(return new BlurBench(p, REAL, SkBlurMaskFilter::kNormal_BlurStyle);) 98DEF_BENCH(return new BlurBench(p, REAL, SkBlurMaskFilter::kSolid_BlurStyle);) 99DEF_BENCH(return new BlurBench(p, REAL, SkBlurMaskFilter::kOuter_BlurStyle);) 100DEF_BENCH(return new BlurBench(p, REAL, SkBlurMaskFilter::kInner_BlurStyle);) 101 102DEF_BENCH(return new BlurBench(p, SMALL, SkBlurMaskFilter::kNormal_BlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);) 103 104DEF_BENCH(return new BlurBench(p, BIG, SkBlurMaskFilter::kNormal_BlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);) 105 106DEF_BENCH(return new BlurBench(p, REALBIG, SkBlurMaskFilter::kNormal_BlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);) 107 108DEF_BENCH(return new BlurBench(p, REAL, SkBlurMaskFilter::kNormal_BlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);) 109 110DEF_BENCH(return new BlurBench(p, 0, SkBlurMaskFilter::kNormal_BlurStyle);) 111