SampleManyRects.cpp revision f059900f75639f1b1a03f2c25333ef9aa22d58b8
1d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com
2d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com/*
3d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com * Copyright 2013 Google Inc.
4d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com *
5d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com * Use of this source code is governed by a BSD-style license that can be
6d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com * found in the LICENSE file.
7d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com */
8d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com#include "SampleCode.h"
9d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com#include "SkCanvas.h"
10d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com#include "SkDevice.h"
11d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com#include "SkPaint.h"
12d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com#include "SkRandom.h"
13d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com#include "SkShader.h"
14d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com#include "SkView.h"
15d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com
16d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com/**
17d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com * Animated sample used to develop batched rect implementation in GrInOrderDrawBuffer.
18d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com */
19d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.comclass ManyRectsView : public SampleView {
20d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.comprivate:
21d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com    enum {
22d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com        N = 1000,
23d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com    };
24d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com
25d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.compublic:
26d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com    ManyRectsView() {}
27d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com
28d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.comprotected:
2936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool onQuery(SkEvent* evt) override {
30d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com        if (SampleCode::TitleQ(*evt)) {
31d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com            SampleCode::TitleR(evt, "ManyRects");
32d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com            return true;
33d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com        }
34d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com        return this->INHERITED::onQuery(evt);
35d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com    }
36d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com
37f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    void onDrawContent(SkCanvas* canvas) override {
38d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com        SkISize dsize = canvas->getDeviceSize();
39d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com        canvas->clear(0xFFF0E0F0);
40d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com
41d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com        for (int i = 0; i < N; ++i) {
42d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com            SkRect rect = SkRect::MakeWH(SkIntToScalar(fRandom.nextRangeU(10, 100)),
43d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com                                         SkIntToScalar(fRandom.nextRangeU(10, 100)));
44d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com            int x = fRandom.nextRangeU(0, dsize.fWidth);
45d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com            int y = fRandom.nextRangeU(0, dsize.fHeight);
46d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com            canvas->save();
47d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com
48d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com            canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
49d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com            // Rotation messes up the GPU batching because of the clip below. We don't notice
50d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com            // that the rect is inside the clip so the clip changes interrupt batching.
51d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com            if (false) {
52d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com                SkMatrix rotate;
53d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com                rotate.setRotate(fRandom.nextUScalar1() * 360,
54d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com                                 SkIntToScalar(x) + SkScalarHalf(rect.fRight),
55d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com                                 SkIntToScalar(y) + SkScalarHalf(rect.fBottom));
56d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com                canvas->concat(rotate);
57d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com            }
58d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com            SkRect clipRect = rect;
59d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com            // This clip will always contain the entire rect. It's here to give the GPU batching
60d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com            // code a little more challenge.
61d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com            clipRect.outset(10, 10);
62d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com            canvas->clipRect(clipRect);
63d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com            SkPaint paint;
64d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com            paint.setColor(fRandom.nextU());
65d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com            canvas->drawRect(rect, paint);
66d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com            canvas->restore();
67d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com        }
68d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com        this->inval(NULL);
69d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com    }
70d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com
71d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.comprivate:
72e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org    SkRandom fRandom;
73d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com    typedef SampleView INHERITED;
74d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com};
75d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com
76d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com//////////////////////////////////////////////////////////////////////////////
77d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com
78d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.comstatic SkView* MyFactory() { return new ManyRectsView; }
79d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.comstatic SkViewRegister reg(MyFactory);
80