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