blob: ad189548e9108bce04594c75f8a2761245075caa [file] [log] [blame]
tomhudson@google.comf2e91a32012-06-11 19:22:01 +00001/*
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 */
commit-bot@chromium.org97b4b672013-09-26 19:23:03 +00007
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#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"
Michael Ludwig23003182019-08-05 11:25:23 -040013#include "include/effects/SkImageFilters.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050014#include "include/utils/SkRandom.h"
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000015
16#define SMALL SkIntToScalar(2)
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +000017#define REAL 1.5f
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000018#define BIG SkIntToScalar(10)
19
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000020enum MorphologyType {
21 kErode_MT,
22 kDilate_MT
23};
24
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000025static const char* gStyleName[] = {
26 "erode",
27 "dilate"
28};
29
tfarinaf168b862014-06-19 12:32:29 -070030class MorphologyBench : public Benchmark {
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000031 SkScalar fRadius;
32 MorphologyType fStyle;
33 SkString fName;
34
35public:
mtklein@google.com410e6e82013-09-13 19:52:27 +000036 MorphologyBench(SkScalar rad, MorphologyType style)
37 {
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000038 fRadius = rad;
39 fStyle = style;
40 const char* name = rad > 0 ? gStyleName[style] : "none";
41 if (SkScalarFraction(rad) != 0) {
42 fName.printf("morph_%.2f_%s", SkScalarToFloat(rad), name);
43 } else {
reed@google.come1ca7052013-12-17 19:22:07 +000044 fName.printf("morph_%d_%s", SkScalarRoundToInt(rad), name);
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000045 }
46 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +000047
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000048protected:
robertphillipsfc11b0a2016-04-05 09:09:36 -070049 const char* onGetName() override {
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000050 return fName.c_str();
51 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +000052
robertphillipsfc11b0a2016-04-05 09:09:36 -070053 void onDraw(int loops, SkCanvas* canvas) override {
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000054 SkPaint paint;
55 this->setupPaint(&paint);
56
57 paint.setAntiAlias(true);
58
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +000059 SkRandom rand;
commit-bot@chromium.org33614712013-12-03 18:17:16 +000060 for (int i = 0; i < loops; i++) {
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000061 SkRect r = SkRect::MakeWH(rand.nextUScalar1() * 400,
62 rand.nextUScalar1() * 400);
63 r.offset(fRadius, fRadius);
64
65 if (fRadius > 0) {
robertphillipsfc11b0a2016-04-05 09:09:36 -070066 sk_sp<SkImageFilter> mf;
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000067 switch (fStyle) {
68 case kDilate_MT:
Michael Ludwig23003182019-08-05 11:25:23 -040069 mf = SkImageFilters::Dilate(
70 SkScalarFloorToInt(fRadius), SkScalarFloorToInt(fRadius), nullptr);
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000071 break;
72 case kErode_MT:
Michael Ludwig23003182019-08-05 11:25:23 -040073 mf = SkImageFilters::Erode(
74 SkScalarFloorToInt(fRadius), SkScalarFloorToInt(fRadius), nullptr);
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000075 break;
76 }
robertphillipsfc11b0a2016-04-05 09:09:36 -070077 paint.setImageFilter(std::move(mf));
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000078 }
79 canvas->drawOval(r, paint);
80 }
81 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +000082
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000083private:
tfarinaf168b862014-06-19 12:32:29 -070084 typedef Benchmark INHERITED;
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000085};
86
mtklein@google.com410e6e82013-09-13 19:52:27 +000087DEF_BENCH( return new MorphologyBench(SMALL, kErode_MT); )
88DEF_BENCH( return new MorphologyBench(SMALL, kDilate_MT); )
tomhudson@google.coma0116d52012-06-11 20:48:18 +000089
mtklein@google.com410e6e82013-09-13 19:52:27 +000090DEF_BENCH( return new MorphologyBench(BIG, kErode_MT); )
91DEF_BENCH( return new MorphologyBench(BIG, kDilate_MT); )
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000092
mtklein@google.com410e6e82013-09-13 19:52:27 +000093DEF_BENCH( return new MorphologyBench(REAL, kErode_MT); )
94DEF_BENCH( return new MorphologyBench(REAL, kDilate_MT); )
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000095
mtklein@google.com410e6e82013-09-13 19:52:27 +000096DEF_BENCH( return new MorphologyBench(0, kErode_MT); )