blob: fd69298605cdc5bb8887f67ef7200e6e63ffd2a2 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "include/core/SkCanvas.h"
9#include "include/core/SkColorFilter.h"
10#include "include/core/SkColorPriv.h"
11#include "include/core/SkGraphics.h"
12#include "include/core/SkPath.h"
13#include "include/core/SkRegion.h"
14#include "include/core/SkShader.h"
15#include "include/core/SkTime.h"
16#include "include/core/SkTypeface.h"
17#include "include/effects/SkGradientShader.h"
18#include "include/utils/SkParsePath.h"
19#include "samplecode/Sample.h"
20#include "src/utils/SkUTF.h"
senorblanco@chromium.org129b8e32011-06-15 17:52:09 +000021
Mike Kleinc0bd9f92019-04-23 12:05:21 -050022#include "src/core/SkGeometry.h"
senorblanco@chromium.org129b8e32011-06-15 17:52:09 +000023
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040024class ConcavePathView : public Sample {
senorblanco@chromium.org129b8e32011-06-15 17:52:09 +000025public:
rmistry@google.comae933ce2012-08-23 18:19:56 +000026 ConcavePathView() {}
27
senorblanco@chromium.org129b8e32011-06-15 17:52:09 +000028protected:
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040029 virtual bool onQuery(Sample::Event* evt) {
30 if (Sample::TitleQ(*evt)) {
31 Sample::TitleR(evt, "ConcavePaths");
senorblanco@chromium.org129b8e32011-06-15 17:52:09 +000032 return true;
33 }
34 return this->INHERITED::onQuery(evt);
35 }
rmistry@google.comae933ce2012-08-23 18:19:56 +000036
37 virtual void onDrawContent(SkCanvas* canvas) {
senorblanco@chromium.org129b8e32011-06-15 17:52:09 +000038 SkPaint paint;
rmistry@google.comae933ce2012-08-23 18:19:56 +000039
senorblanco@chromium.org129b8e32011-06-15 17:52:09 +000040 paint.setAntiAlias(true);
41 paint.setStyle(SkPaint::kFill_Style);
42
43 // Concave test
44 if (1) {
45 SkPath path;
46 canvas->translate(0, 0);
47 path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
48 path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
49 path.lineTo(SkIntToScalar(30), SkIntToScalar(30));
50 path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
51 canvas->drawPath(path, paint);
52 }
53 // Reverse concave test
54 if (1) {
55 SkPath path;
56 canvas->save();
57 canvas->translate(100, 0);
58 path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
59 path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
60 path.lineTo(SkIntToScalar(30), SkIntToScalar(30));
61 path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
62 canvas->drawPath(path, paint);
63 canvas->restore();
64 }
65 // Bowtie (intersection)
66 if (1) {
67 SkPath path;
68 canvas->save();
69 canvas->translate(200, 0);
70 path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
71 path.lineTo(SkIntToScalar(80), SkIntToScalar(80));
72 path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
73 path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
74 canvas->drawPath(path, paint);
75 canvas->restore();
76 }
77 // "fake" bowtie (concave, but no intersection)
78 if (1) {
79 SkPath path;
80 canvas->save();
81 canvas->translate(300, 0);
82 path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
83 path.lineTo(SkIntToScalar(50), SkIntToScalar(40));
84 path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
85 path.lineTo(SkIntToScalar(80), SkIntToScalar(80));
86 path.lineTo(SkIntToScalar(50), SkIntToScalar(60));
87 path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
88 canvas->drawPath(path, paint);
89 canvas->restore();
90 }
91 // Fish test (intersection/concave)
92 if (1) {
93 SkPath path;
94 canvas->save();
95 canvas->translate(0, 100);
96 path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
97 path.lineTo(SkIntToScalar(80), SkIntToScalar(80));
98 path.lineTo(SkIntToScalar(70), SkIntToScalar(50));
99 path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
100 path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
101 path.lineTo(SkIntToScalar(0), SkIntToScalar(50));
102 canvas->drawPath(path, paint);
103 canvas->restore();
104 }
105 // Collinear test
106 if (1) {
107 SkPath path;
108 canvas->save();
109 canvas->translate(100, 100);
110 path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
111 path.lineTo(SkIntToScalar(50), SkIntToScalar(20));
112 path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
113 path.lineTo(SkIntToScalar(50), SkIntToScalar(80));
114 canvas->drawPath(path, paint);
115 canvas->restore();
116 }
117 // Hole test
118 if (1) {
119 SkPath path;
120 canvas->save();
121 canvas->translate(200, 100);
122 path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
123 path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
124 path.lineTo(SkIntToScalar(80), SkIntToScalar(80));
125 path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
126 path.moveTo(SkIntToScalar(30), SkIntToScalar(30));
127 path.lineTo(SkIntToScalar(30), SkIntToScalar(70));
128 path.lineTo(SkIntToScalar(70), SkIntToScalar(70));
129 path.lineTo(SkIntToScalar(70), SkIntToScalar(30));
130 canvas->drawPath(path, paint);
131 canvas->restore();
132 }
133 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000134
senorblanco@chromium.org129b8e32011-06-15 17:52:09 +0000135private:
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400136 typedef Sample INHERITED;
senorblanco@chromium.org129b8e32011-06-15 17:52:09 +0000137};
138
139//////////////////////////////////////////////////////////////////////////////
140
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400141DEF_SAMPLE( return new ConcavePathView(); )