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