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 #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     virtual bool onQuery(SkEvent* evt) SK_OVERRIDE {
     23         if (SampleCode::TitleQ(*evt)) {
     24             SampleCode::TitleR(evt, "StringArt");
     25             return true;
     26         }
     27         return this->INHERITED::onQuery(evt);
     28     }
     29 
     30     virtual void onDrawContent(SkCanvas* canvas) SK_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 += SkScalarDiv(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     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned) SK_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