1/*
2 * Copyright 2011 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 "SampleCode.h"
9#include "SkView.h"
10#include "SkCanvas.h"
11#include "SkGradientShader.h"
12#include "SkGraphics.h"
13#include "SkPath.h"
14#include "SkRegion.h"
15#include "SkShader.h"
16#include "SkUtils.h"
17#include "SkColorPriv.h"
18#include "SkColorFilter.h"
19#include "SkParsePath.h"
20#include "SkTime.h"
21#include "SkTypeface.h"
22
23#include "SkGeometry.h"
24
25class ConcavePathView : public SampleView {
26public:
27    ConcavePathView() {}
28
29protected:
30    // overrides from SkEventSink
31    virtual bool onQuery(SkEvent* evt) {
32        if (SampleCode::TitleQ(*evt)) {
33            SampleCode::TitleR(evt, "ConcavePaths");
34            return true;
35        }
36        return this->INHERITED::onQuery(evt);
37    }
38
39    virtual void onDrawContent(SkCanvas* canvas) {
40        SkPaint paint;
41
42        paint.setAntiAlias(true);
43        paint.setStyle(SkPaint::kFill_Style);
44
45        // Concave test
46        if (1) {
47            SkPath path;
48            canvas->translate(0, 0);
49            path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
50            path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
51            path.lineTo(SkIntToScalar(30), SkIntToScalar(30));
52            path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
53            canvas->drawPath(path, paint);
54        }
55        // Reverse concave test
56        if (1) {
57            SkPath path;
58            canvas->save();
59            canvas->translate(100, 0);
60            path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
61            path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
62            path.lineTo(SkIntToScalar(30), SkIntToScalar(30));
63            path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
64            canvas->drawPath(path, paint);
65            canvas->restore();
66        }
67        // Bowtie (intersection)
68        if (1) {
69            SkPath path;
70            canvas->save();
71            canvas->translate(200, 0);
72            path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
73            path.lineTo(SkIntToScalar(80), SkIntToScalar(80));
74            path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
75            path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
76            canvas->drawPath(path, paint);
77            canvas->restore();
78        }
79        // "fake" bowtie (concave, but no intersection)
80        if (1) {
81            SkPath path;
82            canvas->save();
83            canvas->translate(300, 0);
84            path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
85            path.lineTo(SkIntToScalar(50), SkIntToScalar(40));
86            path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
87            path.lineTo(SkIntToScalar(80), SkIntToScalar(80));
88            path.lineTo(SkIntToScalar(50), SkIntToScalar(60));
89            path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
90            canvas->drawPath(path, paint);
91            canvas->restore();
92        }
93        // Fish test (intersection/concave)
94        if (1) {
95            SkPath path;
96            canvas->save();
97            canvas->translate(0, 100);
98            path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
99            path.lineTo(SkIntToScalar(80), SkIntToScalar(80));
100            path.lineTo(SkIntToScalar(70), SkIntToScalar(50));
101            path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
102            path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
103            path.lineTo(SkIntToScalar(0), SkIntToScalar(50));
104            canvas->drawPath(path, paint);
105            canvas->restore();
106        }
107        // Collinear test
108        if (1) {
109            SkPath path;
110            canvas->save();
111            canvas->translate(100, 100);
112            path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
113            path.lineTo(SkIntToScalar(50), SkIntToScalar(20));
114            path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
115            path.lineTo(SkIntToScalar(50), SkIntToScalar(80));
116            canvas->drawPath(path, paint);
117            canvas->restore();
118        }
119        // Hole test
120        if (1) {
121            SkPath path;
122            canvas->save();
123            canvas->translate(200, 100);
124            path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
125            path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
126            path.lineTo(SkIntToScalar(80), SkIntToScalar(80));
127            path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
128            path.moveTo(SkIntToScalar(30), SkIntToScalar(30));
129            path.lineTo(SkIntToScalar(30), SkIntToScalar(70));
130            path.lineTo(SkIntToScalar(70), SkIntToScalar(70));
131            path.lineTo(SkIntToScalar(70), SkIntToScalar(30));
132            canvas->drawPath(path, paint);
133            canvas->restore();
134        }
135    }
136
137private:
138    typedef SampleView INHERITED;
139};
140
141//////////////////////////////////////////////////////////////////////////////
142
143static SkView* MyFactory() { return new ConcavePathView; }
144static SkViewRegister reg(MyFactory);
145