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 "include/core/SkCanvas.h" 9 #include "include/core/SkPath.h" 10 #include "tools/viewer/ClickHandlerSlide.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 StringArtSlide : public ClickHandlerSlide { 19 public: StringArtSlide()20 StringArtSlide() : fAngle(0.305f) { fName = "StringArt"; } 21 load(SkScalar w,SkScalar h)22 void load(SkScalar w, SkScalar h) override { fSize = {w, h}; } 23 resize(SkScalar w,SkScalar h)24 void resize(SkScalar w, SkScalar h) override { fSize = {w, h}; } 25 draw(SkCanvas * canvas)26 void draw(SkCanvas* canvas) override { 27 SkScalar angle = fAngle*SK_ScalarPI + SkScalarHalf(SK_ScalarPI); 28 29 SkPoint center = SkPoint::Make(fSize.width()/2, fSize.height()/2); 30 SkScalar length = 5; 31 SkScalar step = angle; 32 33 SkPath path; 34 path.moveTo(center); 35 36 while (length < (std::min(fSize.width(), fSize.height())/2 - 10.f)) 37 { 38 SkPoint rp = SkPoint::Make(length*SkScalarCos(step) + center.fX, 39 length*SkScalarSin(step) + center.fY); 40 path.lineTo(rp); 41 length += angle / SkScalarHalf(SK_ScalarPI); 42 step += angle; 43 } 44 path.close(); 45 46 SkPaint paint; 47 paint.setAntiAlias(true); 48 paint.setStyle(SkPaint::kStroke_Style); 49 paint.setColor(0xFF007700); 50 51 canvas->drawPath(path, paint); 52 } 53 54 protected: onFindClickHandler(SkScalar x,SkScalar y,skui::ModifierKey)55 Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey) override { 56 fAngle = x/fSize.width(); 57 return nullptr; 58 } 59 onClick(ClickHandlerSlide::Click *)60 bool onClick(ClickHandlerSlide::Click *) override { return false; } 61 62 private: 63 SkScalar fAngle; 64 SkSize fSize; 65 }; 66 67 ////////////////////////////////////////////////////////////////////////////// 68 69 DEF_SLIDE( return new StringArtSlide(); ) 70