1 /*
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  */
7 
8 #include "gm.h"
9 #include "SkCanvas.h"
10 #include "SkPath.h"
11 
12 // Reproduces https://code.google.com/p/chromium/issues/detail?id=279014
13 
14 static const int kWidth = 640;
15 static const int kHeight = 480;
16 static const SkScalar kAngle = 0.305f;
17 
18 // Renders a string art shape.
19 // The particular shape rendered can be controlled by adjusting kAngle, from 0 to 1
20 
21 class StringArtGM : public skiagm::GM {
22 public:
StringArtGM()23     StringArtGM() {}
24 
25 protected:
26 
onShortName()27     SkString onShortName() override {
28         return SkString("stringart");
29     }
30 
onISize()31     SkISize onISize() override {
32         return SkISize::Make(kWidth, kHeight);
33     }
34 
onDraw(SkCanvas * canvas)35     void onDraw(SkCanvas* canvas) override {
36         SkScalar angle = kAngle*SK_ScalarPI + SkScalarHalf(SK_ScalarPI);
37         SkScalar size = SkIntToScalar(SkMin32(kWidth, kHeight));
38         SkPoint center = SkPoint::Make(SkScalarHalf(kWidth), SkScalarHalf(kHeight));
39         SkScalar length = 5;
40         SkScalar step = angle;
41 
42         SkPath path;
43         path.moveTo(center);
44 
45         while (length < (SkScalarHalf(size) - 10.f))
46         {
47             SkPoint rp = SkPoint::Make(length*SkScalarCos(step) + center.fX,
48                                        length*SkScalarSin(step) + center.fY);
49             path.lineTo(rp);
50             length += angle / SkScalarHalf(SK_ScalarPI);
51             step += angle;
52         }
53         path.close();
54 
55         SkPaint paint;
56         paint.setAntiAlias(true);
57         paint.setStyle(SkPaint::kStroke_Style);
58         paint.setColor(0xFF007700);
59 
60         canvas->drawPath(path, paint);
61     }
62 
63 private:
64     typedef GM INHERITED;
65 };
66 
67 DEF_GM( return new StringArtGM; )
68