Home | History | Annotate | Download | only in samplecode
      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