1 /*
2  * Copyright 2016 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 
8 #include "SampleCode.h"
9 #include "SkCanvas.h"
10 #include "SkPath.h"
11 #include "SkRandom.h"
12 
13 class MegaStrokeView : public SampleView {
14 public:
MegaStrokeView()15     MegaStrokeView() {
16         fClip.set(0, 0, 950, 600);
17         fAngle = 0;
18         fPlusMinus = 0;
19         SkRandom rand;
20         fMegaPath.reset();
21         for (int index = 0; index < 921; ++index) {
22             for (int segs = 0; segs < 40; ++segs) {
23                 fMegaPath.lineTo(SkIntToScalar(index), SkIntToScalar(rand.nextRangeU(500, 600)));
24             }
25         }
26     }
27 
28 protected:
29     // overrides from SkEventSink
onQuery(SkEvent * evt)30     bool onQuery(SkEvent* evt) override {
31         if (SampleCode::TitleQ(*evt)) {
32             SampleCode::TitleR(evt, "MegaStroke");
33             return true;
34         }
35 
36         SkUnichar uni;
37         if (SampleCode::CharQ(*evt, &uni)) {
38            fClip.set(0, 0, 950, 600);
39         }
40         SkString str;
41         evt->getType(&str);
42         if (str == SkString("SampleCode_Key_Event")) {
43            fClip.set(0, 0, 950, 600);
44         }
45         return this->INHERITED::onQuery(evt);
46     }
47 
onDrawBackground(SkCanvas * canvas)48     void onDrawBackground(SkCanvas* canvas) override {
49     }
50 
onDrawContent(SkCanvas * canvas)51     void onDrawContent(SkCanvas* canvas) override {
52         SkPaint paint;
53         paint.setAntiAlias(true);
54         paint.setARGB(255,255,153,0);
55         paint.setStyle(SkPaint::kStroke_Style);
56         paint.setStrokeWidth(1);
57 
58         canvas->save();
59         canvas->clipRect(fClip);
60         canvas->clear(SK_ColorWHITE);
61         canvas->drawPath(fMegaPath, paint);
62         canvas->restore();
63 
64         SkPaint divSimPaint;
65         divSimPaint.setColor(SK_ColorBLUE);
66 	    SkScalar x = SkScalarSin(fAngle * SK_ScalarPI / 180) * 200 + 250;
67 	    SkScalar y = SkScalarCos(fAngle * SK_ScalarPI / 180) * 200 + 250;
68 
69         if ((fPlusMinus ^= 1)) {
70             fAngle += 5;
71         } else {
72             fAngle -= 5;
73         }
74         SkRect divSim = SkRect::MakeXYWH(x, y, 100, 100);
75         divSim.outset(30, 30);
76         canvas->drawRect(divSim, divSimPaint);
77         fClip = divSim;
78     }
79 
onSizeChange()80     void onSizeChange() override {
81         fClip.set(0, 0, 950, 600);
82     }
83 
onAnimate(const SkAnimTimer &)84     bool onAnimate(const SkAnimTimer& ) override {
85         return true;
86     }
87 
88 private:
89     SkPath      fMegaPath;
90     SkRect      fClip;
91     int         fAngle;
92     int         fPlusMinus;
93     typedef SampleView INHERITED;
94 };
95 
96 //////////////////////////////////////////////////////////////////////////////
97 
MyFactory()98 static SkView* MyFactory() { return new MegaStrokeView; }
99 static SkViewRegister reg(MyFactory);
100