• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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         this->inval(nullptr);
66     }
67 
68 private:
69     SkRandom fRandom;
70     typedef SampleView INHERITED;
71 };
72 
73 //////////////////////////////////////////////////////////////////////////////
74 
MyFactory()75 static SkView* MyFactory() { return new ManyRectsView; }
76 static SkViewRegister reg(MyFactory);
77