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

#include "bench/Benchmark.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkPaint.h"
#include "include/utils/SkRandom.h"

/**
 * Draws full screen opaque rectangles. It is designed to test any optimizations in the GPU backend
 * to turn such draws into clears.
 */
class FSRectBench : public Benchmark {
public:
    FSRectBench() : fInit(false) { }

protected:
    const char* onGetName() override { return "fullscreen_rects"; }

    void onDelayedSetup() override {
        if (!fInit) {
            SkRandom rand;
            static const SkScalar kMinOffset = 0;
            static const SkScalar kMaxOffset = 100 * SK_Scalar1;
            static const SkScalar kOffsetRange = kMaxOffset - kMinOffset;
            for (int i = 0; i < N; ++i) {
                fRects[i].fLeft = -kMinOffset - rand.nextUScalar1() * kOffsetRange;
                fRects[i].fTop = -kMinOffset - rand.nextUScalar1() * kOffsetRange;
                fRects[i].fRight = W + kMinOffset + rand.nextUScalar1() * kOffsetRange;
                fRects[i].fBottom = H + kMinOffset + rand.nextUScalar1() * kOffsetRange;
                fColors[i] = rand.nextU() | 0xFF000000;
            }
            fInit = true;
        }
    }

    void onDraw(int loops, SkCanvas* canvas) override {
        SkPaint paint;
        for (int i = 0; i < loops; ++i) {
            paint.setColor(fColors[i % N]);
            canvas->drawRect(fRects[i % N], paint);
        }
    }

private:
    enum {
        W = 640,
        H = 480,
        N = 300,
    };
    SkRect  fRects[N];
    SkColor fColors[N];
    bool fInit;

    typedef Benchmark INHERITED;
};

DEF_BENCH(return new FSRectBench();)
