15faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org/*
25faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org * Copyright 2012 Google Inc.
35faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org *
45faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be
55faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org * found in the LICENSE file.
65faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org */
7f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
85faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org#include "SkCanvas.h"
9f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "SkMatrixConvolutionImageFilter.h"
105faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org#include "SkPaint.h"
115faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org#include "SkRandom.h"
125faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org#include "SkString.h"
135faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
14f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass MatrixConvolutionBench : public Benchmark {
155faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgpublic:
16410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    MatrixConvolutionBench(SkMatrixConvolutionImageFilter::TileMode tileMode, bool convolveAlpha)
17410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com        : fName("matrixconvolution") {
185faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        SkISize kernelSize = SkISize::Make(3, 3);
195faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        SkScalar kernel[9] = {
205faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org            SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1),
215faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org            SkIntToScalar( 1), SkIntToScalar(-7), SkIntToScalar( 1),
225faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org            SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1),
235faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        };
244b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        SkScalar gain = 0.3f, bias = SkIntToScalar(100);
2584cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org        SkIPoint kernelOffset = SkIPoint::Make(1, 1);
2684cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org        fFilter = SkMatrixConvolutionImageFilter::Create(kernelSize, kernel, gain, bias, kernelOffset, tileMode, convolveAlpha);
275faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    }
285faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
295faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    ~MatrixConvolutionBench() {
305faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        fFilter->unref();
315faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    }
325faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
335faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgprotected:
345faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    virtual const char* onGetName() {
355faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        return fName.c_str();
365faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    }
375faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
383361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) {
395faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        SkPaint paint;
405faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        this->setupPaint(&paint);
415faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        paint.setAntiAlias(true);
42e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
433361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
445faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org            SkRect r = SkRect::MakeWH(rand.nextUScalar1() * 400,
455faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org                                      rand.nextUScalar1() * 400);
465faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org            paint.setImageFilter(fFilter);
475faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org            canvas->drawOval(r, paint);
485faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org        }
495faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    }
505faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
515faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgprivate:
52f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
535faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    SkMatrixConvolutionImageFilter* fFilter;
545faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    SkString fName;
555faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org};
565faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
57410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new MatrixConvolutionBench(SkMatrixConvolutionImageFilter::kClamp_TileMode, true); )
58410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new MatrixConvolutionBench(SkMatrixConvolutionImageFilter::kRepeat_TileMode, true); )
59410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new MatrixConvolutionBench(SkMatrixConvolutionImageFilter::kClampToBlack_TileMode, true); )
60410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new MatrixConvolutionBench(SkMatrixConvolutionImageFilter::kClampToBlack_TileMode, false); )
61