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 */
74ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com#include "SampleCode.h"
84ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com#include "SkCanvas.h"
94ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
104ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com// Reproduces https://code.google.com/p/chromium/issues/detail?id=279014
114ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
124ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com// Renders a string art shape.
134ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com// The particular shape rendered can be controlled by clicking horizontally, thereby
144ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com// generating an angle from 0 to 1.
154ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
164ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.comclass StringArtView : public SampleView {
174ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.compublic:
184ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com    StringArtView() : fAngle(0.305f) {}
194ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
204ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.comprotected:
214ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com    // overrides from SkEventSink
224ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com    virtual bool onQuery(SkEvent* evt) SK_OVERRIDE {
234ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        if (SampleCode::TitleQ(*evt)) {
244ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com            SampleCode::TitleR(evt, "StringArt");
254ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com            return true;
264ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        }
274ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        return this->INHERITED::onQuery(evt);
284ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com    }
294ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
304ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com    virtual void onDrawContent(SkCanvas* canvas) SK_OVERRIDE {
314ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        SkScalar angle = fAngle*SK_ScalarPI + SkScalarHalf(SK_ScalarPI);
324ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
334ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        SkPoint center = SkPoint::Make(SkScalarHalf(this->width()), SkScalarHalf(this->height()));
344ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        SkScalar length = 5;
354ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        SkScalar step = angle;
364ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
374ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        SkPath path;
384ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        path.moveTo(center);
394ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
40417446a1ce6563632df0e71c57a0516b4b5ef6f1jvanverth@google.com        while (length < (SkScalarHalf(SkMinScalar(this->width(), this->height())) - 10.f))
414ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        {
424ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com            SkPoint rp = SkPoint::Make(length*SkScalarCos(step) + center.fX,
434ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com                                       length*SkScalarSin(step) + center.fY);
444ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com            path.lineTo(rp);
454ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com            length += SkScalarDiv(angle, SkScalarHalf(SK_ScalarPI));
464ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com            step += angle;
474ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        }
484ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        path.close();
494ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
504ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        SkPaint paint;
514ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        paint.setAntiAlias(true);
524ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        paint.setStyle(SkPaint::kStroke_Style);
534ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        paint.setColor(0xFF007700);
544ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
554ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        canvas->drawPath(path, paint);
564ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com    }
574ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
584ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned) SK_OVERRIDE {
594ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        fAngle = x/width();
604ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        this->inval(NULL);
614ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com        return NULL;
624ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com    }
634ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.comprivate:
644ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
654ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com    SkScalar fAngle;
664ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com    typedef SampleView INHERITED;
674ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com};
684ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
694ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com//////////////////////////////////////////////////////////////////////////////
704ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com
714ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.comstatic SkView* MyFactory() { return new StringArtView; }
724ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.comstatic SkViewRegister reg(MyFactory);
73