blob: d042e6d3e64e54e8b5d14036ccfa6502fea64521 [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 */
7#include "SkBenchmark.h"
8#include "SkCanvas.h"
9#include "SkPaint.h"
10#include "SkRandom.h"
11#include "SkShader.h"
12#include "SkString.h"
13#include "SkMorphologyImageFilter.h"
14
15#define SMALL SkIntToScalar(2)
16#define REAL SkFloatToScalar(1.5f)
17#define BIG SkIntToScalar(10)
18
19namespace {
20
21enum MorphologyType {
22 kErode_MT,
23 kDilate_MT
24};
25
26}
27
28static const char* gStyleName[] = {
29 "erode",
30 "dilate"
31};
32
33class MorphologyBench : public SkBenchmark {
34 SkScalar fRadius;
35 MorphologyType fStyle;
36 SkString fName;
37
38public:
mtklein@google.com410e6e82013-09-13 19:52:27 +000039 MorphologyBench(SkScalar rad, MorphologyType style)
40 {
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000041 fRadius = rad;
42 fStyle = style;
43 const char* name = rad > 0 ? gStyleName[style] : "none";
44 if (SkScalarFraction(rad) != 0) {
45 fName.printf("morph_%.2f_%s", SkScalarToFloat(rad), name);
46 } else {
47 fName.printf("morph_%d_%s", SkScalarRound(rad), name);
48 }
49 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +000050
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000051protected:
52 virtual const char* onGetName() {
53 return fName.c_str();
54 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +000055
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000056 virtual void onDraw(SkCanvas* canvas) {
57 SkPaint paint;
58 this->setupPaint(&paint);
59
60 paint.setAntiAlias(true);
61
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +000062 SkRandom rand;
mtklein@google.comc2897432013-09-10 19:23:38 +000063 for (int i = 0; i < this->getLoops(); i++) {
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000064 SkRect r = SkRect::MakeWH(rand.nextUScalar1() * 400,
65 rand.nextUScalar1() * 400);
66 r.offset(fRadius, fRadius);
67
68 if (fRadius > 0) {
69 SkMorphologyImageFilter* mf = NULL;
70 switch (fStyle) {
71 case kDilate_MT:
rmistry@google.comfbfcd562012-08-23 18:09:54 +000072 mf = new SkDilateImageFilter(SkScalarFloorToInt(fRadius),
robertphillips@google.com4bdfb8c2012-06-12 21:23:49 +000073 SkScalarFloorToInt(fRadius));
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000074 break;
75 case kErode_MT:
rmistry@google.comfbfcd562012-08-23 18:09:54 +000076 mf = new SkErodeImageFilter(SkScalarFloorToInt(fRadius),
robertphillips@google.com4bdfb8c2012-06-12 21:23:49 +000077 SkScalarFloorToInt(fRadius));
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000078 break;
79 }
80 paint.setImageFilter(mf)->unref();
81 }
82 canvas->drawOval(r, paint);
83 }
84 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +000085
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000086private:
87 typedef SkBenchmark INHERITED;
88};
89
tomhudson@google.coma0116d52012-06-11 20:48:18 +000090// Fixed point can be 100x slower than float on these tests, causing
91// bench to timeout.
92#ifndef SK_SCALAR_IS_FIXED
mtklein@google.com410e6e82013-09-13 19:52:27 +000093DEF_BENCH( return new MorphologyBench(SMALL, kErode_MT); )
94DEF_BENCH( return new MorphologyBench(SMALL, kDilate_MT); )
tomhudson@google.coma0116d52012-06-11 20:48:18 +000095
mtklein@google.com410e6e82013-09-13 19:52:27 +000096DEF_BENCH( return new MorphologyBench(BIG, kErode_MT); )
97DEF_BENCH( return new MorphologyBench(BIG, kDilate_MT); )
tomhudson@google.comf2e91a32012-06-11 19:22:01 +000098
mtklein@google.com410e6e82013-09-13 19:52:27 +000099DEF_BENCH( return new MorphologyBench(REAL, kErode_MT); )
100DEF_BENCH( return new MorphologyBench(REAL, kDilate_MT); )
tomhudson@google.comf2e91a32012-06-11 19:22:01 +0000101
mtklein@google.com410e6e82013-09-13 19:52:27 +0000102DEF_BENCH( return new MorphologyBench(0, kErode_MT); )
tomhudson@google.coma0116d52012-06-11 20:48:18 +0000103#endif