xref: /aosp_15_r20/external/skia/bench/MorphologyBench.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2012 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 
8 #include "bench/Benchmark.h"
9 #include "include/core/SkCanvas.h"
10 #include "include/core/SkPaint.h"
11 #include "include/core/SkShader.h"
12 #include "include/core/SkString.h"
13 #include "include/effects/SkImageFilters.h"
14 #include "src/base/SkRandom.h"
15 
16 #define SMALL   SkIntToScalar(2)
17 #define REAL    1.5f
18 #define BIG     SkIntToScalar(10)
19 
20 enum MorphologyType {
21     kErode_MT,
22     kDilate_MT
23 };
24 
25 static const char* gStyleName[] = {
26     "erode",
27     "dilate"
28 };
29 
30 class MorphologyBench : public Benchmark {
31     SkScalar       fRadius;
32     MorphologyType fStyle;
33     SkString       fName;
34 
35 public:
MorphologyBench(SkScalar rad,MorphologyType style)36     MorphologyBench(SkScalar rad, MorphologyType style) {
37         fRadius = rad;
38         fStyle = style;
39         const char* name = rad > 0 ? gStyleName[style] : "none";
40         if (SkScalarFraction(rad) != 0) {
41             fName.printf("morph_%.2f_%s", rad, name);
42         } else {
43             fName.printf("morph_%d_%s", SkScalarRoundToInt(rad), name);
44         }
45     }
46 
47 protected:
onGetName()48     const char* onGetName() override {
49         return fName.c_str();
50     }
51 
onDraw(int loops,SkCanvas * canvas)52     void onDraw(int loops, SkCanvas* canvas) override {
53         SkPaint paint;
54         this->setupPaint(&paint);
55 
56         paint.setAntiAlias(true);
57 
58         SkRandom rand;
59         for (int i = 0; i < loops; i++) {
60             SkRect r = SkRect::MakeWH(rand.nextUScalar1() * 400,
61                                       rand.nextUScalar1() * 400);
62             r.offset(fRadius, fRadius);
63 
64             if (fRadius > 0) {
65                 sk_sp<SkImageFilter> mf;
66                 switch (fStyle) {
67                 case kDilate_MT:
68                     mf = SkImageFilters::Dilate(
69                             SkScalarFloorToInt(fRadius), SkScalarFloorToInt(fRadius), nullptr);
70                     break;
71                 case kErode_MT:
72                     mf = SkImageFilters::Erode(
73                             SkScalarFloorToInt(fRadius), SkScalarFloorToInt(fRadius), nullptr);
74                     break;
75                 }
76                 paint.setImageFilter(std::move(mf));
77             }
78             canvas->drawOval(r, paint);
79         }
80     }
81 
82 private:
83     using INHERITED = Benchmark;
84 };
85 
86 DEF_BENCH( return new MorphologyBench(SMALL, kErode_MT); )
87 DEF_BENCH( return new MorphologyBench(SMALL, kDilate_MT); )
88 
89 DEF_BENCH( return new MorphologyBench(BIG, kErode_MT); )
90 DEF_BENCH( return new MorphologyBench(BIG, kDilate_MT); )
91 
92 DEF_BENCH( return new MorphologyBench(REAL, kErode_MT); )
93 DEF_BENCH( return new MorphologyBench(REAL, kDilate_MT); )
94 
95 DEF_BENCH( return new MorphologyBench(0, kErode_MT); )
96