15d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com/*
25d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com * Copyright 2013 Google Inc.
35d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com *
45d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com * Use of this source code is governed by a BSD-style license that can be
55d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com * found in the LICENSE file.
65d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com */
75d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
95d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com#include "SkBlurImageFilter.h"
105d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com#include "SkCanvas.h"
115d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com#include "SkPaint.h"
125d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com#include "SkRandom.h"
135d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com#include "SkShader.h"
145d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com#include "SkString.h"
155d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com
165d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com#define FILTER_WIDTH_SMALL  32
175d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com#define FILTER_HEIGHT_SMALL 32
185d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com#define FILTER_WIDTH_LARGE  256
195d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com#define FILTER_HEIGHT_LARGE 256
205acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt#define BLUR_SIGMA_MINI     0.5f
214b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org#define BLUR_SIGMA_SMALL    1.0f
224b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org#define BLUR_SIGMA_LARGE    10.0f
23c45ece5f7f53e2d1dacfe71d407ff495dfdc0f58commit-bot@chromium.org#define BLUR_SIGMA_HUGE     80.0f
245d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com
25f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass BlurImageFilterBench : public Benchmark {
265d71adf4b187b41858139675a499a704af15b2cbsugoi@google.compublic:
27410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    BlurImageFilterBench(SkScalar sigmaX, SkScalar sigmaY,  bool small) :
28410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com        fIsSmall(small), fInitialized(false), fSigmaX(sigmaX), fSigmaY(sigmaY) {
295d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com        fName.printf("blur_image_filter_%s_%.2f_%.2f", fIsSmall ? "small" : "large",
305d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com            SkScalarToFloat(sigmaX), SkScalarToFloat(sigmaY));
315d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com    }
325d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com
335d71adf4b187b41858139675a499a704af15b2cbsugoi@google.comprotected:
345d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com    virtual const char* onGetName() SK_OVERRIDE {
355d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com        return fName.c_str();
365d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com    }
375d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com
385d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com    virtual void onPreDraw() SK_OVERRIDE {
395d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com        if (!fInitialized) {
405d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com            make_checkerboard();
415d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com            fInitialized = true;
425d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com        }
435d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com    }
445d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com
453361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
465d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com        SkPaint paint;
47cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        paint.setImageFilter(SkBlurImageFilter::Create(fSigmaX, fSigmaY))->unref();
48c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com
493361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
50c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com            canvas->drawBitmap(fCheckerboard, 0, 0, &paint);
51c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com        }
525d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com    }
535d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com
545d71adf4b187b41858139675a499a704af15b2cbsugoi@google.comprivate:
555d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com    void make_checkerboard() {
565d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com        const int w = fIsSmall ? FILTER_WIDTH_SMALL : FILTER_WIDTH_LARGE;
575d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com        const int h = fIsSmall ? FILTER_HEIGHT_LARGE : FILTER_HEIGHT_LARGE;
586c22573edb234ad14df947278cfed010669a39a7reed        fCheckerboard.allocN32Pixels(w, h);
596c22573edb234ad14df947278cfed010669a39a7reed        SkCanvas canvas(fCheckerboard);
605d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com        canvas.clear(0x00000000);
615d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com        SkPaint darkPaint;
625d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com        darkPaint.setColor(0xFF804020);
635d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com        SkPaint lightPaint;
645d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com        lightPaint.setColor(0xFF244484);
655d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com        for (int y = 0; y < h; y += 16) {
665d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com            for (int x = 0; x < w; x += 16) {
675d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com                canvas.save();
685d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com                canvas.translate(SkIntToScalar(x), SkIntToScalar(y));
695d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com                canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint);
705d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com                canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint);
715d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com                canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint);
725d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com                canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint);
735d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com                canvas.restore();
745d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com            }
755d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com        }
765d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com    }
775d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com
785d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com    SkString fName;
795d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com    bool fIsSmall;
805d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com    bool fInitialized;
815d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com    SkBitmap fCheckerboard;
825d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com    SkScalar fSigmaX, fSigmaY;
83f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
845d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com};
855d71adf4b187b41858139675a499a704af15b2cbsugoi@google.com
8627eec46d6925afc76c2241c6b3182ce9b3284c9esenorblanco@chromium.orgDEF_BENCH(return new BlurImageFilterBench(BLUR_SIGMA_LARGE, 0, false);)
8727eec46d6925afc76c2241c6b3182ce9b3284c9esenorblanco@chromium.orgDEF_BENCH(return new BlurImageFilterBench(BLUR_SIGMA_SMALL, 0, false);)
8827eec46d6925afc76c2241c6b3182ce9b3284c9esenorblanco@chromium.orgDEF_BENCH(return new BlurImageFilterBench(0, BLUR_SIGMA_LARGE, false);)
8927eec46d6925afc76c2241c6b3182ce9b3284c9esenorblanco@chromium.orgDEF_BENCH(return new BlurImageFilterBench(0, BLUR_SIGMA_SMALL, false);)
905acfea789d39106dbc706c6ee85cd8f027fce3edjoshualittDEF_BENCH(return new BlurImageFilterBench(BLUR_SIGMA_MINI, BLUR_SIGMA_MINI, true);)
915acfea789d39106dbc706c6ee85cd8f027fce3edjoshualittDEF_BENCH(return new BlurImageFilterBench(BLUR_SIGMA_MINI, BLUR_SIGMA_MINI, false);)
92410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new BlurImageFilterBench(BLUR_SIGMA_SMALL, BLUR_SIGMA_SMALL, true);)
93410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new BlurImageFilterBench(BLUR_SIGMA_SMALL, BLUR_SIGMA_SMALL, false);)
94410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new BlurImageFilterBench(BLUR_SIGMA_LARGE, BLUR_SIGMA_LARGE, true);)
95410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new BlurImageFilterBench(BLUR_SIGMA_LARGE, BLUR_SIGMA_LARGE, false);)
96c45ece5f7f53e2d1dacfe71d407ff495dfdc0f58commit-bot@chromium.orgDEF_BENCH(return new BlurImageFilterBench(BLUR_SIGMA_HUGE, BLUR_SIGMA_HUGE, true);)
97c45ece5f7f53e2d1dacfe71d407ff495dfdc0f58commit-bot@chromium.orgDEF_BENCH(return new BlurImageFilterBench(BLUR_SIGMA_HUGE, BLUR_SIGMA_HUGE, false);)
98