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 #include "bench/Benchmark.h" 8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTileMode.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkImageFilters.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkRandom.h" 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker #include "tools/ToolUtils.h" 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker class MatrixConvolutionBench : public Benchmark { 18*c8dee2aaSAndroid Build Coastguard Worker public: MatrixConvolutionBench(bool bigKernel,SkTileMode tileMode,bool convolveAlpha)19*c8dee2aaSAndroid Build Coastguard Worker MatrixConvolutionBench(bool bigKernel, SkTileMode tileMode, bool convolveAlpha) 20*c8dee2aaSAndroid Build Coastguard Worker : fName(SkStringPrintf("matrixconvolution_%s%s%s", 21*c8dee2aaSAndroid Build Coastguard Worker bigKernel ? "bigKernel_" : "", 22*c8dee2aaSAndroid Build Coastguard Worker ToolUtils::tilemode_name(tileMode), 23*c8dee2aaSAndroid Build Coastguard Worker convolveAlpha ? "" : "_noConvolveAlpha")) { 24*c8dee2aaSAndroid Build Coastguard Worker if (bigKernel) { 25*c8dee2aaSAndroid Build Coastguard Worker SkISize kernelSize = SkISize::Make(9, 9); 26*c8dee2aaSAndroid Build Coastguard Worker SkScalar kernel[81]; 27*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < 81; i++) { 28*c8dee2aaSAndroid Build Coastguard Worker kernel[i] = SkIntToScalar(1); 29*c8dee2aaSAndroid Build Coastguard Worker } 30*c8dee2aaSAndroid Build Coastguard Worker kernel[40] = SkIntToScalar(-79); 31*c8dee2aaSAndroid Build Coastguard Worker SkScalar gain = 0.3f, bias = SkIntToScalar(100); 32*c8dee2aaSAndroid Build Coastguard Worker SkIPoint kernelOffset = SkIPoint::Make(4, 4); 33*c8dee2aaSAndroid Build Coastguard Worker fFilter = SkImageFilters::MatrixConvolution(kernelSize, kernel, gain, bias, 34*c8dee2aaSAndroid Build Coastguard Worker kernelOffset, tileMode, convolveAlpha, 35*c8dee2aaSAndroid Build Coastguard Worker nullptr); 36*c8dee2aaSAndroid Build Coastguard Worker } else { 37*c8dee2aaSAndroid Build Coastguard Worker SkISize kernelSize = SkISize::Make(3, 3); 38*c8dee2aaSAndroid Build Coastguard Worker SkScalar kernel[9] = { 39*c8dee2aaSAndroid Build Coastguard Worker SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1), 40*c8dee2aaSAndroid Build Coastguard Worker SkIntToScalar( 1), SkIntToScalar(-7), SkIntToScalar( 1), 41*c8dee2aaSAndroid Build Coastguard Worker SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1), 42*c8dee2aaSAndroid Build Coastguard Worker }; 43*c8dee2aaSAndroid Build Coastguard Worker SkScalar gain = 0.3f, bias = SkIntToScalar(100); 44*c8dee2aaSAndroid Build Coastguard Worker SkIPoint kernelOffset = SkIPoint::Make(1, 1); 45*c8dee2aaSAndroid Build Coastguard Worker fFilter = SkImageFilters::MatrixConvolution(kernelSize, kernel, gain, bias, 46*c8dee2aaSAndroid Build Coastguard Worker kernelOffset, tileMode, convolveAlpha, 47*c8dee2aaSAndroid Build Coastguard Worker nullptr); 48*c8dee2aaSAndroid Build Coastguard Worker } 49*c8dee2aaSAndroid Build Coastguard Worker } 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker protected: onGetName()52*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { 53*c8dee2aaSAndroid Build Coastguard Worker return fName.c_str(); 54*c8dee2aaSAndroid Build Coastguard Worker } 55*c8dee2aaSAndroid Build Coastguard Worker onDraw(int loops,SkCanvas * canvas)56*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override { 57*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 58*c8dee2aaSAndroid Build Coastguard Worker this->setupPaint(&paint); 59*c8dee2aaSAndroid Build Coastguard Worker paint.setImageFilter(fFilter); 60*c8dee2aaSAndroid Build Coastguard Worker paint.setAntiAlias(true); 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker SkRandom rand; 63*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < loops; i++) { 64*c8dee2aaSAndroid Build Coastguard Worker SkRect r = SkRect::MakeWH(rand.nextUScalar1() * 400, 65*c8dee2aaSAndroid Build Coastguard Worker rand.nextUScalar1() * 400); 66*c8dee2aaSAndroid Build Coastguard Worker canvas->drawOval(r, paint); 67*c8dee2aaSAndroid Build Coastguard Worker } 68*c8dee2aaSAndroid Build Coastguard Worker } 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker private: 71*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImageFilter> fFilter; 72*c8dee2aaSAndroid Build Coastguard Worker SkString fName; 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = Benchmark; 75*c8dee2aaSAndroid Build Coastguard Worker }; 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new MatrixConvolutionBench(false, SkTileMode::kClamp, true); ) 78*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new MatrixConvolutionBench(false, SkTileMode::kRepeat, true); ) 79*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new MatrixConvolutionBench(false, SkTileMode::kMirror, true); ) 80*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new MatrixConvolutionBench(false, SkTileMode::kDecal, true); ) 81*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new MatrixConvolutionBench(false, SkTileMode::kDecal, false); ) 82*c8dee2aaSAndroid Build Coastguard Worker 83*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new MatrixConvolutionBench(true, SkTileMode::kClamp, true); ) 84*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new MatrixConvolutionBench(true, SkTileMode::kRepeat, true); ) 85*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new MatrixConvolutionBench(true, SkTileMode::kMirror, true); ) 86*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new MatrixConvolutionBench(true, SkTileMode::kDecal, true); ) 87*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new MatrixConvolutionBench(true, SkTileMode::kDecal, false); ) 88