blob: abdf70752390b28c65ca5cea2775d4959d31f0ce [file] [log] [blame]
senorblanco@chromium.org129b8e32011-06-15 17:52:09 +00001
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002/*
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
senorblanco@chromium.org129b8e32011-06-15 17:52:09 +00009#include "SampleCode.h"
10#include "SkView.h"
11#include "SkCanvas.h"
12#include "SkGradientShader.h"
13#include "SkGraphics.h"
senorblanco@chromium.org129b8e32011-06-15 17:52:09 +000014#include "SkPath.h"
15#include "SkRegion.h"
16#include "SkShader.h"
17#include "SkUtils.h"
18#include "SkXfermode.h"
19#include "SkColorPriv.h"
20#include "SkColorFilter.h"
21#include "SkParsePath.h"
22#include "SkTime.h"
23#include "SkTypeface.h"
24
25#include "SkGeometry.h"
26
27class ConcavePathView : public SampleView {
28public:
rmistry@google.comae933ce2012-08-23 18:19:56 +000029 ConcavePathView() {}
30
senorblanco@chromium.org129b8e32011-06-15 17:52:09 +000031protected:
32 // overrides from SkEventSink
33 virtual bool onQuery(SkEvent* evt) {
34 if (SampleCode::TitleQ(*evt)) {
35 SampleCode::TitleR(evt, "ConcavePaths");
36 return true;
37 }
38 return this->INHERITED::onQuery(evt);
39 }
rmistry@google.comae933ce2012-08-23 18:19:56 +000040
41 virtual void onDrawContent(SkCanvas* canvas) {
senorblanco@chromium.org129b8e32011-06-15 17:52:09 +000042 SkPaint paint;
rmistry@google.comae933ce2012-08-23 18:19:56 +000043
senorblanco@chromium.org129b8e32011-06-15 17:52:09 +000044 paint.setAntiAlias(true);
45 paint.setStyle(SkPaint::kFill_Style);
46
47 // Concave test
48 if (1) {
49 SkPath path;
50 canvas->translate(0, 0);
51 path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
52 path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
53 path.lineTo(SkIntToScalar(30), SkIntToScalar(30));
54 path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
55 canvas->drawPath(path, paint);
56 }
57 // Reverse concave test
58 if (1) {
59 SkPath path;
60 canvas->save();
61 canvas->translate(100, 0);
62 path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
63 path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
64 path.lineTo(SkIntToScalar(30), SkIntToScalar(30));
65 path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
66 canvas->drawPath(path, paint);
67 canvas->restore();
68 }
69 // Bowtie (intersection)
70 if (1) {
71 SkPath path;
72 canvas->save();
73 canvas->translate(200, 0);
74 path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
75 path.lineTo(SkIntToScalar(80), SkIntToScalar(80));
76 path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
77 path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
78 canvas->drawPath(path, paint);
79 canvas->restore();
80 }
81 // "fake" bowtie (concave, but no intersection)
82 if (1) {
83 SkPath path;
84 canvas->save();
85 canvas->translate(300, 0);
86 path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
87 path.lineTo(SkIntToScalar(50), SkIntToScalar(40));
88 path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
89 path.lineTo(SkIntToScalar(80), SkIntToScalar(80));
90 path.lineTo(SkIntToScalar(50), SkIntToScalar(60));
91 path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
92 canvas->drawPath(path, paint);
93 canvas->restore();
94 }
95 // Fish test (intersection/concave)
96 if (1) {
97 SkPath path;
98 canvas->save();
99 canvas->translate(0, 100);
100 path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
101 path.lineTo(SkIntToScalar(80), SkIntToScalar(80));
102 path.lineTo(SkIntToScalar(70), SkIntToScalar(50));
103 path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
104 path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
105 path.lineTo(SkIntToScalar(0), SkIntToScalar(50));
106 canvas->drawPath(path, paint);
107 canvas->restore();
108 }
109 // Collinear test
110 if (1) {
111 SkPath path;
112 canvas->save();
113 canvas->translate(100, 100);
114 path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
115 path.lineTo(SkIntToScalar(50), SkIntToScalar(20));
116 path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
117 path.lineTo(SkIntToScalar(50), SkIntToScalar(80));
118 canvas->drawPath(path, paint);
119 canvas->restore();
120 }
121 // Hole test
122 if (1) {
123 SkPath path;
124 canvas->save();
125 canvas->translate(200, 100);
126 path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
127 path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
128 path.lineTo(SkIntToScalar(80), SkIntToScalar(80));
129 path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
130 path.moveTo(SkIntToScalar(30), SkIntToScalar(30));
131 path.lineTo(SkIntToScalar(30), SkIntToScalar(70));
132 path.lineTo(SkIntToScalar(70), SkIntToScalar(70));
133 path.lineTo(SkIntToScalar(70), SkIntToScalar(30));
134 canvas->drawPath(path, paint);
135 canvas->restore();
136 }
137 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000138
reed@google.com4d5c26d2013-01-08 16:17:50 +0000139 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y,
140 unsigned modi) {
halcanary96fcdcc2015-08-27 07:41:13 -0700141 this->inval(nullptr);
reed@google.com4d5c26d2013-01-08 16:17:50 +0000142 return this->INHERITED::onFindClickHandler(x, y, modi);
senorblanco@chromium.org129b8e32011-06-15 17:52:09 +0000143 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000144
senorblanco@chromium.org129b8e32011-06-15 17:52:09 +0000145private:
146 typedef SampleView INHERITED;
147};
148
149//////////////////////////////////////////////////////////////////////////////
150
151static SkView* MyFactory() { return new ConcavePathView; }
152static SkViewRegister reg(MyFactory);