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