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 10 // Reproduces https://code.google.com/p/chromium/issues/detail?id=279014 11 12 // Renders a string art shape. 13 // The particular shape rendered can be controlled by clicking horizontally, thereby 14 // generating an angle from 0 to 1. 15 16 class StringArtView : public SampleView { 17 public: 18 StringArtView() : fAngle(0.305f) {} 19 20 protected: 21 // overrides from SkEventSink 22 bool onQuery(SkEvent* evt) override { 23 if (SampleCode::TitleQ(*evt)) { 24 SampleCode::TitleR(evt, "StringArt"); 25 return true; 26 } 27 return this->INHERITED::onQuery(evt); 28 } 29 30 void onDrawContent(SkCanvas* canvas) override { 31 SkScalar angle = fAngle*SK_ScalarPI + SkScalarHalf(SK_ScalarPI); 32 33 SkPoint center = SkPoint::Make(SkScalarHalf(this->width()), SkScalarHalf(this->height())); 34 SkScalar length = 5; 35 SkScalar step = angle; 36 37 SkPath path; 38 path.moveTo(center); 39 40 while (length < (SkScalarHalf(SkMinScalar(this->width(), this->height())) - 10.f)) 41 { 42 SkPoint rp = SkPoint::Make(length*SkScalarCos(step) + center.fX, 43 length*SkScalarSin(step) + center.fY); 44 path.lineTo(rp); 45 length += angle / SkScalarHalf(SK_ScalarPI); 46 step += angle; 47 } 48 path.close(); 49 50 SkPaint paint; 51 paint.setAntiAlias(true); 52 paint.setStyle(SkPaint::kStroke_Style); 53 paint.setColor(0xFF007700); 54 55 canvas->drawPath(path, paint); 56 } 57 58 SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned) override { 59 fAngle = x/width(); 60 this->inval(NULL); 61 return NULL; 62 } 63 private: 64 65 SkScalar fAngle; 66 typedef SampleView INHERITED; 67 }; 68 69 ////////////////////////////////////////////////////////////////////////////// 70 71 static SkView* MyFactory() { return new StringArtView; } 72 static SkViewRegister reg(MyFactory); 73