OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright 2012 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 "Simplify.h" | |
9 | |
10 namespace SimplifyFindTopTest { | |
11 | |
12 #include "Simplify.cpp" | |
13 | |
14 } // end of SimplifyFindTopTest namespace | |
15 | |
16 #include "Intersection_Tests.h" | |
17 | |
18 static const SimplifyFindTopTest::Segment* testCommon( | |
19 SkTArray<SimplifyFindTopTest::Contour>& contours, | |
20 int& index, int& end) { | |
21 SkTDArray<SimplifyFindTopTest::Contour*> contourList; | |
22 makeContourList(contours, contourList, false, false); | |
23 addIntersectTs(contourList[0], contourList[0]); | |
24 if (contours.count() > 1) { | |
25 SkASSERT(contours.count() == 2); | |
26 addIntersectTs(contourList[0], contourList[1]); | |
27 addIntersectTs(contourList[1], contourList[1]); | |
28 } | |
29 fixOtherTIndex(contourList); | |
30 #if SORTABLE_CONTOURS // old way | |
31 SimplifyFindTopTest::Segment* topStart = findTopContour(contourList); | |
32 const SimplifyFindTopTest::Segment* topSegment = topStart->findTop(index, | |
33 end); | |
34 #else | |
35 SkPoint bestXY = {SK_ScalarMin, SK_ScalarMin}; | |
36 bool done, unsortable = false; | |
37 const SimplifyFindTopTest::Segment* topSegment = | |
38 findSortableTop(contourList, index, end, bestXY, unsortable, done, t
rue); | |
39 #endif | |
40 return topSegment; | |
41 } | |
42 | |
43 static void test(const SkPath& path) { | |
44 SkTArray<SimplifyFindTopTest::Contour> contours; | |
45 SimplifyFindTopTest::EdgeBuilder builder(path, contours); | |
46 int index, end; | |
47 testCommon(contours, index, end); | |
48 SkASSERT(index + 1 == end); | |
49 } | |
50 | |
51 static void test(const SkPath& path, SkScalar x1, SkScalar y1, | |
52 SkScalar x2, SkScalar y2) { | |
53 SkTArray<SimplifyFindTopTest::Contour> contours; | |
54 SimplifyFindTopTest::EdgeBuilder builder(path, contours); | |
55 int index, end; | |
56 const SimplifyFindTopTest::Segment* topSegment = | |
57 testCommon(contours, index, end); | |
58 SkPoint pts[2]; | |
59 double firstT = topSegment->t(index); | |
60 pts[0] = topSegment->xyAtT(&topSegment->span(index)); | |
61 int direction = index < end ? 1 : -1; | |
62 do { | |
63 index += direction; | |
64 double nextT = topSegment->t(index); | |
65 if (nextT == firstT) { | |
66 continue; | |
67 } | |
68 pts[1] = topSegment->xyAtT(&topSegment->span(index)); | |
69 if (pts[0] != pts[1]) { | |
70 break; | |
71 } | |
72 } while (true); | |
73 SkASSERT(pts[0].fX == x1); | |
74 SkASSERT(pts[0].fY == y1); | |
75 SkASSERT(pts[1].fX == x2); | |
76 SkASSERT(pts[1].fY == y2); | |
77 } | |
78 | |
79 static void testLine1() { | |
80 SkPath path; | |
81 path.moveTo(2,0); | |
82 path.lineTo(1,1); | |
83 path.lineTo(0,0); | |
84 path.close(); | |
85 test(path); | |
86 } | |
87 | |
88 static void addInnerCWTriangle(SkPath& path) { | |
89 path.moveTo(3,0); | |
90 path.lineTo(4,1); | |
91 path.lineTo(2,1); | |
92 path.close(); | |
93 } | |
94 | |
95 static void addInnerCCWTriangle(SkPath& path) { | |
96 path.moveTo(3,0); | |
97 path.lineTo(2,1); | |
98 path.lineTo(4,1); | |
99 path.close(); | |
100 } | |
101 | |
102 static void addOuterCWTriangle(SkPath& path) { | |
103 path.moveTo(3,0); | |
104 path.lineTo(6,2); | |
105 path.lineTo(0,2); | |
106 path.close(); | |
107 } | |
108 | |
109 static void addOuterCCWTriangle(SkPath& path) { | |
110 path.moveTo(3,0); | |
111 path.lineTo(0,2); | |
112 path.lineTo(6,2); | |
113 path.close(); | |
114 } | |
115 | |
116 static void testLine2() { | |
117 SkPath path; | |
118 addInnerCWTriangle(path); | |
119 addOuterCWTriangle(path); | |
120 test(path, 0, 2, 3, 0); | |
121 } | |
122 | |
123 static void testLine3() { | |
124 SkPath path; | |
125 addOuterCWTriangle(path); | |
126 addInnerCWTriangle(path); | |
127 test(path, 0, 2, 3, 0); | |
128 } | |
129 | |
130 static void testLine4() { | |
131 SkPath path; | |
132 addInnerCCWTriangle(path); | |
133 addOuterCWTriangle(path); | |
134 test(path, 0, 2, 3, 0); | |
135 } | |
136 | |
137 static void testLine5() { | |
138 SkPath path; | |
139 addOuterCWTriangle(path); | |
140 addInnerCCWTriangle(path); | |
141 test(path, 0, 2, 3, 0); | |
142 } | |
143 | |
144 static void testLine6() { | |
145 SkPath path; | |
146 addInnerCWTriangle(path); | |
147 addOuterCCWTriangle(path); | |
148 test(path, 0, 2, 3, 0); | |
149 } | |
150 | |
151 static void testLine7() { | |
152 SkPath path; | |
153 addOuterCCWTriangle(path); | |
154 addInnerCWTriangle(path); | |
155 test(path, 0, 2, 3, 0); | |
156 } | |
157 | |
158 static void testLine8() { | |
159 SkPath path; | |
160 addInnerCCWTriangle(path); | |
161 addOuterCCWTriangle(path); | |
162 test(path, 0, 2, 3, 0); | |
163 } | |
164 | |
165 static void testLine9() { | |
166 SkPath path; | |
167 addOuterCCWTriangle(path); | |
168 addInnerCCWTriangle(path); | |
169 test(path, 0, 2, 3, 0); | |
170 } | |
171 | |
172 static void testQuads() { | |
173 SkPath path; | |
174 path.moveTo(2,0); | |
175 path.quadTo(1,1, 0,0); | |
176 path.close(); | |
177 test(path); | |
178 } | |
179 | |
180 static void testCubics() { | |
181 SkPath path; | |
182 path.moveTo(2,0); | |
183 path.cubicTo(2,3, 1,1, 0,0); | |
184 path.close(); | |
185 test(path); | |
186 } | |
187 | |
188 static void (*tests[])() = { | |
189 testLine1, | |
190 testLine2, | |
191 testLine3, | |
192 testLine4, | |
193 testLine5, | |
194 testLine6, | |
195 testLine7, | |
196 testLine8, | |
197 testLine9, | |
198 testQuads, | |
199 testCubics | |
200 }; | |
201 | |
202 static const size_t testCount = sizeof(tests) / sizeof(tests[0]); | |
203 | |
204 static void (*firstTest)() = 0; | |
205 static bool skipAll = false; | |
206 | |
207 void SimplifyFindTop_Test() { | |
208 if (skipAll) { | |
209 return; | |
210 } | |
211 size_t index = 0; | |
212 if (firstTest) { | |
213 while (index < testCount && tests[index] != firstTest) { | |
214 ++index; | |
215 } | |
216 } | |
217 bool firstTestComplete = false; | |
218 for ( ; index < testCount; ++index) { | |
219 (*tests[index])(); | |
220 firstTestComplete = true; | |
221 } | |
222 } | |
OLD | NEW |