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