/*
 * Copyright 2014 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "Benchmark.h"
#include "SkBlurImageFilter.h"
#include "SkCanvas.h"
#include "SkMergeImageFilter.h"

enum { kNumInputs = 5 };

// Exercise a blur filter connected to 5 inputs of the same merge filter.
// This bench shows an improvement in performance once cacheing of re-used
// nodes is implemented, since the DAG is no longer flattened to a tree.

class ImageFilterDAGBench : public Benchmark {
public:
    ImageFilterDAGBench() {
    }

protected:
    virtual const char* onGetName() SK_OVERRIDE {
        return "image_filter_dag";
    }

    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
        SkAutoTUnref<SkImageFilter> blur(SkBlurImageFilter::Create(20.0f, 20.0f));
        SkImageFilter* inputs[kNumInputs];
        for (int i = 0; i < kNumInputs; ++i) {
            inputs[i] = blur.get();
        }
        SkAutoTUnref<SkImageFilter> merge(SkMergeImageFilter::Create(inputs, kNumInputs));
        SkPaint paint;
        paint.setImageFilter(merge);
        SkRect rect = SkRect::Make(SkIRect::MakeWH(400, 400));
        canvas->drawRect(rect, paint);
    }

private:
    typedef Benchmark INHERITED;
};

DEF_BENCH(return new ImageFilterDAGBench;)
