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