/*
 * Copyright 2016 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 "SkCanvas.h"
#include "SkMaskFilter.h"
#include "SkPaint.h"
#include "SkRRect.h"
#include "SkRect.h"
#include "sk_tool_utils.h"

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

    const char* onGetName() override {
        return "bluroccludedrrect";
    }

    SkIPoint onGetSize() override {
        return SkIPoint::Make(1024, 2048);
    }

    void onDraw(int loops, SkCanvas* canvas) override {
        for (int l = 0; l < loops; ++l) {
            SkPaint opaque;
            opaque.setAntiAlias(true);
            opaque.setColor(SK_ColorWHITE);

            const SkRect r = SkRect::MakeWH(480, 230);
            const SkRRect rr = SkRRect::MakeRectXY(r, 8, 8);
            SkRect occRect = sk_tool_utils::compute_central_occluder(rr);

            for (int i = 0; i < 2; ++i) {
                canvas->save();

                canvas->translate(i*502.0f+20, 10.0f);

                for (int j = 0; j < 8; ++j) {
                    canvas->save();

                        canvas->translate(0.0f, j*256.0f);

                        SkPaint firstBlur;
                        firstBlur.setAntiAlias(true);
                        firstBlur.setColor(0x09000000);
                        firstBlur.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle,
                                                                       2.5f,
                                                                       occRect));

                        canvas->drawRRect(rr, firstBlur);

                        canvas->save();
                            canvas->translate(1.5f, 1.5f);

                            SkPaint secondBlur;
                            secondBlur.setAntiAlias(true);
                            secondBlur.setColor(0x30000000);
                            secondBlur.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle,
                                                                            6.0f,
                                                                            occRect));

                            canvas->drawRRect(rr, secondBlur);

                        canvas->restore();

                        canvas->drawRRect(rr, opaque);

                    canvas->restore();
                }

                canvas->restore();
            }
        }
    }

private:
    typedef Benchmark INHERITED;
};

DEF_BENCH(return new BlurOccludedRRectBench();)
