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 "SkBenchmark.h" 8#include "SkCanvas.h" 9#include "SkPaint.h" 10#include "SkRandom.h" 11#include "SkString.h" 12#include "SkMatrixConvolutionImageFilter.h" 13 14class MatrixConvolutionBench : public SkBenchmark { 15public: 16 MatrixConvolutionBench(void* param, SkMatrixConvolutionImageFilter::TileMode tileMode, bool convolveAlpha) 17 : INHERITED(param), 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 = SkFloatToScalar(0.3f), bias = SkIntToScalar(100); 25 SkIPoint target = SkIPoint::Make(1, 1); 26 fFilter = new SkMatrixConvolutionImageFilter(kernelSize, kernel, gain, bias, target, tileMode, convolveAlpha); 27 } 28 29 ~MatrixConvolutionBench() { 30 fFilter->unref(); 31 } 32 33protected: 34 virtual const char* onGetName() { 35 return fName.c_str(); 36 } 37 38 virtual void onDraw(SkCanvas* canvas) { 39 SkPaint paint; 40 this->setupPaint(&paint); 41 paint.setAntiAlias(true); 42 SkRandom rand; 43 for (int i = 0; i < SkBENCHLOOP(3); 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 51private: 52 typedef SkBenchmark INHERITED; 53 SkMatrixConvolutionImageFilter* fFilter; 54 SkString fName; 55}; 56 57static SkBenchmark* Fact00(void* p) { return new MatrixConvolutionBench(p, SkMatrixConvolutionImageFilter::kClamp_TileMode, true); } 58static SkBenchmark* Fact01(void* p) { return new MatrixConvolutionBench(p, SkMatrixConvolutionImageFilter::kRepeat_TileMode, true); } 59static SkBenchmark* Fact02(void* p) { return new MatrixConvolutionBench(p, SkMatrixConvolutionImageFilter::kClampToBlack_TileMode, true); } 60static SkBenchmark* Fact03(void* p) { return new MatrixConvolutionBench(p, SkMatrixConvolutionImageFilter::kClampToBlack_TileMode, false); } 61 62static BenchRegistry gReg00(Fact00); 63static BenchRegistry gReg01(Fact01); 64static BenchRegistry gReg02(Fact02); 65static BenchRegistry gReg03(Fact03); 66