Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(227)

Side by Side Diff: src/pathops/SkAddIntersections.cpp

Issue 1037953004: add conics to path ops (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix linux build Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2012 Google Inc. 2 * Copyright 2012 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 #include "SkAddIntersections.h" 7 #include "SkAddIntersections.h"
8 #include "SkOpCoincidence.h" 8 #include "SkOpCoincidence.h"
9 #include "SkPathOpsBounds.h" 9 #include "SkPathOpsBounds.h"
10 10
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 for (int n = 1; n < pts; ++n) { 64 for (int n = 1; n < pts; ++n) {
65 SkDebugf(" " TX_DEBUG_STR(wtTs) " " PT_DEBUG_STR, n, i[0][n], PT_DEBUG_D ATA(i, n)); 65 SkDebugf(" " TX_DEBUG_STR(wtTs) " " PT_DEBUG_STR, n, i[0][n], PT_DEBUG_D ATA(i, n));
66 } 66 }
67 SkDebugf(" wnTs[0]=%g " QUAD_DEBUG_STR, i[1][0], QUAD_DEBUG_DATA(wn.pts())); 67 SkDebugf(" wnTs[0]=%g " QUAD_DEBUG_STR, i[1][0], QUAD_DEBUG_DATA(wn.pts()));
68 for (int n = 1; n < pts; ++n) { 68 for (int n = 1; n < pts; ++n) {
69 SkDebugf(" " TX_DEBUG_STR(wnTs), n, i[1][n]); 69 SkDebugf(" " TX_DEBUG_STR(wnTs), n, i[1][n]);
70 } 70 }
71 SkDebugf("\n"); 71 SkDebugf("\n");
72 } 72 }
73 73
74 static void debugShowConicLineIntersection(int pts, const SkIntersectionHelper& wt,
75 const SkIntersectionHelper& wn, const SkIntersections& i) {
76 SkASSERT(i.used() == pts);
77 if (!pts) {
78 SkDebugf("%s no intersect " CONIC_DEBUG_STR " " LINE_DEBUG_STR "\n",
79 __FUNCTION__, CONIC_DEBUG_DATA(wt.pts(), wt.weight()), LINE_DEBU G_DATA(wn.pts()));
80 return;
81 }
82 SkDebugf("%s " T_DEBUG_STR(wtTs, 0) " " CONIC_DEBUG_STR " " PT_DEBUG_STR, __ FUNCTION__,
83 i[0][0], CONIC_DEBUG_DATA(wt.pts(), wt.weight()), PT_DEBUG_DATA(i, 0 ));
84 for (int n = 1; n < pts; ++n) {
85 SkDebugf(" " TX_DEBUG_STR(wtTs) " " PT_DEBUG_STR, n, i[0][n], PT_DEBUG_D ATA(i, n));
86 }
87 SkDebugf(" wnTs[0]=%g " LINE_DEBUG_STR, i[1][0], LINE_DEBUG_DATA(wn.pts()));
88 for (int n = 1; n < pts; ++n) {
89 SkDebugf(" " TX_DEBUG_STR(wnTs), n, i[1][n]);
90 }
91 SkDebugf("\n");
92 }
93
94 static void debugShowConicQuadIntersection(int pts, const SkIntersectionHelper& wt,
95 const SkIntersectionHelper& wn, const SkIntersections& i) {
96 SkASSERT(i.used() == pts);
97 if (!pts) {
98 SkDebugf("%s no intersect " CONIC_DEBUG_STR " " QUAD_DEBUG_STR "\n",
99 __FUNCTION__, CONIC_DEBUG_DATA(wt.pts(), wt.weight()), QUAD_DEBU G_DATA(wn.pts()));
100 return;
101 }
102 SkDebugf("%s " T_DEBUG_STR(wtTs, 0) " " CONIC_DEBUG_STR " " PT_DEBUG_STR, __ FUNCTION__,
103 i[0][0], CONIC_DEBUG_DATA(wt.pts(), wt.weight()), PT_DEBUG_DATA(i, 0 ));
104 for (int n = 1; n < pts; ++n) {
105 SkDebugf(" " TX_DEBUG_STR(wtTs) " " PT_DEBUG_STR, n, i[0][n], PT_DEBUG_D ATA(i, n));
106 }
107 SkDebugf(" wnTs[0]=%g " QUAD_DEBUG_STR, i[1][0], QUAD_DEBUG_DATA(wn.pts()));
108 for (int n = 1; n < pts; ++n) {
109 SkDebugf(" " TX_DEBUG_STR(wnTs), n, i[1][n]);
110 }
111 SkDebugf("\n");
112 }
113
114 static void debugShowConicIntersection(int pts, const SkIntersectionHelper& wt,
115 const SkIntersectionHelper& wn, const SkIntersections& i) {
116 SkASSERT(i.used() == pts);
117 if (!pts) {
118 SkDebugf("%s no intersect " CONIC_DEBUG_STR " " CONIC_DEBUG_STR "\n",
119 __FUNCTION__, CONIC_DEBUG_DATA(wt.pts(), wt.weight()),
120 CONIC_DEBUG_DATA(wn.pts(), wn.weight()));
121 return;
122 }
123 SkDebugf("%s " T_DEBUG_STR(wtTs, 0) " " CONIC_DEBUG_STR " " PT_DEBUG_STR, __ FUNCTION__,
124 i[0][0], CONIC_DEBUG_DATA(wt.pts(), wt.weight()), PT_DEBUG_DATA(i, 0 ));
125 for (int n = 1; n < pts; ++n) {
126 SkDebugf(" " TX_DEBUG_STR(wtTs) " " PT_DEBUG_STR, n, i[0][n], PT_DEBUG_D ATA(i, n));
127 }
128 SkDebugf(" wnTs[0]=%g " CONIC_DEBUG_STR, i[1][0], CONIC_DEBUG_DATA(wn.pts(), wn.weight()));
129 for (int n = 1; n < pts; ++n) {
130 SkDebugf(" " TX_DEBUG_STR(wnTs), n, i[1][n]);
131 }
132 SkDebugf("\n");
133 }
134
74 static void debugShowCubicLineIntersection(int pts, const SkIntersectionHelper& wt, 135 static void debugShowCubicLineIntersection(int pts, const SkIntersectionHelper& wt,
75 const SkIntersectionHelper& wn, const SkIntersections& i) { 136 const SkIntersectionHelper& wn, const SkIntersections& i) {
76 SkASSERT(i.used() == pts); 137 SkASSERT(i.used() == pts);
77 if (!pts) { 138 if (!pts) {
78 SkDebugf("%s no intersect " CUBIC_DEBUG_STR " " LINE_DEBUG_STR "\n", 139 SkDebugf("%s no intersect " CUBIC_DEBUG_STR " " LINE_DEBUG_STR "\n",
79 __FUNCTION__, CUBIC_DEBUG_DATA(wt.pts()), LINE_DEBUG_DATA(wn.pts ())); 140 __FUNCTION__, CUBIC_DEBUG_DATA(wt.pts()), LINE_DEBUG_DATA(wn.pts ()));
80 return; 141 return;
81 } 142 }
82 SkDebugf("%s " T_DEBUG_STR(wtTs, 0) " " CUBIC_DEBUG_STR " " PT_DEBUG_STR, __ FUNCTION__, 143 SkDebugf("%s " T_DEBUG_STR(wtTs, 0) " " CUBIC_DEBUG_STR " " PT_DEBUG_STR, __ FUNCTION__,
83 i[0][0], CUBIC_DEBUG_DATA(wt.pts()), PT_DEBUG_DATA(i, 0)); 144 i[0][0], CUBIC_DEBUG_DATA(wt.pts()), PT_DEBUG_DATA(i, 0));
(...skipping 20 matching lines...) Expand all
104 for (int n = 1; n < pts; ++n) { 165 for (int n = 1; n < pts; ++n) {
105 SkDebugf(" " TX_DEBUG_STR(wtTs) " " PT_DEBUG_STR, n, i[0][n], PT_DEBUG_D ATA(i, n)); 166 SkDebugf(" " TX_DEBUG_STR(wtTs) " " PT_DEBUG_STR, n, i[0][n], PT_DEBUG_D ATA(i, n));
106 } 167 }
107 SkDebugf(" wnTs[0]=%g " QUAD_DEBUG_STR, i[1][0], QUAD_DEBUG_DATA(wn.pts())); 168 SkDebugf(" wnTs[0]=%g " QUAD_DEBUG_STR, i[1][0], QUAD_DEBUG_DATA(wn.pts()));
108 for (int n = 1; n < pts; ++n) { 169 for (int n = 1; n < pts; ++n) {
109 SkDebugf(" " TX_DEBUG_STR(wnTs), n, i[1][n]); 170 SkDebugf(" " TX_DEBUG_STR(wnTs), n, i[1][n]);
110 } 171 }
111 SkDebugf("\n"); 172 SkDebugf("\n");
112 } 173 }
113 174
175 static void debugShowCubicConicIntersection(int pts, const SkIntersectionHelper& wt,
176 const SkIntersectionHelper& wn, const SkIntersections& i) {
177 SkASSERT(i.used() == pts);
178 if (!pts) {
179 SkDebugf("%s no intersect " CUBIC_DEBUG_STR " " CONIC_DEBUG_STR "\n",
180 __FUNCTION__, CUBIC_DEBUG_DATA(wt.pts()), CONIC_DEBUG_DATA(wn.pt s(), wn.weight()));
181 return;
182 }
183 SkDebugf("%s " T_DEBUG_STR(wtTs, 0) " " CUBIC_DEBUG_STR " " PT_DEBUG_STR, __ FUNCTION__,
184 i[0][0], CUBIC_DEBUG_DATA(wt.pts()), PT_DEBUG_DATA(i, 0));
185 for (int n = 1; n < pts; ++n) {
186 SkDebugf(" " TX_DEBUG_STR(wtTs) " " PT_DEBUG_STR, n, i[0][n], PT_DEBUG_D ATA(i, n));
187 }
188 SkDebugf(" wnTs[0]=%g " CONIC_DEBUG_STR, i[1][0], CONIC_DEBUG_DATA(wn.pts(), wn.weight()));
189 for (int n = 1; n < pts; ++n) {
190 SkDebugf(" " TX_DEBUG_STR(wnTs), n, i[1][n]);
191 }
192 SkDebugf("\n");
193 }
194
114 static void debugShowCubicIntersection(int pts, const SkIntersectionHelper& wt, 195 static void debugShowCubicIntersection(int pts, const SkIntersectionHelper& wt,
115 const SkIntersectionHelper& wn, const SkIntersections& i) { 196 const SkIntersectionHelper& wn, const SkIntersections& i) {
116 SkASSERT(i.used() == pts); 197 SkASSERT(i.used() == pts);
117 if (!pts) { 198 if (!pts) {
118 SkDebugf("%s no intersect " CUBIC_DEBUG_STR " " CUBIC_DEBUG_STR "\n", 199 SkDebugf("%s no intersect " CUBIC_DEBUG_STR " " CUBIC_DEBUG_STR "\n",
119 __FUNCTION__, CUBIC_DEBUG_DATA(wt.pts()), CUBIC_DEBUG_DATA(wn.pt s())); 200 __FUNCTION__, CUBIC_DEBUG_DATA(wt.pts()), CUBIC_DEBUG_DATA(wn.pt s()));
120 return; 201 return;
121 } 202 }
122 SkDebugf("%s " T_DEBUG_STR(wtTs, 0) " " CUBIC_DEBUG_STR " " PT_DEBUG_STR, __ FUNCTION__, 203 SkDebugf("%s " T_DEBUG_STR(wtTs, 0) " " CUBIC_DEBUG_STR " " PT_DEBUG_STR, __ FUNCTION__,
123 i[0][0], CUBIC_DEBUG_DATA(wt.pts()), PT_DEBUG_DATA(i, 0)); 204 i[0][0], CUBIC_DEBUG_DATA(wt.pts()), PT_DEBUG_DATA(i, 0));
(...skipping 13 matching lines...) Expand all
137 } 218 }
138 219
139 static void debugShowQuadLineIntersection(int , const SkIntersectionHelper& , 220 static void debugShowQuadLineIntersection(int , const SkIntersectionHelper& ,
140 const SkIntersectionHelper& , const SkIntersections& ) { 221 const SkIntersectionHelper& , const SkIntersections& ) {
141 } 222 }
142 223
143 static void debugShowQuadIntersection(int , const SkIntersectionHelper& , 224 static void debugShowQuadIntersection(int , const SkIntersectionHelper& ,
144 const SkIntersectionHelper& , const SkIntersections& ) { 225 const SkIntersectionHelper& , const SkIntersections& ) {
145 } 226 }
146 227
228 static void debugShowConicLineIntersection(int , const SkIntersectionHelper& ,
229 const SkIntersectionHelper& , const SkIntersections& ) {
230 }
231
232 static void debugShowConicQuadIntersection(int , const SkIntersectionHelper& ,
233 const SkIntersectionHelper& , const SkIntersections& ) {
234 }
235
236 static void debugShowConicIntersection(int , const SkIntersectionHelper& ,
237 const SkIntersectionHelper& , const SkIntersections& ) {
238 }
239
147 static void debugShowCubicLineIntersection(int , const SkIntersectionHelper& , 240 static void debugShowCubicLineIntersection(int , const SkIntersectionHelper& ,
148 const SkIntersectionHelper& , const SkIntersections& ) { 241 const SkIntersectionHelper& , const SkIntersections& ) {
149 } 242 }
150 243
151 static void debugShowCubicQuadIntersection(int , const SkIntersectionHelper& , 244 static void debugShowCubicQuadIntersection(int , const SkIntersectionHelper& ,
152 const SkIntersectionHelper& , const SkIntersections& ) { 245 const SkIntersectionHelper& , const SkIntersections& ) {
153 } 246 }
154 247
248 static void debugShowCubicConicIntersection(int , const SkIntersectionHelper& ,
249 const SkIntersectionHelper& , const SkIntersections& ) {
250 }
251
155 static void debugShowCubicIntersection(int , const SkIntersectionHelper& , 252 static void debugShowCubicIntersection(int , const SkIntersectionHelper& ,
156 const SkIntersectionHelper& , const SkIntersections& ) { 253 const SkIntersectionHelper& , const SkIntersections& ) {
157 } 254 }
158 #endif 255 #endif
159 256
160 bool AddIntersectTs(SkOpContour* test, SkOpContour* next, SkOpCoincidence* coinc idence, 257 bool AddIntersectTs(SkOpContour* test, SkOpContour* next, SkOpCoincidence* coinc idence,
161 SkChunkAlloc* allocator) { 258 SkChunkAlloc* allocator) {
162 if (test != next) { 259 if (test != next) {
163 if (AlmostLessUlps(test->bounds().fBottom, next->bounds().fTop)) { 260 if (AlmostLessUlps(test->bounds().fBottom, next->bounds().fTop)) {
164 return false; 261 return false;
(...skipping 13 matching lines...) Expand all
178 if (test == next && !wn.startAfter(wt)) { 275 if (test == next && !wn.startAfter(wt)) {
179 continue; 276 continue;
180 } 277 }
181 do { 278 do {
182 if (!SkPathOpsBounds::Intersects(wt.bounds(), wn.bounds())) { 279 if (!SkPathOpsBounds::Intersects(wt.bounds(), wn.bounds())) {
183 continue; 280 continue;
184 } 281 }
185 int pts = 0; 282 int pts = 0;
186 SkIntersections ts; 283 SkIntersections ts;
187 bool swap = false; 284 bool swap = false;
285 SkDQuad quad1, quad2;
286 SkDConic conic1, conic2;
287 SkDCubic cubic1, cubic2;
188 switch (wt.segmentType()) { 288 switch (wt.segmentType()) {
189 case SkIntersectionHelper::kHorizontalLine_Segment: 289 case SkIntersectionHelper::kHorizontalLine_Segment:
190 swap = true; 290 swap = true;
191 switch (wn.segmentType()) { 291 switch (wn.segmentType()) {
192 case SkIntersectionHelper::kHorizontalLine_Segment: 292 case SkIntersectionHelper::kHorizontalLine_Segment:
193 case SkIntersectionHelper::kVerticalLine_Segment: 293 case SkIntersectionHelper::kVerticalLine_Segment:
194 case SkIntersectionHelper::kLine_Segment: { 294 case SkIntersectionHelper::kLine_Segment:
195 pts = ts.lineHorizontal(wn.pts(), wt.left(), 295 pts = ts.lineHorizontal(wn.pts(), wt.left(),
196 wt.right(), wt.y(), wt.xFlipped()); 296 wt.right(), wt.y(), wt.xFlipped());
197 debugShowLineIntersection(pts, wn, wt, ts); 297 debugShowLineIntersection(pts, wn, wt, ts);
198 break; 298 break;
199 } 299 case SkIntersectionHelper::kQuad_Segment:
200 case SkIntersectionHelper::kQuad_Segment: {
201 pts = ts.quadHorizontal(wn.pts(), wt.left(), 300 pts = ts.quadHorizontal(wn.pts(), wt.left(),
202 wt.right(), wt.y(), wt.xFlipped()); 301 wt.right(), wt.y(), wt.xFlipped());
203 debugShowQuadLineIntersection(pts, wn, wt, ts); 302 debugShowQuadLineIntersection(pts, wn, wt, ts);
204 break; 303 break;
205 } 304 case SkIntersectionHelper::kConic_Segment:
206 case SkIntersectionHelper::kCubic_Segment: { 305 pts = ts.conicHorizontal(wn.pts(), wn.weight(), wt.l eft(),
306 wt.right(), wt.y(), wt.xFlipped());
307 debugShowConicLineIntersection(pts, wn, wt, ts);
308 break;
309 case SkIntersectionHelper::kCubic_Segment:
207 pts = ts.cubicHorizontal(wn.pts(), wt.left(), 310 pts = ts.cubicHorizontal(wn.pts(), wt.left(),
208 wt.right(), wt.y(), wt.xFlipped()); 311 wt.right(), wt.y(), wt.xFlipped());
209 debugShowCubicLineIntersection(pts, wn, wt, ts); 312 debugShowCubicLineIntersection(pts, wn, wt, ts);
210 break; 313 break;
211 }
212 default: 314 default:
213 SkASSERT(0); 315 SkASSERT(0);
214 } 316 }
215 break; 317 break;
216 case SkIntersectionHelper::kVerticalLine_Segment: 318 case SkIntersectionHelper::kVerticalLine_Segment:
217 swap = true; 319 swap = true;
218 switch (wn.segmentType()) { 320 switch (wn.segmentType()) {
219 case SkIntersectionHelper::kHorizontalLine_Segment: 321 case SkIntersectionHelper::kHorizontalLine_Segment:
220 case SkIntersectionHelper::kVerticalLine_Segment: 322 case SkIntersectionHelper::kVerticalLine_Segment:
221 case SkIntersectionHelper::kLine_Segment: { 323 case SkIntersectionHelper::kLine_Segment: {
222 pts = ts.lineVertical(wn.pts(), wt.top(), 324 pts = ts.lineVertical(wn.pts(), wt.top(),
223 wt.bottom(), wt.x(), wt.yFlipped()); 325 wt.bottom(), wt.x(), wt.yFlipped());
224 debugShowLineIntersection(pts, wn, wt, ts); 326 debugShowLineIntersection(pts, wn, wt, ts);
225 break; 327 break;
226 } 328 }
227 case SkIntersectionHelper::kQuad_Segment: { 329 case SkIntersectionHelper::kQuad_Segment: {
228 pts = ts.quadVertical(wn.pts(), wt.top(), 330 pts = ts.quadVertical(wn.pts(), wt.top(),
229 wt.bottom(), wt.x(), wt.yFlipped()); 331 wt.bottom(), wt.x(), wt.yFlipped());
230 debugShowQuadLineIntersection(pts, wn, wt, ts); 332 debugShowQuadLineIntersection(pts, wn, wt, ts);
231 break; 333 break;
232 } 334 }
335 case SkIntersectionHelper::kConic_Segment: {
336 pts = ts.conicVertical(wn.pts(), wn.weight(), wt.top (),
337 wt.bottom(), wt.x(), wt.yFlipped());
338 debugShowConicLineIntersection(pts, wn, wt, ts);
339 break;
340 }
233 case SkIntersectionHelper::kCubic_Segment: { 341 case SkIntersectionHelper::kCubic_Segment: {
234 pts = ts.cubicVertical(wn.pts(), wt.top(), 342 pts = ts.cubicVertical(wn.pts(), wt.top(),
235 wt.bottom(), wt.x(), wt.yFlipped()); 343 wt.bottom(), wt.x(), wt.yFlipped());
236 debugShowCubicLineIntersection(pts, wn, wt, ts); 344 debugShowCubicLineIntersection(pts, wn, wt, ts);
237 break; 345 break;
238 } 346 }
239 default: 347 default:
240 SkASSERT(0); 348 SkASSERT(0);
241 } 349 }
242 break; 350 break;
243 case SkIntersectionHelper::kLine_Segment: 351 case SkIntersectionHelper::kLine_Segment:
244 switch (wn.segmentType()) { 352 switch (wn.segmentType()) {
245 case SkIntersectionHelper::kHorizontalLine_Segment: 353 case SkIntersectionHelper::kHorizontalLine_Segment:
246 pts = ts.lineHorizontal(wt.pts(), wn.left(), 354 pts = ts.lineHorizontal(wt.pts(), wn.left(),
247 wn.right(), wn.y(), wn.xFlipped()); 355 wn.right(), wn.y(), wn.xFlipped());
248 debugShowLineIntersection(pts, wt, wn, ts); 356 debugShowLineIntersection(pts, wt, wn, ts);
249 break; 357 break;
250 case SkIntersectionHelper::kVerticalLine_Segment: 358 case SkIntersectionHelper::kVerticalLine_Segment:
251 pts = ts.lineVertical(wt.pts(), wn.top(), 359 pts = ts.lineVertical(wt.pts(), wn.top(),
252 wn.bottom(), wn.x(), wn.yFlipped()); 360 wn.bottom(), wn.x(), wn.yFlipped());
253 debugShowLineIntersection(pts, wt, wn, ts); 361 debugShowLineIntersection(pts, wt, wn, ts);
254 break; 362 break;
255 case SkIntersectionHelper::kLine_Segment: { 363 case SkIntersectionHelper::kLine_Segment:
256 pts = ts.lineLine(wt.pts(), wn.pts()); 364 pts = ts.lineLine(wt.pts(), wn.pts());
257 debugShowLineIntersection(pts, wt, wn, ts); 365 debugShowLineIntersection(pts, wt, wn, ts);
258 break; 366 break;
259 } 367 case SkIntersectionHelper::kQuad_Segment:
260 case SkIntersectionHelper::kQuad_Segment: {
261 swap = true; 368 swap = true;
262 pts = ts.quadLine(wn.pts(), wt.pts()); 369 pts = ts.quadLine(wn.pts(), wt.pts());
263 debugShowQuadLineIntersection(pts, wn, wt, ts); 370 debugShowQuadLineIntersection(pts, wn, wt, ts);
264 break; 371 break;
265 } 372 case SkIntersectionHelper::kConic_Segment:
266 case SkIntersectionHelper::kCubic_Segment: { 373 swap = true;
374 pts = ts.conicLine(wn.pts(), wn.weight(), wt.pts());
375 debugShowConicLineIntersection(pts, wn, wt, ts);
376 break;
377 case SkIntersectionHelper::kCubic_Segment:
267 swap = true; 378 swap = true;
268 pts = ts.cubicLine(wn.pts(), wt.pts()); 379 pts = ts.cubicLine(wn.pts(), wt.pts());
269 debugShowCubicLineIntersection(pts, wn, wt, ts); 380 debugShowCubicLineIntersection(pts, wn, wt, ts);
270 break; 381 break;
271 }
272 default: 382 default:
273 SkASSERT(0); 383 SkASSERT(0);
274 } 384 }
275 break; 385 break;
276 case SkIntersectionHelper::kQuad_Segment: 386 case SkIntersectionHelper::kQuad_Segment:
277 switch (wn.segmentType()) { 387 switch (wn.segmentType()) {
278 case SkIntersectionHelper::kHorizontalLine_Segment: 388 case SkIntersectionHelper::kHorizontalLine_Segment:
279 pts = ts.quadHorizontal(wt.pts(), wn.left(), 389 pts = ts.quadHorizontal(wt.pts(), wn.left(),
280 wn.right(), wn.y(), wn.xFlipped()); 390 wn.right(), wn.y(), wn.xFlipped());
281 debugShowQuadLineIntersection(pts, wt, wn, ts); 391 debugShowQuadLineIntersection(pts, wt, wn, ts);
282 break; 392 break;
283 case SkIntersectionHelper::kVerticalLine_Segment: 393 case SkIntersectionHelper::kVerticalLine_Segment:
284 pts = ts.quadVertical(wt.pts(), wn.top(), 394 pts = ts.quadVertical(wt.pts(), wn.top(),
285 wn.bottom(), wn.x(), wn.yFlipped()); 395 wn.bottom(), wn.x(), wn.yFlipped());
286 debugShowQuadLineIntersection(pts, wt, wn, ts); 396 debugShowQuadLineIntersection(pts, wt, wn, ts);
287 break; 397 break;
288 case SkIntersectionHelper::kLine_Segment: { 398 case SkIntersectionHelper::kLine_Segment:
289 pts = ts.quadLine(wt.pts(), wn.pts()); 399 pts = ts.quadLine(wt.pts(), wn.pts());
290 debugShowQuadLineIntersection(pts, wt, wn, ts); 400 debugShowQuadLineIntersection(pts, wt, wn, ts);
291 break; 401 break;
402 case SkIntersectionHelper::kQuad_Segment: {
403 pts = ts.intersect(quad1.set(wt.pts()), quad2.set(wn .pts()));
404 debugShowQuadIntersection(pts, wt, wn, ts);
405 break;
292 } 406 }
293 case SkIntersectionHelper::kQuad_Segment: { 407 case SkIntersectionHelper::kConic_Segment: {
294 SkDQuad quad1; 408 swap = true;
295 quad1.set(wt.pts()); 409 pts = ts.intersect(conic2.set(wn.pts(), wn.weight()) ,
296 SkDQuad quad2; 410 quad1.set(wt.pts()));
297 quad2.set(wn.pts()); 411 debugShowConicQuadIntersection(pts, wn, wt, ts);
298 pts = ts.intersect(quad1, quad2);
299 debugShowQuadIntersection(pts, wt, wn, ts);
300 break; 412 break;
301 } 413 }
302 case SkIntersectionHelper::kCubic_Segment: { 414 case SkIntersectionHelper::kCubic_Segment: {
303 swap = true; 415 swap = true;
304 SkDQuad quad1; 416 pts = ts.intersect(cubic2.set(wn.pts()), quad1.set(w t.pts()));
305 quad1.set(wt.pts());
306 SkDCubic cubic1 = quad1.toCubic();
307 SkDCubic cubic2;
308 cubic2.set(wn.pts());
309 pts = ts.intersect(cubic2, cubic1);
310 debugShowCubicQuadIntersection(pts, wn, wt, ts); 417 debugShowCubicQuadIntersection(pts, wn, wt, ts);
311 break; 418 break;
312 } 419 }
313 default: 420 default:
314 SkASSERT(0); 421 SkASSERT(0);
315 } 422 }
316 break; 423 break;
424 case SkIntersectionHelper::kConic_Segment:
425 switch (wn.segmentType()) {
426 case SkIntersectionHelper::kHorizontalLine_Segment:
427 pts = ts.conicHorizontal(wt.pts(), wt.weight(), wn.l eft(),
428 wn.right(), wn.y(), wn.xFlipped());
429 debugShowConicLineIntersection(pts, wt, wn, ts);
430 break;
431 case SkIntersectionHelper::kVerticalLine_Segment:
432 pts = ts.conicVertical(wt.pts(), wt.weight(), wn.top (),
433 wn.bottom(), wn.x(), wn.yFlipped());
434 debugShowConicLineIntersection(pts, wt, wn, ts);
435 break;
436 case SkIntersectionHelper::kLine_Segment:
437 pts = ts.conicLine(wt.pts(), wt.weight(), wn.pts());
438 debugShowConicLineIntersection(pts, wt, wn, ts);
439 break;
440 case SkIntersectionHelper::kQuad_Segment: {
441 pts = ts.intersect(conic1.set(wt.pts(), wt.weight()) ,
442 quad2.set(wn.pts()));
443 debugShowConicQuadIntersection(pts, wt, wn, ts);
444 break;
445 }
446 case SkIntersectionHelper::kConic_Segment: {
447 pts = ts.intersect(conic1.set(wt.pts(), wt.weight()) ,
448 conic2.set(wn.pts(), wn.weight()));
449 debugShowConicIntersection(pts, wt, wn, ts);
450 break;
451 }
452 case SkIntersectionHelper::kCubic_Segment: {
453 swap = true;
454 pts = ts.intersect(cubic2.set(wn.pts()),
455 conic1.set(wt.pts(), wt.weight()));
456 debugShowCubicConicIntersection(pts, wn, wt, ts);
457 break;
458 }
459 }
460 break;
317 case SkIntersectionHelper::kCubic_Segment: 461 case SkIntersectionHelper::kCubic_Segment:
318 switch (wn.segmentType()) { 462 switch (wn.segmentType()) {
319 case SkIntersectionHelper::kHorizontalLine_Segment: 463 case SkIntersectionHelper::kHorizontalLine_Segment:
320 pts = ts.cubicHorizontal(wt.pts(), wn.left(), 464 pts = ts.cubicHorizontal(wt.pts(), wn.left(),
321 wn.right(), wn.y(), wn.xFlipped()); 465 wn.right(), wn.y(), wn.xFlipped());
322 debugShowCubicLineIntersection(pts, wt, wn, ts); 466 debugShowCubicLineIntersection(pts, wt, wn, ts);
323 break; 467 break;
324 case SkIntersectionHelper::kVerticalLine_Segment: 468 case SkIntersectionHelper::kVerticalLine_Segment:
325 pts = ts.cubicVertical(wt.pts(), wn.top(), 469 pts = ts.cubicVertical(wt.pts(), wn.top(),
326 wn.bottom(), wn.x(), wn.yFlipped()); 470 wn.bottom(), wn.x(), wn.yFlipped());
327 debugShowCubicLineIntersection(pts, wt, wn, ts); 471 debugShowCubicLineIntersection(pts, wt, wn, ts);
328 break; 472 break;
329 case SkIntersectionHelper::kLine_Segment: { 473 case SkIntersectionHelper::kLine_Segment:
330 pts = ts.cubicLine(wt.pts(), wn.pts()); 474 pts = ts.cubicLine(wt.pts(), wn.pts());
331 debugShowCubicLineIntersection(pts, wt, wn, ts); 475 debugShowCubicLineIntersection(pts, wt, wn, ts);
332 break; 476 break;
333 }
334 case SkIntersectionHelper::kQuad_Segment: { 477 case SkIntersectionHelper::kQuad_Segment: {
335 SkDCubic cubic1; 478 pts = ts.intersect(cubic1.set(wt.pts()), quad2.set(w n.pts()));
336 cubic1.set(wt.pts());
337 SkDQuad quad2;
338 quad2.set(wn.pts());
339 SkDCubic cubic2 = quad2.toCubic();
340 pts = ts.intersect(cubic1, cubic2);
341 debugShowCubicQuadIntersection(pts, wt, wn, ts); 479 debugShowCubicQuadIntersection(pts, wt, wn, ts);
342 break; 480 break;
343 } 481 }
482 case SkIntersectionHelper::kConic_Segment: {
483 pts = ts.intersect(cubic1.set(wt.pts()),
484 conic2.set(wn.pts(), wn.weight()));
485 debugShowCubicConicIntersection(pts, wt, wn, ts);
486 break;
487 }
344 case SkIntersectionHelper::kCubic_Segment: { 488 case SkIntersectionHelper::kCubic_Segment: {
345 SkDCubic cubic1; 489 pts = ts.intersect(cubic1.set(wt.pts()), cubic2.set( wn.pts()));
346 cubic1.set(wt.pts());
347 SkDCubic cubic2;
348 cubic2.set(wn.pts());
349 pts = ts.intersect(cubic1, cubic2);
350 debugShowCubicIntersection(pts, wt, wn, ts); 490 debugShowCubicIntersection(pts, wt, wn, ts);
351 break; 491 break;
352 } 492 }
353 default: 493 default:
354 SkASSERT(0); 494 SkASSERT(0);
355 } 495 }
356 break; 496 break;
357 default: 497 default:
358 SkASSERT(0); 498 SkASSERT(0);
359 } 499 }
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 coincidence->add(coinPtT[0], testTAt, coinPtT[1], nextTAt, alloc ator); 540 coincidence->add(coinPtT[0], testTAt, coinPtT[1], nextTAt, alloc ator);
401 wt.segment()->debugValidate(); 541 wt.segment()->debugValidate();
402 wn.segment()->debugValidate(); 542 wn.segment()->debugValidate();
403 coinIndex = -1; 543 coinIndex = -1;
404 } 544 }
405 SkASSERT(coinIndex < 0); // expect coincidence to be paired 545 SkASSERT(coinIndex < 0); // expect coincidence to be paired
406 } while (wn.advance()); 546 } while (wn.advance());
407 } while (wt.advance()); 547 } while (wt.advance());
408 return true; 548 return true;
409 } 549 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698