1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2011 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker #include "bench/Benchmark.h" 8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBlurTypes.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMaskFilter.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkShader.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkRandom.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkBlurMask.h" 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker #define MINI 0.01f 18*c8dee2aaSAndroid Build Coastguard Worker #define SMALL SkIntToScalar(2) 19*c8dee2aaSAndroid Build Coastguard Worker #define REAL 0.5f 20*c8dee2aaSAndroid Build Coastguard Worker #define BIG SkIntToScalar(10) 21*c8dee2aaSAndroid Build Coastguard Worker #define REALBIG 100.5f 22*c8dee2aaSAndroid Build Coastguard Worker // The value that produces a sigma of just over 2. 23*c8dee2aaSAndroid Build Coastguard Worker #define CUTOVER 2.6f 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker static const char* gStyleName[] = { 26*c8dee2aaSAndroid Build Coastguard Worker "normal", 27*c8dee2aaSAndroid Build Coastguard Worker "solid", 28*c8dee2aaSAndroid Build Coastguard Worker "outer", 29*c8dee2aaSAndroid Build Coastguard Worker "inner" 30*c8dee2aaSAndroid Build Coastguard Worker }; 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker class BlurBench : public Benchmark { 33*c8dee2aaSAndroid Build Coastguard Worker SkScalar fRadius; 34*c8dee2aaSAndroid Build Coastguard Worker SkBlurStyle fStyle; 35*c8dee2aaSAndroid Build Coastguard Worker SkString fName; 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Worker public: BlurBench(SkScalar rad,SkBlurStyle bs)38*c8dee2aaSAndroid Build Coastguard Worker BlurBench(SkScalar rad, SkBlurStyle bs) { 39*c8dee2aaSAndroid Build Coastguard Worker fRadius = rad; 40*c8dee2aaSAndroid Build Coastguard Worker fStyle = bs; 41*c8dee2aaSAndroid Build Coastguard Worker const char* name = rad > 0 ? gStyleName[bs] : "none"; 42*c8dee2aaSAndroid Build Coastguard Worker const char* quality = "high_quality"; 43*c8dee2aaSAndroid Build Coastguard Worker if (SkScalarFraction(rad) != 0) { 44*c8dee2aaSAndroid Build Coastguard Worker fName.printf("blur_%.2f_%s_%s", rad, name, quality); 45*c8dee2aaSAndroid Build Coastguard Worker } else { 46*c8dee2aaSAndroid Build Coastguard Worker fName.printf("blur_%d_%s_%s", SkScalarRoundToInt(rad), name, quality); 47*c8dee2aaSAndroid Build Coastguard Worker } 48*c8dee2aaSAndroid Build Coastguard Worker } 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker protected: onGetName()51*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { 52*c8dee2aaSAndroid Build Coastguard Worker return fName.c_str(); 53*c8dee2aaSAndroid Build Coastguard Worker } 54*c8dee2aaSAndroid Build Coastguard Worker onDraw(int loops,SkCanvas * canvas)55*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override { 56*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 57*c8dee2aaSAndroid Build Coastguard Worker this->setupPaint(&paint); 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker paint.setAntiAlias(true); 60*c8dee2aaSAndroid Build Coastguard Worker 61*c8dee2aaSAndroid Build Coastguard Worker SkRandom rand; 62*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < loops; i++) { 63*c8dee2aaSAndroid Build Coastguard Worker SkRect r = SkRect::MakeWH(rand.nextUScalar1() * 400, 64*c8dee2aaSAndroid Build Coastguard Worker rand.nextUScalar1() * 400); 65*c8dee2aaSAndroid Build Coastguard Worker r.offset(fRadius, fRadius); 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker if (fRadius > 0) { 68*c8dee2aaSAndroid Build Coastguard Worker paint.setMaskFilter(SkMaskFilter::MakeBlur(fStyle, 69*c8dee2aaSAndroid Build Coastguard Worker SkBlurMask::ConvertRadiusToSigma(fRadius))); 70*c8dee2aaSAndroid Build Coastguard Worker } 71*c8dee2aaSAndroid Build Coastguard Worker canvas->drawOval(r, paint); 72*c8dee2aaSAndroid Build Coastguard Worker } 73*c8dee2aaSAndroid Build Coastguard Worker } 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Worker private: 76*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = Benchmark; 77*c8dee2aaSAndroid Build Coastguard Worker }; 78*c8dee2aaSAndroid Build Coastguard Worker 79*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlurBench(MINI, kNormal_SkBlurStyle);) 80*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlurBench(MINI, kSolid_SkBlurStyle);) 81*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlurBench(MINI, kOuter_SkBlurStyle);) 82*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlurBench(MINI, kInner_SkBlurStyle);) 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlurBench(SMALL, kNormal_SkBlurStyle);) 85*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlurBench(SMALL, kSolid_SkBlurStyle);) 86*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlurBench(SMALL, kOuter_SkBlurStyle);) 87*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlurBench(SMALL, kInner_SkBlurStyle);) 88*c8dee2aaSAndroid Build Coastguard Worker 89*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlurBench(BIG, kNormal_SkBlurStyle);) 90*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlurBench(BIG, kSolid_SkBlurStyle);) 91*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlurBench(BIG, kOuter_SkBlurStyle);) 92*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlurBench(BIG, kInner_SkBlurStyle);) 93*c8dee2aaSAndroid Build Coastguard Worker 94*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlurBench(REALBIG, kNormal_SkBlurStyle);) 95*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlurBench(REALBIG, kSolid_SkBlurStyle);) 96*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlurBench(REALBIG, kOuter_SkBlurStyle);) 97*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlurBench(REALBIG, kInner_SkBlurStyle);) 98*c8dee2aaSAndroid Build Coastguard Worker 99*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlurBench(REAL, kNormal_SkBlurStyle);) 100*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlurBench(REAL, kSolid_SkBlurStyle);) 101*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlurBench(REAL, kOuter_SkBlurStyle);) 102*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlurBench(REAL, kInner_SkBlurStyle);) 103*c8dee2aaSAndroid Build Coastguard Worker 104*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlurBench(0, kNormal_SkBlurStyle);) 105