blob: 2121e865f081f8ce5107e432bdd43ef629cbb025 [file] [log] [blame]
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +00001/*
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 */
Mike Kleinc0bd9f92019-04-23 12:05:21 -05007#include "bench/Benchmark.h"
8#include "include/core/SkCanvas.h"
9#include "include/core/SkPaint.h"
10#include "include/core/SkString.h"
Michael Ludwig23003182019-08-05 11:25:23 -040011#include "include/core/SkTileMode.h"
12#include "include/effects/SkImageFilters.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050013#include "include/utils/SkRandom.h"
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000014
Michael Ludwig23003182019-08-05 11:25:23 -040015#include "tools/ToolUtils.h"
mtklein20efb412016-04-12 15:52:52 -070016
tfarinaf168b862014-06-19 12:32:29 -070017class MatrixConvolutionBench : public Benchmark {
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000018public:
Michael Ludwig23003182019-08-05 11:25:23 -040019 MatrixConvolutionBench(SkTileMode tileMode, bool convolveAlpha)
mtklein20efb412016-04-12 15:52:52 -070020 : fName(SkStringPrintf("matrixconvolution_%s%s",
Michael Ludwig23003182019-08-05 11:25:23 -040021 ToolUtils::tilemode_name(tileMode),
mtklein20efb412016-04-12 15:52:52 -070022 convolveAlpha ? "" : "_noConvolveAlpha")) {
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000023 SkISize kernelSize = SkISize::Make(3, 3);
24 SkScalar kernel[9] = {
25 SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1),
26 SkIntToScalar( 1), SkIntToScalar(-7), SkIntToScalar( 1),
27 SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1),
28 };
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +000029 SkScalar gain = 0.3f, bias = SkIntToScalar(100);
commit-bot@chromium.org84cd0992014-03-12 16:36:08 +000030 SkIPoint kernelOffset = SkIPoint::Make(1, 1);
Michael Ludwig23003182019-08-05 11:25:23 -040031 fFilter = SkImageFilters::MatrixConvolution(kernelSize, kernel, gain, bias,
32 kernelOffset, tileMode, convolveAlpha, nullptr);
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000033 }
34
35protected:
Michael Ludwig23003182019-08-05 11:25:23 -040036 const char* onGetName() override {
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000037 return fName.c_str();
38 }
39
Michael Ludwig23003182019-08-05 11:25:23 -040040 void onDraw(int loops, SkCanvas* canvas) override {
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000041 SkPaint paint;
42 this->setupPaint(&paint);
Michael Ludwig23003182019-08-05 11:25:23 -040043 paint.setImageFilter(fFilter);
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000044 paint.setAntiAlias(true);
Michael Ludwig23003182019-08-05 11:25:23 -040045
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +000046 SkRandom rand;
commit-bot@chromium.org33614712013-12-03 18:17:16 +000047 for (int i = 0; i < loops; i++) {
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000048 SkRect r = SkRect::MakeWH(rand.nextUScalar1() * 400,
49 rand.nextUScalar1() * 400);
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000050 canvas->drawOval(r, paint);
51 }
52 }
53
54private:
robertphillipsef6a47b2016-04-08 08:01:20 -070055 sk_sp<SkImageFilter> fFilter;
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000056 SkString fName;
robertphillipsef6a47b2016-04-08 08:01:20 -070057
58 typedef Benchmark INHERITED;
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000059};
60
Michael Ludwig23003182019-08-05 11:25:23 -040061DEF_BENCH( return new MatrixConvolutionBench(SkTileMode::kClamp, true); )
62DEF_BENCH( return new MatrixConvolutionBench(SkTileMode::kRepeat, true); )
63DEF_BENCH( return new MatrixConvolutionBench(SkTileMode::kMirror, true); )
64DEF_BENCH( return new MatrixConvolutionBench(SkTileMode::kDecal, true); )
65DEF_BENCH( return new MatrixConvolutionBench(SkTileMode::kDecal, false); )