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

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

Issue 633393002: harden pathops for pathological test (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: exclude new test that asserts in debug Created 6 years, 1 month 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
« no previous file with comments | « src/pathops/SkOpAngle.h ('k') | src/pathops/SkOpContour.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "SkIntersections.h" 7 #include "SkIntersections.h"
8 #include "SkOpAngle.h" 8 #include "SkOpAngle.h"
9 #include "SkOpSegment.h" 9 #include "SkOpSegment.h"
10 #include "SkPathOpsCurve.h" 10 #include "SkPathOpsCurve.h"
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after
402 SkDLine rays[] = {{{fCurvePart[0], rh.fCurvePart[rPts]}}, 402 SkDLine rays[] = {{{fCurvePart[0], rh.fCurvePart[rPts]}},
403 {{fCurvePart[0], fCurvePart[lPts]}}}; 403 {{fCurvePart[0], fCurvePart[lPts]}}};
404 if (rays[0][1] == rays[1][1]) { 404 if (rays[0][1] == rays[1][1]) {
405 return checkParallel(rh); 405 return checkParallel(rh);
406 } 406 }
407 double smallTs[2] = {-1, -1}; 407 double smallTs[2] = {-1, -1};
408 bool limited[2] = {false, false}; 408 bool limited[2] = {false, false};
409 for (int index = 0; index < 2; ++index) { 409 for (int index = 0; index < 2; ++index) {
410 const SkOpSegment& segment = index ? *rh.fSegment : *fSegment; 410 const SkOpSegment& segment = index ? *rh.fSegment : *fSegment;
411 SkIntersections i; 411 SkIntersections i;
412 (*CurveIntersectRay[index ? rPts : lPts])(segment.pts(), rays[index], &i ); 412 int cPts = index ? rPts : lPts;
413 (*CurveIntersectRay[cPts])(segment.pts(), rays[index], &i);
414 // if the curve is a line, then the line and the ray intersect only at t heir crossing
415 if (cPts == 1) { // line
416 continue;
417 }
413 // SkASSERT(i.used() >= 1); 418 // SkASSERT(i.used() >= 1);
414 // if (i.used() <= 1) { 419 // if (i.used() <= 1) {
415 // continue; 420 // continue;
416 // } 421 // }
417 double tStart = segment.t(index ? rh.fStart : fStart); 422 double tStart = segment.t(index ? rh.fStart : fStart);
418 double tEnd = segment.t(index ? rh.fComputedEnd : fComputedEnd); 423 double tEnd = segment.t(index ? rh.fComputedEnd : fComputedEnd);
419 bool testAscends = index ? rh.fStart < rh.fComputedEnd : fStart < fCompu tedEnd; 424 bool testAscends = index ? rh.fStart < rh.fComputedEnd : fStart < fCompu tedEnd;
420 double t = testAscends ? 0 : 1; 425 double t = testAscends ? 0 : 1;
421 for (int idx2 = 0; idx2 < i.used(); ++idx2) { 426 for (int idx2 = 0; idx2 < i.used(); ++idx2) {
422 double testT = i[0][idx2]; 427 double testT = i[0][idx2];
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
650 angle->insert(this); 655 angle->insert(this);
651 } 656 }
652 return; 657 return;
653 } 658 }
654 bool singleton = NULL == fNext; 659 bool singleton = NULL == fNext;
655 if (singleton) { 660 if (singleton) {
656 fNext = this; 661 fNext = this;
657 } 662 }
658 SkOpAngle* next = fNext; 663 SkOpAngle* next = fNext;
659 if (next->fNext == this) { 664 if (next->fNext == this) {
660 if (angle->overlap(*this)) { 665 if (angle->overlap(*this)) { // angles are essentially coincident
661 return; 666 return;
662 } 667 }
663 if (singleton || angle->after(this)) { 668 if (singleton || angle->after(this)) {
664 this->fNext = angle; 669 this->fNext = angle;
665 angle->fNext = next; 670 angle->fNext = next;
666 } else { 671 } else {
667 next->fNext = angle; 672 next->fNext = angle;
668 angle->fNext = this; 673 angle->fNext = this;
669 } 674 }
670 debugValidateNext(); 675 debugValidateNext();
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
770 } 775 }
771 working = working->fNext; 776 working = working->fNext;
772 } while (working != angle); 777 } while (working != angle);
773 do { 778 do {
774 SkOpAngle* next = working->fNext; 779 SkOpAngle* next = working->fNext;
775 working->fNext = NULL; 780 working->fNext = NULL;
776 insert(working); 781 insert(working);
777 working = next; 782 working = next;
778 } while (working != angle); 783 } while (working != angle);
779 // it's likely that a pair of the angles are unorderable 784 // it's likely that a pair of the angles are unorderable
780 #if DEBUG_ANGLE 785 #if 0 && DEBUG_ANGLE
781 SkOpAngle* last = angle; 786 SkOpAngle* last = angle;
782 working = angle->fNext; 787 working = angle->fNext;
783 do { 788 do {
784 SkASSERT(last->fNext == working); 789 SkASSERT(last->fNext == working);
785 last->fNext = working->fNext; 790 last->fNext = working->fNext;
786 SkASSERT(working->after(last)); 791 SkASSERT(working->after(last));
787 last->fNext = working; 792 last->fNext = working;
788 last = working; 793 last = working;
789 working = working->fNext; 794 working = working->fNext;
790 } while (last != angle); 795 } while (last != angle);
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after
1121 angle->setID(++fCount); 1126 angle->setID(++fCount);
1122 #endif 1127 #endif
1123 return *angle; 1128 return *angle;
1124 } 1129 }
1125 1130
1126 void SkOpAngleSet::reset() { 1131 void SkOpAngleSet::reset() {
1127 if (fAngles) { 1132 if (fAngles) {
1128 fAngles->reset(); 1133 fAngles->reset();
1129 } 1134 }
1130 } 1135 }
OLDNEW
« no previous file with comments | « src/pathops/SkOpAngle.h ('k') | src/pathops/SkOpContour.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698