blob: a32bca620a3288efcd1d8378fe995c9113efaf1d [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
tomhudson@google.comf2e91a32012-06-11 19:22:01 +00008#include "SkBenchmark.h"
9#include "SkCanvas.h"
10#include "SkPaint.h"
11#include "SkRandom.h"
12#include "SkShader.h"
13#include "SkString.h"
14#include "SkMorphologyImageFilter.h"
15
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
30class MorphologyBench : public SkBenchmark {
31 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:
49 virtual const char* onGetName() {
50 return fName.c_str();
51 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +000052
commit-bot@chromium.org33614712013-12-03 18:17:16 +000053 virtual void onDraw(const int loops, SkCanvas* canvas) {
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) {
66 SkMorphologyImageFilter* mf = NULL;
67 switch (fStyle) {
68 case kDilate_MT:
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000069 mf = SkDilateImageFilter::Create(SkScalarFloorToInt(fRadius),
70 SkScalarFloorToInt(fRadius));
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000071 break;
72 case kErode_MT:
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000073 mf = SkErodeImageFilter::Create(SkScalarFloorToInt(fRadius),
74 SkScalarFloorToInt(fRadius));
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000075 break;
76 }
77 paint.setImageFilter(mf)->unref();
78 }
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:
84 typedef SkBenchmark INHERITED;
85};
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); )