blob: c670eb2d9f6af4d37d6d4ba22cf616a6cf6a7a31 [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)
17#define REAL SkFloatToScalar(1.5f)
18#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 {
44 fName.printf("morph_%d_%s", SkScalarRound(rad), name);
45 }
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
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000053 virtual void onDraw(SkCanvas* canvas) {
54 SkPaint paint;
55 this->setupPaint(&paint);
56
57 paint.setAntiAlias(true);
58
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +000059 SkRandom rand;
mtklein@google.comc2897432013-09-10 19:23:38 +000060 for (int i = 0; i < this->getLoops(); 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:
rmistry@google.comfbfcd562012-08-23 18:09:54 +000069 mf = new SkDilateImageFilter(SkScalarFloorToInt(fRadius),
robertphillips@google.com4bdfb8c2012-06-12 21:23:49 +000070 SkScalarFloorToInt(fRadius));
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000071 break;
72 case kErode_MT:
rmistry@google.comfbfcd562012-08-23 18:09:54 +000073 mf = new SkErodeImageFilter(SkScalarFloorToInt(fRadius),
robertphillips@google.com4bdfb8c2012-06-12 21:23:49 +000074 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
tomhudson@google.coma0116d52012-06-11 20:48:18 +000087// Fixed point can be 100x slower than float on these tests, causing
88// bench to timeout.
89#ifndef SK_SCALAR_IS_FIXED
mtklein@google.com410e6e82013-09-13 19:52:27 +000090DEF_BENCH( return new MorphologyBench(SMALL, kErode_MT); )
91DEF_BENCH( return new MorphologyBench(SMALL, kDilate_MT); )
tomhudson@google.coma0116d52012-06-11 20:48:18 +000092
mtklein@google.com410e6e82013-09-13 19:52:27 +000093DEF_BENCH( return new MorphologyBench(BIG, kErode_MT); )
94DEF_BENCH( return new MorphologyBench(BIG, kDilate_MT); )
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000095
mtklein@google.com410e6e82013-09-13 19:52:27 +000096DEF_BENCH( return new MorphologyBench(REAL, kErode_MT); )
97DEF_BENCH( return new MorphologyBench(REAL, kDilate_MT); )
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000098
mtklein@google.com410e6e82013-09-13 19:52:27 +000099DEF_BENCH( return new MorphologyBench(0, kErode_MT); )
tomhudson@google.coma0116d52012-06-11 20:48:18 +0000100#endif