SampleStringArt.cpp revision 4ea2878f076cd41da803e6fcdcfb884b18a5b00c
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 404ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com while (length < (SkScalarHalf(SkMin32(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