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