1
2/*
3 * Copyright 2013 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9#include "Benchmark.h"
10#include "SkCanvas.h"
11#include "SkPaint.h"
12#include "SkRandom.h"
13
14/**
15 * Draws full screen opaque rectangles. It is designed to test any optimizations in the GPU backend
16 * to turn such draws into clears.
17 */
18class FSRectBench : public Benchmark {
19public:
20    FSRectBench() : fInit(false) { }
21
22protected:
23    virtual const char* onGetName() SK_OVERRIDE { return "fullscreen_rects"; }
24
25    virtual void onPreDraw() SK_OVERRIDE {
26        if (!fInit) {
27            SkRandom rand;
28            static const SkScalar kMinOffset = 0;
29            static const SkScalar kMaxOffset = 100 * SK_Scalar1;
30            static const SkScalar kOffsetRange = kMaxOffset - kMinOffset;
31            for (int i = 0; i < N; ++i) {
32                fRects[i].fLeft = -kMinOffset - SkScalarMul(rand.nextUScalar1(), kOffsetRange);
33                fRects[i].fTop = -kMinOffset - SkScalarMul(rand.nextUScalar1(), kOffsetRange);
34                fRects[i].fRight = W + kMinOffset + SkScalarMul(rand.nextUScalar1(), kOffsetRange);
35                fRects[i].fBottom = H + kMinOffset + SkScalarMul(rand.nextUScalar1(), kOffsetRange);
36                fColors[i] = rand.nextU() | 0xFF000000;
37            }
38            fInit = true;
39        }
40    }
41
42    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
43        SkPaint paint;
44        for (int i = 0; i < loops; ++i) {
45            paint.setColor(fColors[i % N]);
46            canvas->drawRect(fRects[i % N], paint);
47        }
48    }
49
50private:
51    enum {
52        W = 640,
53        H = 480,
54        N = 300,
55    };
56    SkRect  fRects[N];
57    SkColor fColors[N];
58    bool fInit;
59
60    typedef Benchmark INHERITED;
61};
62
63DEF_BENCH( return SkNEW_ARGS(FSRectBench, ()); )
64