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