170e6d6074a482fb791b9a147f471670be54a0d95caryclark/*
270e6d6074a482fb791b9a147f471670be54a0d95caryclark * Copyright 2016 Google Inc.
370e6d6074a482fb791b9a147f471670be54a0d95caryclark *
470e6d6074a482fb791b9a147f471670be54a0d95caryclark * Use of this source code is governed by a BSD-style license that can be
570e6d6074a482fb791b9a147f471670be54a0d95caryclark * found in the LICENSE file.
670e6d6074a482fb791b9a147f471670be54a0d95caryclark */
770e6d6074a482fb791b9a147f471670be54a0d95caryclark
870e6d6074a482fb791b9a147f471670be54a0d95caryclark#include "SampleCode.h"
970e6d6074a482fb791b9a147f471670be54a0d95caryclark#include "SkCanvas.h"
1070e6d6074a482fb791b9a147f471670be54a0d95caryclark#include "SkPath.h"
1170e6d6074a482fb791b9a147f471670be54a0d95caryclark#include "SkRandom.h"
1270e6d6074a482fb791b9a147f471670be54a0d95caryclark
1370e6d6074a482fb791b9a147f471670be54a0d95caryclarkclass MegaStrokeView : public SampleView {
1470e6d6074a482fb791b9a147f471670be54a0d95caryclarkpublic:
1570e6d6074a482fb791b9a147f471670be54a0d95caryclark    MegaStrokeView() {
1670e6d6074a482fb791b9a147f471670be54a0d95caryclark        fClip.set(0, 0, 950, 600);
1770e6d6074a482fb791b9a147f471670be54a0d95caryclark        fAngle = 0;
1870e6d6074a482fb791b9a147f471670be54a0d95caryclark        fPlusMinus = 0;
1970e6d6074a482fb791b9a147f471670be54a0d95caryclark        SkRandom rand;
2070e6d6074a482fb791b9a147f471670be54a0d95caryclark        fMegaPath.reset();
2170e6d6074a482fb791b9a147f471670be54a0d95caryclark        for (int index = 0; index < 921; ++index) {
2270e6d6074a482fb791b9a147f471670be54a0d95caryclark            for (int segs = 0; segs < 40; ++segs) {
2370e6d6074a482fb791b9a147f471670be54a0d95caryclark                fMegaPath.lineTo(SkIntToScalar(index), SkIntToScalar(rand.nextRangeU(500, 600)));
2470e6d6074a482fb791b9a147f471670be54a0d95caryclark            }
2570e6d6074a482fb791b9a147f471670be54a0d95caryclark        }
2670e6d6074a482fb791b9a147f471670be54a0d95caryclark    }
2770e6d6074a482fb791b9a147f471670be54a0d95caryclark
2870e6d6074a482fb791b9a147f471670be54a0d95caryclarkprotected:
2970e6d6074a482fb791b9a147f471670be54a0d95caryclark    // overrides from SkEventSink
3070e6d6074a482fb791b9a147f471670be54a0d95caryclark    bool onQuery(SkEvent* evt) override {
3170e6d6074a482fb791b9a147f471670be54a0d95caryclark        if (SampleCode::TitleQ(*evt)) {
3270e6d6074a482fb791b9a147f471670be54a0d95caryclark            SampleCode::TitleR(evt, "MegaStroke");
3370e6d6074a482fb791b9a147f471670be54a0d95caryclark            return true;
3470e6d6074a482fb791b9a147f471670be54a0d95caryclark        }
3570e6d6074a482fb791b9a147f471670be54a0d95caryclark
3670e6d6074a482fb791b9a147f471670be54a0d95caryclark        SkUnichar uni;
3770e6d6074a482fb791b9a147f471670be54a0d95caryclark        if (SampleCode::CharQ(*evt, &uni)) {
3870e6d6074a482fb791b9a147f471670be54a0d95caryclark           fClip.set(0, 0, 950, 600);
3970e6d6074a482fb791b9a147f471670be54a0d95caryclark        }
408ceee43de49b314fff58852c2d89ed3885ae71eeBrian Osman        if (evt->isType("SampleCode_Key_Event")) {
4170e6d6074a482fb791b9a147f471670be54a0d95caryclark           fClip.set(0, 0, 950, 600);
4270e6d6074a482fb791b9a147f471670be54a0d95caryclark        }
4370e6d6074a482fb791b9a147f471670be54a0d95caryclark        return this->INHERITED::onQuery(evt);
4470e6d6074a482fb791b9a147f471670be54a0d95caryclark    }
4570e6d6074a482fb791b9a147f471670be54a0d95caryclark
4670e6d6074a482fb791b9a147f471670be54a0d95caryclark    void onDrawBackground(SkCanvas* canvas) override {
4770e6d6074a482fb791b9a147f471670be54a0d95caryclark    }
4870e6d6074a482fb791b9a147f471670be54a0d95caryclark
4970e6d6074a482fb791b9a147f471670be54a0d95caryclark    void onDrawContent(SkCanvas* canvas) override {
5070e6d6074a482fb791b9a147f471670be54a0d95caryclark        SkPaint paint;
5170e6d6074a482fb791b9a147f471670be54a0d95caryclark        paint.setAntiAlias(true);
5270e6d6074a482fb791b9a147f471670be54a0d95caryclark        paint.setARGB(255,255,153,0);
5370e6d6074a482fb791b9a147f471670be54a0d95caryclark        paint.setStyle(SkPaint::kStroke_Style);
5470e6d6074a482fb791b9a147f471670be54a0d95caryclark        paint.setStrokeWidth(1);
5570e6d6074a482fb791b9a147f471670be54a0d95caryclark
5670e6d6074a482fb791b9a147f471670be54a0d95caryclark        canvas->save();
5770e6d6074a482fb791b9a147f471670be54a0d95caryclark        canvas->clipRect(fClip);
5870e6d6074a482fb791b9a147f471670be54a0d95caryclark        canvas->clear(SK_ColorWHITE);
5970e6d6074a482fb791b9a147f471670be54a0d95caryclark        canvas->drawPath(fMegaPath, paint);
6070e6d6074a482fb791b9a147f471670be54a0d95caryclark        canvas->restore();
6170e6d6074a482fb791b9a147f471670be54a0d95caryclark
6270e6d6074a482fb791b9a147f471670be54a0d95caryclark        SkPaint divSimPaint;
6370e6d6074a482fb791b9a147f471670be54a0d95caryclark        divSimPaint.setColor(SK_ColorBLUE);
6470e6d6074a482fb791b9a147f471670be54a0d95caryclark	    SkScalar x = SkScalarSin(fAngle * SK_ScalarPI / 180) * 200 + 250;
6570e6d6074a482fb791b9a147f471670be54a0d95caryclark	    SkScalar y = SkScalarCos(fAngle * SK_ScalarPI / 180) * 200 + 250;
6670e6d6074a482fb791b9a147f471670be54a0d95caryclark
6770e6d6074a482fb791b9a147f471670be54a0d95caryclark        if ((fPlusMinus ^= 1)) {
6870e6d6074a482fb791b9a147f471670be54a0d95caryclark            fAngle += 5;
6970e6d6074a482fb791b9a147f471670be54a0d95caryclark        } else {
7070e6d6074a482fb791b9a147f471670be54a0d95caryclark            fAngle -= 5;
7170e6d6074a482fb791b9a147f471670be54a0d95caryclark        }
7270e6d6074a482fb791b9a147f471670be54a0d95caryclark        SkRect divSim = SkRect::MakeXYWH(x, y, 100, 100);
7370e6d6074a482fb791b9a147f471670be54a0d95caryclark        divSim.outset(30, 30);
7470e6d6074a482fb791b9a147f471670be54a0d95caryclark        canvas->drawRect(divSim, divSimPaint);
7570e6d6074a482fb791b9a147f471670be54a0d95caryclark        fClip = divSim;
7670e6d6074a482fb791b9a147f471670be54a0d95caryclark    }
7770e6d6074a482fb791b9a147f471670be54a0d95caryclark
7870e6d6074a482fb791b9a147f471670be54a0d95caryclark    void onSizeChange() override {
7970e6d6074a482fb791b9a147f471670be54a0d95caryclark        fClip.set(0, 0, 950, 600);
8070e6d6074a482fb791b9a147f471670be54a0d95caryclark    }
8170e6d6074a482fb791b9a147f471670be54a0d95caryclark
8270e6d6074a482fb791b9a147f471670be54a0d95caryclark    bool onAnimate(const SkAnimTimer& ) override {
8370e6d6074a482fb791b9a147f471670be54a0d95caryclark        return true;
8470e6d6074a482fb791b9a147f471670be54a0d95caryclark    }
8570e6d6074a482fb791b9a147f471670be54a0d95caryclark
8670e6d6074a482fb791b9a147f471670be54a0d95caryclarkprivate:
8770e6d6074a482fb791b9a147f471670be54a0d95caryclark    SkPath      fMegaPath;
8870e6d6074a482fb791b9a147f471670be54a0d95caryclark    SkRect      fClip;
8970e6d6074a482fb791b9a147f471670be54a0d95caryclark    int         fAngle;
9070e6d6074a482fb791b9a147f471670be54a0d95caryclark    int         fPlusMinus;
9170e6d6074a482fb791b9a147f471670be54a0d95caryclark    typedef SampleView INHERITED;
9270e6d6074a482fb791b9a147f471670be54a0d95caryclark};
9370e6d6074a482fb791b9a147f471670be54a0d95caryclark
9470e6d6074a482fb791b9a147f471670be54a0d95caryclark//////////////////////////////////////////////////////////////////////////////
9570e6d6074a482fb791b9a147f471670be54a0d95caryclark
9670e6d6074a482fb791b9a147f471670be54a0d95caryclarkstatic SkView* MyFactory() { return new MegaStrokeView; }
9770e6d6074a482fb791b9a147f471670be54a0d95caryclarkstatic SkViewRegister reg(MyFactory);
98