convexpaths.cpp revision 495e210eb1b66d8a8fc3f46ca1def3c78c724a38
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(0xFFFFFFFF);
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
112        // line degenerate
113        fPaths.push_back().lineTo(100 * SK_Scalar1, 100 * SK_Scalar1);
114        fPaths.push_back().quadTo(100 * SK_Scalar1, 100 * SK_Scalar1, 0, 0);
115        fPaths.push_back().quadTo(100 * SK_Scalar1, 100 * SK_Scalar1,
116                                  50 * SK_Scalar1, 50 * SK_Scalar1);
117        fPaths.push_back().quadTo(50 * SK_Scalar1, 50 * SK_Scalar1,
118                                  100 * SK_Scalar1, 100 * SK_Scalar1);
119        fPaths.push_back().cubicTo(0, 0,
120                                   0, 0,
121                                   100 * SK_Scalar1, 100 * SK_Scalar1);
122    }
123
124    virtual void onDraw(SkCanvas* canvas) {
125
126    SkPaint paint;
127    paint.setAntiAlias(true);
128    SkRandom rand;
129    canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1);
130    for (int i = 0; i < fPaths.count(); ++i) {
131        canvas->save();
132        // position the path, and make it at off-integer coords.
133        canvas->translate(SK_Scalar1 * 200 * (i % 5) + SK_Scalar1 / 4,
134                          SK_Scalar1 * 200 * (i / 5) + 3 * SK_Scalar1 / 4);
135        SkColor color = rand.nextU();
136        color |= 0xff000000;
137        paint.setColor(color);
138        SkASSERT(fPaths[i].isConvex());
139        canvas->drawPath(fPaths[i], paint);
140        canvas->restore();
141    }
142    }
143
144private:
145    typedef GM INHERITED;
146    SkTArray<SkPath> fPaths;
147};
148
149//////////////////////////////////////////////////////////////////////////////
150
151static GM* MyFactory(void*) { return new ConvexPathsGM; }
152static GMRegistry reg(MyFactory);
153
154}
155
156