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

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

Issue 2128633003: pathops coincidence and security rewrite (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: require resulting t to be between 0 and 1 Created 4 years, 5 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 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 247
248 static void debugShowCubicConicIntersection(int , const SkIntersectionHelper& , 248 static void debugShowCubicConicIntersection(int , const SkIntersectionHelper& ,
249 const SkIntersectionHelper& , const SkIntersections& ) { 249 const SkIntersectionHelper& , const SkIntersections& ) {
250 } 250 }
251 251
252 static void debugShowCubicIntersection(int , const SkIntersectionHelper& , 252 static void debugShowCubicIntersection(int , const SkIntersectionHelper& ,
253 const SkIntersectionHelper& , const SkIntersections& ) { 253 const SkIntersectionHelper& , const SkIntersections& ) {
254 } 254 }
255 #endif 255 #endif
256 256
257 bool AddIntersectTs(SkOpContour* test, SkOpContour* next, SkOpCoincidence* coinc idence, 257 bool AddIntersectTs(SkOpContour* test, SkOpContour* next, SkOpCoincidence* coinc idence) {
258 SkChunkAlloc* allocator) {
259 if (test != next) { 258 if (test != next) {
260 if (AlmostLessUlps(test->bounds().fBottom, next->bounds().fTop)) { 259 if (AlmostLessUlps(test->bounds().fBottom, next->bounds().fTop)) {
261 return false; 260 return false;
262 } 261 }
263 // OPTIMIZATION: outset contour bounds a smidgen instead? 262 // OPTIMIZATION: outset contour bounds a smidgen instead?
264 if (!SkPathOpsBounds::Intersects(test->bounds(), next->bounds())) { 263 if (!SkPathOpsBounds::Intersects(test->bounds(), next->bounds())) {
265 return true; 264 return true;
266 } 265 }
267 } 266 }
268 SkIntersectionHelper wt; 267 SkIntersectionHelper wt;
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 } 498 }
500 #if DEBUG_T_SECT_LOOP_COUNT 499 #if DEBUG_T_SECT_LOOP_COUNT
501 test->globalState()->debugAddLoopCount(&ts, wt, wn); 500 test->globalState()->debugAddLoopCount(&ts, wt, wn);
502 #endif 501 #endif
503 int coinIndex = -1; 502 int coinIndex = -1;
504 SkOpPtT* coinPtT[2]; 503 SkOpPtT* coinPtT[2];
505 for (int pt = 0; pt < pts; ++pt) { 504 for (int pt = 0; pt < pts; ++pt) {
506 SkASSERT(ts[0][pt] >= 0 && ts[0][pt] <= 1); 505 SkASSERT(ts[0][pt] >= 0 && ts[0][pt] <= 1);
507 SkASSERT(ts[1][pt] >= 0 && ts[1][pt] <= 1); 506 SkASSERT(ts[1][pt] >= 0 && ts[1][pt] <= 1);
508 wt.segment()->debugValidate(); 507 wt.segment()->debugValidate();
509 SkOpPtT* testTAt = wt.segment()->addT(ts[swap][pt], SkOpSegment: :kAllowAlias, 508 SkOpPtT* testTAt = wt.segment()->addT(ts[swap][pt], SkOpSegment: :kAllowAliasMatch,
510 allocator); 509 nullptr);
511 wn.segment()->debugValidate(); 510 wn.segment()->debugValidate();
512 SkOpPtT* nextTAt = wn.segment()->addT(ts[!swap][pt], SkOpSegment ::kAllowAlias, 511 SkOpPtT* nextTAt = wn.segment()->addT(ts[!swap][pt], SkOpSegment ::kAllowAliasMatch,
513 allocator); 512 nullptr);
514 testTAt->addOpp(nextTAt); 513 if (testTAt->addOpp(nextTAt)) {
514 testTAt->span()->checkForCollapsedCoincidence();
515 }
515 if (testTAt->fPt != nextTAt->fPt) { 516 if (testTAt->fPt != nextTAt->fPt) {
516 testTAt->span()->unaligned(); 517 testTAt->span()->unaligned();
517 nextTAt->span()->unaligned(); 518 nextTAt->span()->unaligned();
518 } 519 }
519 wt.segment()->debugValidate(); 520 wt.segment()->debugValidate();
520 wn.segment()->debugValidate(); 521 wn.segment()->debugValidate();
521 if (!ts.isCoincident(pt)) { 522 if (!ts.isCoincident(pt)) {
522 continue; 523 continue;
523 } 524 }
524 if (coinIndex < 0) { 525 if (coinIndex < 0) {
525 coinPtT[0] = testTAt; 526 coinPtT[0] = testTAt;
526 coinPtT[1] = nextTAt; 527 coinPtT[1] = nextTAt;
527 coinIndex = pt; 528 coinIndex = pt;
528 continue; 529 continue;
529 } 530 }
530 if (coinPtT[0]->span() == testTAt->span()) { 531 if (coinPtT[0]->span() == testTAt->span()) {
531 coinIndex = -1; 532 coinIndex = -1;
532 continue; 533 continue;
533 } 534 }
534 if (coinPtT[1]->span() == nextTAt->span()) { 535 if (coinPtT[1]->span() == nextTAt->span()) {
535 coinIndex = -1; // coincidence span collapsed 536 coinIndex = -1; // coincidence span collapsed
536 continue; 537 continue;
537 } 538 }
538 if (swap) { 539 if (swap) {
539 SkTSwap(coinPtT[0], coinPtT[1]); 540 SkTSwap(coinPtT[0], coinPtT[1]);
540 SkTSwap(testTAt, nextTAt); 541 SkTSwap(testTAt, nextTAt);
541 } 542 }
542 SkASSERT(coinPtT[0]->span()->t() < testTAt->span()->t()); 543 SkASSERT(coinPtT[0]->span()->t() < testTAt->span()->t());
543 coincidence->add(coinPtT[0], testTAt, coinPtT[1], nextTAt, alloc ator); 544 coincidence->add(coinPtT[0], testTAt, coinPtT[1], nextTAt);
544 wt.segment()->debugValidate(); 545 wt.segment()->debugValidate();
545 wn.segment()->debugValidate(); 546 wn.segment()->debugValidate();
546 coinIndex = -1; 547 coinIndex = -1;
547 } 548 }
548 SkASSERT(coinIndex < 0); // expect coincidence to be paired 549 SkASSERT(coinIndex < 0); // expect coincidence to be paired
549 } while (wn.advance()); 550 } while (wn.advance());
550 } while (wt.advance()); 551 } while (wt.advance());
551 return true; 552 return true;
552 } 553 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698