14ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com/*
24ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com * Copyright 2013 Google Inc.
34ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com *
44ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com * Use of this source code is governed by a BSD-style license that can be
54ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com * found in the LICENSE file.
64ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com */
7d3ebb48320cf1b7e969974673e4bd7743816985ebungeman
84ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com#include "SampleCode.h"
94ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com#include "SkCanvas.h"
10d3ebb48320cf1b7e969974673e4bd7743816985ebungeman#include "SkPath.h"
114ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
124ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com// Reproduces https://code.google.com/p/chromium/issues/detail?id=279014
134ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
144ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com// Renders a string art shape.
154ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com// The particular shape rendered can be controlled by clicking horizontally, thereby
164ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com// generating an angle from 0 to 1.
174ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
184ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.comclass StringArtView : public SampleView {
194ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.compublic:
204ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com    StringArtView() : fAngle(0.305f) {}
214ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
224ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.comprotected:
234ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com    // overrides from SkEventSink
2436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool onQuery(SkEvent* evt) override {
254ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        if (SampleCode::TitleQ(*evt)) {
264ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com            SampleCode::TitleR(evt, "StringArt");
274ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com            return true;
284ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        }
294ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        return this->INHERITED::onQuery(evt);
304ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com    }
314ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
3236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawContent(SkCanvas* canvas) override {
334ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        SkScalar angle = fAngle*SK_ScalarPI + SkScalarHalf(SK_ScalarPI);
344ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
354ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        SkPoint center = SkPoint::Make(SkScalarHalf(this->width()), SkScalarHalf(this->height()));
364ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        SkScalar length = 5;
374ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        SkScalar step = angle;
384ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
394ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        SkPath path;
404ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        path.moveTo(center);
414ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
42417446a1ce6563632df0e71c57a0516b4b5ef6f1jvanverth@google.com        while (length < (SkScalarHalf(SkMinScalar(this->width(), this->height())) - 10.f))
434ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        {
444ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com            SkPoint rp = SkPoint::Make(length*SkScalarCos(step) + center.fX,
454ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com                                       length*SkScalarSin(step) + center.fY);
464ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com            path.lineTo(rp);
4780ea19ca4bdd68c1493666a5fe7e4ce9d43ded8breed            length += angle / SkScalarHalf(SK_ScalarPI);
484ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com            step += angle;
494ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        }
504ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        path.close();
514ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
524ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        SkPaint paint;
534ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        paint.setAntiAlias(true);
544ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        paint.setStyle(SkPaint::kStroke_Style);
554ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        paint.setColor(0xFF007700);
564ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
574ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        canvas->drawPath(path, paint);
584ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com    }
594ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
6036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned) override {
614ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        fAngle = x/width();
6296fcdcc219d2a0d3579719b84b28bede76efba64halcanary        return nullptr;
634ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com    }
644ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.comprivate:
654ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
664ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com    SkScalar fAngle;
674ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com    typedef SampleView INHERITED;
684ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com};
694ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
704ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com//////////////////////////////////////////////////////////////////////////////
714ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
724ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.comstatic SkView* MyFactory() { return new StringArtView; }
734ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.comstatic SkViewRegister reg(MyFactory);
74