blob: 70a8dd170a27d8617a9c223665754e4d7444dbaf [file] [log] [blame]
jvanverth@google.com4ea28782013-09-19 15:32:22 +00001/*
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 */
bungemand3ebb482015-08-05 13:57:49 -07007
Ben Wagnerb2c4ea62018-08-08 11:36:17 -04008#include "Sample.h"
jvanverth@google.com4ea28782013-09-19 15:32:22 +00009#include "SkCanvas.h"
bungemand3ebb482015-08-05 13:57:49 -070010#include "SkPath.h"
jvanverth@google.com4ea28782013-09-19 15:32:22 +000011
12// Reproduces https://code.google.com/p/chromium/issues/detail?id=279014
13
14// Renders a string art shape.
15// The particular shape rendered can be controlled by clicking horizontally, thereby
16// generating an angle from 0 to 1.
17
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040018class StringArtView : public Sample {
jvanverth@google.com4ea28782013-09-19 15:32:22 +000019public:
20 StringArtView() : fAngle(0.305f) {}
21
22protected:
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040023 bool onQuery(Sample::Event* evt) override {
24 if (Sample::TitleQ(*evt)) {
25 Sample::TitleR(evt, "StringArt");
jvanverth@google.com4ea28782013-09-19 15:32:22 +000026 return true;
27 }
28 return this->INHERITED::onQuery(evt);
29 }
30
mtklein36352bf2015-03-25 18:17:31 -070031 void onDrawContent(SkCanvas* canvas) override {
jvanverth@google.com4ea28782013-09-19 15:32:22 +000032 SkScalar angle = fAngle*SK_ScalarPI + SkScalarHalf(SK_ScalarPI);
33
34 SkPoint center = SkPoint::Make(SkScalarHalf(this->width()), SkScalarHalf(this->height()));
35 SkScalar length = 5;
36 SkScalar step = angle;
37
38 SkPath path;
39 path.moveTo(center);
40
jvanverth@google.com417446a2013-09-19 16:32:49 +000041 while (length < (SkScalarHalf(SkMinScalar(this->width(), this->height())) - 10.f))
jvanverth@google.com4ea28782013-09-19 15:32:22 +000042 {
43 SkPoint rp = SkPoint::Make(length*SkScalarCos(step) + center.fX,
44 length*SkScalarSin(step) + center.fY);
45 path.lineTo(rp);
reed80ea19c2015-05-12 10:37:34 -070046 length += angle / SkScalarHalf(SK_ScalarPI);
jvanverth@google.com4ea28782013-09-19 15:32:22 +000047 step += angle;
48 }
49 path.close();
50
51 SkPaint paint;
52 paint.setAntiAlias(true);
53 paint.setStyle(SkPaint::kStroke_Style);
54 paint.setColor(0xFF007700);
55
56 canvas->drawPath(path, paint);
57 }
58
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040059 Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned) override {
jvanverth@google.com4ea28782013-09-19 15:32:22 +000060 fAngle = x/width();
halcanary96fcdcc2015-08-27 07:41:13 -070061 return nullptr;
jvanverth@google.com4ea28782013-09-19 15:32:22 +000062 }
63private:
64
65 SkScalar fAngle;
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040066 typedef Sample INHERITED;
jvanverth@google.com4ea28782013-09-19 15:32:22 +000067};
68
69//////////////////////////////////////////////////////////////////////////////
70
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040071DEF_SAMPLE( return new StringArtView(); )