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 #include "Benchmark.h" 8 #include "SkCanvas.h" 9 #include "SkMatrixConvolutionImageFilter.h" 10 #include "SkPaint.h" 11 #include "SkRandom.h" 12 #include "SkString.h" 13 14 class MatrixConvolutionBench : public Benchmark { 15 public: MatrixConvolutionBench(SkMatrixConvolutionImageFilter::TileMode tileMode,bool convolveAlpha)16 MatrixConvolutionBench(SkMatrixConvolutionImageFilter::TileMode tileMode, bool convolveAlpha) 17 : fName("matrixconvolution") { 18 SkISize kernelSize = SkISize::Make(3, 3); 19 SkScalar kernel[9] = { 20 SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1), 21 SkIntToScalar( 1), SkIntToScalar(-7), SkIntToScalar( 1), 22 SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1), 23 }; 24 SkScalar gain = 0.3f, bias = SkIntToScalar(100); 25 SkIPoint kernelOffset = SkIPoint::Make(1, 1); 26 fFilter = SkMatrixConvolutionImageFilter::Create(kernelSize, kernel, gain, bias, kernelOffset, tileMode, convolveAlpha); 27 } 28 ~MatrixConvolutionBench()29 ~MatrixConvolutionBench() { 30 fFilter->unref(); 31 } 32 33 protected: onGetName()34 virtual const char* onGetName() { 35 return fName.c_str(); 36 } 37 onDraw(int loops,SkCanvas * canvas)38 virtual void onDraw(int loops, SkCanvas* canvas) { 39 SkPaint paint; 40 this->setupPaint(&paint); 41 paint.setAntiAlias(true); 42 SkRandom rand; 43 for (int i = 0; i < loops; i++) { 44 SkRect r = SkRect::MakeWH(rand.nextUScalar1() * 400, 45 rand.nextUScalar1() * 400); 46 paint.setImageFilter(fFilter); 47 canvas->drawOval(r, paint); 48 } 49 } 50 51 private: 52 typedef Benchmark INHERITED; 53 SkImageFilter* fFilter; 54 SkString fName; 55 }; 56 57 DEF_BENCH( return new MatrixConvolutionBench(SkMatrixConvolutionImageFilter::kClamp_TileMode, true); ) 58 DEF_BENCH( return new MatrixConvolutionBench(SkMatrixConvolutionImageFilter::kRepeat_TileMode, true); ) 59 DEF_BENCH( return new MatrixConvolutionBench(SkMatrixConvolutionImageFilter::kClampToBlack_TileMode, true); ) 60 DEF_BENCH( return new MatrixConvolutionBench(SkMatrixConvolutionImageFilter::kClampToBlack_TileMode, false); ) 61