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