1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2013 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "tools/viewer/ClickHandlerSlide.h" 11*c8dee2aaSAndroid Build Coastguard Worker 12*c8dee2aaSAndroid Build Coastguard Worker // Reproduces https://code.google.com/p/chromium/issues/detail?id=279014 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker // Renders a string art shape. 15*c8dee2aaSAndroid Build Coastguard Worker // The particular shape rendered can be controlled by clicking horizontally, thereby 16*c8dee2aaSAndroid Build Coastguard Worker // generating an angle from 0 to 1. 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker class StringArtSlide : public ClickHandlerSlide { 19*c8dee2aaSAndroid Build Coastguard Worker public: StringArtSlide()20*c8dee2aaSAndroid Build Coastguard Worker StringArtSlide() : fAngle(0.305f) { fName = "StringArt"; } 21*c8dee2aaSAndroid Build Coastguard Worker load(SkScalar w,SkScalar h)22*c8dee2aaSAndroid Build Coastguard Worker void load(SkScalar w, SkScalar h) override { fSize = {w, h}; } 23*c8dee2aaSAndroid Build Coastguard Worker resize(SkScalar w,SkScalar h)24*c8dee2aaSAndroid Build Coastguard Worker void resize(SkScalar w, SkScalar h) override { fSize = {w, h}; } 25*c8dee2aaSAndroid Build Coastguard Worker draw(SkCanvas * canvas)26*c8dee2aaSAndroid Build Coastguard Worker void draw(SkCanvas* canvas) override { 27*c8dee2aaSAndroid Build Coastguard Worker SkScalar angle = fAngle*SK_ScalarPI + SkScalarHalf(SK_ScalarPI); 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker SkPoint center = SkPoint::Make(fSize.width()/2, fSize.height()/2); 30*c8dee2aaSAndroid Build Coastguard Worker SkScalar length = 5; 31*c8dee2aaSAndroid Build Coastguard Worker SkScalar step = angle; 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker SkPath path; 34*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(center); 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker while (length < (std::min(fSize.width(), fSize.height())/2 - 10.f)) 37*c8dee2aaSAndroid Build Coastguard Worker { 38*c8dee2aaSAndroid Build Coastguard Worker SkPoint rp = SkPoint::Make(length*SkScalarCos(step) + center.fX, 39*c8dee2aaSAndroid Build Coastguard Worker length*SkScalarSin(step) + center.fY); 40*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(rp); 41*c8dee2aaSAndroid Build Coastguard Worker length += angle / SkScalarHalf(SK_ScalarPI); 42*c8dee2aaSAndroid Build Coastguard Worker step += angle; 43*c8dee2aaSAndroid Build Coastguard Worker } 44*c8dee2aaSAndroid Build Coastguard Worker path.close(); 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 47*c8dee2aaSAndroid Build Coastguard Worker paint.setAntiAlias(true); 48*c8dee2aaSAndroid Build Coastguard Worker paint.setStyle(SkPaint::kStroke_Style); 49*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(0xFF007700); 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, paint); 52*c8dee2aaSAndroid Build Coastguard Worker } 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker protected: onFindClickHandler(SkScalar x,SkScalar y,skui::ModifierKey)55*c8dee2aaSAndroid Build Coastguard Worker Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey) override { 56*c8dee2aaSAndroid Build Coastguard Worker fAngle = x/fSize.width(); 57*c8dee2aaSAndroid Build Coastguard Worker return nullptr; 58*c8dee2aaSAndroid Build Coastguard Worker } 59*c8dee2aaSAndroid Build Coastguard Worker onClick(ClickHandlerSlide::Click *)60*c8dee2aaSAndroid Build Coastguard Worker bool onClick(ClickHandlerSlide::Click *) override { return false; } 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker private: 63*c8dee2aaSAndroid Build Coastguard Worker SkScalar fAngle; 64*c8dee2aaSAndroid Build Coastguard Worker SkSize fSize; 65*c8dee2aaSAndroid Build Coastguard Worker }; 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////// 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE( return new StringArtSlide(); ) 70