convexpaths.cpp revision 9732f62eaec427e0d4a8de06748ebb59450dfe31
1
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8#include "gm.h"
9#include "SkRandom.h"
10#include "SkTArray.h"
11
12namespace skiagm {
13
14class ConvexPathsGM : public GM {
15public:
16    ConvexPathsGM() {
17        this->setBGColor(0xFF000000);
18        this->makePaths();
19    }
20
21protected:
22    virtual SkString onShortName() {
23        return SkString("convexpaths");
24    }
25
26
27    virtual SkISize onISize() {
28        return make_isize(1200, 900);
29    }
30
31    void makePaths() {
32        fPaths.push_back().addRect(0, 0,
33                                   100 * SK_Scalar1, 100 * SK_Scalar1,
34                                   SkPath::kCW_Direction);
35
36        fPaths.push_back().addRect(0, 0,
37                                   100 * SK_Scalar1, 100 * SK_Scalar1,
38                                   SkPath::kCCW_Direction);
39
40        fPaths.push_back().addCircle(50  * SK_Scalar1, 50  * SK_Scalar1,
41                                     50  * SK_Scalar1, SkPath::kCW_Direction);
42
43        fPaths.push_back().addCircle(50  * SK_Scalar1, 50  * SK_Scalar1,
44                                     40  * SK_Scalar1, SkPath::kCCW_Direction);
45
46        fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0,
47                                                    50 * SK_Scalar1,
48                                                    100 * SK_Scalar1),
49                                   SkPath::kCW_Direction);
50
51        fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0,
52                                                    100 * SK_Scalar1,
53                                                    50 * SK_Scalar1),
54                                   SkPath::kCCW_Direction);
55
56        fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0,
57                                                    100 * SK_Scalar1,
58                                                    5 * SK_Scalar1),
59                                   SkPath::kCCW_Direction);
60
61        fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0,
62                                                    SK_Scalar1,
63                                                    100 * SK_Scalar1),
64                                   SkPath::kCCW_Direction);
65
66        fPaths.push_back().addRoundRect(SkRect::MakeXYWH(0, 0,
67                                                         SK_Scalar1 * 100,
68                                                         SK_Scalar1 * 100),
69                                        40 * SK_Scalar1, 20 * SK_Scalar1,
70                                        SkPath::kCW_Direction);
71
72        fPaths.push_back().addRoundRect(SkRect::MakeXYWH(0, 0,
73                                                         SK_Scalar1 * 100,
74                                                         SK_Scalar1 * 100),
75                                        20 * SK_Scalar1, 40 * SK_Scalar1,
76                                        SkPath::kCCW_Direction);
77
78        // shallow diagonals
79        fPaths.push_back().lineTo(100 * SK_Scalar1, SK_Scalar1);
80        fPaths.back().lineTo(98 * SK_Scalar1, 100 * SK_Scalar1);
81        fPaths.back().lineTo(3 * SK_Scalar1, 96 * SK_Scalar1);
82
83        /*
84        It turns out arcTos are not automatically marked as convex and they
85        may in fact be ever so slightly concave.
86        fPaths.push_back().arcTo(SkRect::MakeXYWH(0, 0,
87                                                  50 * SK_Scalar1,
88                                                  100 * SK_Scalar1),
89                                 25 * SK_Scalar1,  130 * SK_Scalar1, false);
90        */
91
92        // cubics
93        fPaths.push_back().cubicTo( 1 * SK_Scalar1,  1 * SK_Scalar1,
94                                   10 * SK_Scalar1,  90 * SK_Scalar1,
95                                    0 * SK_Scalar1, 100 * SK_Scalar1);
96        fPaths.push_back().cubicTo(100 * SK_Scalar1,  50 * SK_Scalar1,
97                                    20 * SK_Scalar1, 100 * SK_Scalar1,
98                                     0 * SK_Scalar1,   0 * SK_Scalar1);
99
100        // point degenerate
101        fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1);
102        fPaths.back().lineTo(50 * SK_Scalar1, 50 * SK_Scalar1);
103
104        fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1);
105        fPaths.back().quadTo(50 * SK_Scalar1, 50 * SK_Scalar1,
106                             50 * SK_Scalar1, 50 * SK_Scalar1);
107        fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1);
108        fPaths.back().cubicTo(50 * SK_Scalar1, 50 * SK_Scalar1,
109                              50 * SK_Scalar1, 50 * SK_Scalar1,
110                              50 * SK_Scalar1, 50 * SK_Scalar1);
111        // moveTo only paths
112        fPaths.push_back().moveTo(0, 0);
113        fPaths.back().moveTo(0, 0);
114        fPaths.back().moveTo(SK_Scalar1, SK_Scalar1);
115        fPaths.back().moveTo(SK_Scalar1, SK_Scalar1);
116        fPaths.back().moveTo(10 * SK_Scalar1, 10 * SK_Scalar1);
117
118        fPaths.push_back().moveTo(0, 0);
119        fPaths.back().moveTo(0, 0);
120
121        // line degenerate
122        fPaths.push_back().lineTo(100 * SK_Scalar1, 100 * SK_Scalar1);
123        fPaths.push_back().quadTo(100 * SK_Scalar1, 100 * SK_Scalar1, 0, 0);
124        fPaths.push_back().quadTo(100 * SK_Scalar1, 100 * SK_Scalar1,
125                                  50 * SK_Scalar1, 50 * SK_Scalar1);
126        fPaths.push_back().quadTo(50 * SK_Scalar1, 50 * SK_Scalar1,
127                                  100 * SK_Scalar1, 100 * SK_Scalar1);
128        fPaths.push_back().cubicTo(0, 0,
129                                   0, 0,
130                                   100 * SK_Scalar1, 100 * SK_Scalar1);
131    }
132
133    virtual void onDraw(SkCanvas* canvas) {
134
135    SkPaint paint;
136    paint.setAntiAlias(true);
137    SkRandom rand;
138    canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1);
139    for (int i = 0; i < fPaths.count(); ++i) {
140        canvas->save();
141        // position the path, and make it at off-integer coords.
142        canvas->translate(SK_Scalar1 * 200 * (i % 5) + SK_Scalar1 / 4,
143                          SK_Scalar1 * 200 * (i / 5) + 3 * SK_Scalar1 / 4);
144        SkColor color = rand.nextU();
145        color |= 0xff000000;
146        paint.setColor(color);
147        SkASSERT(fPaths[i].isConvex());
148        canvas->drawPath(fPaths[i], paint);
149        canvas->restore();
150    }
151    }
152
153private:
154    typedef GM INHERITED;
155    SkTArray<SkPath> fPaths;
156};
157
158//////////////////////////////////////////////////////////////////////////////
159
160static GM* MyFactory(void*) { return new ConvexPathsGM; }
161static GMRegistry reg(MyFactory);
162
163}
164
165