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