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

Unified Diff: src/pathops/SkOpSegment.cpp

Issue 400033002: update pathops core and tests (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix uninitialized variable Created 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/pathops/SkDLineIntersection.cpp ('k') | src/pathops/SkPathOpsDebug.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/pathops/SkOpSegment.cpp
diff --git a/src/pathops/SkOpSegment.cpp b/src/pathops/SkOpSegment.cpp
index 4e8b5d28d9d80c14597ab8ddad9a2199ad21d145..f6d989b18a1045fe7d7ce87002558642115d1e66 100644
--- a/src/pathops/SkOpSegment.cpp
+++ b/src/pathops/SkOpSegment.cpp
@@ -405,12 +405,14 @@ void SkOpSegment::addCurveTo(int start, int end, SkPathWriter* path, bool active
}
void SkOpSegment::addEndSpan(int endIndex) {
+ SkASSERT(span(endIndex).fT == 1 || (span(endIndex).fTiny
+ && approximately_greater_than_one(span(endIndex).fT)));
int spanCount = fTs.count();
int startIndex = endIndex - 1;
while (fTs[startIndex].fT == 1 || fTs[startIndex].fTiny) {
- ++startIndex;
- SkASSERT(startIndex < spanCount - 1);
- ++endIndex;
+ --startIndex;
+ SkASSERT(startIndex > 0);
+ --endIndex;
}
SkOpAngle& angle = fAngles.push_back();
angle.set(this, spanCount - 1, startIndex);
@@ -815,7 +817,11 @@ int SkOpSegment::addSelfT(const SkPoint& pt, double newT) {
// FIXME? assert that only one other span has a valid windValue or oppValue
void SkOpSegment::addSimpleAngle(int index) {
SkOpSpan* span = &fTs[index];
- if (index == 0) {
+ int idx;
+ int start, end;
+ if (span->fT == 0) {
+ idx = 0;
+ span = &fTs[0];
do {
if (span->fToAngle) {
SkASSERT(span->fToAngle->loopCount() == 2);
@@ -823,13 +829,15 @@ void SkOpSegment::addSimpleAngle(int index) {
span->fFromAngle = span->fToAngle->next();
return;
}
- span = &fTs[++index];
+ span = &fTs[++idx];
} while (span->fT == 0);
- SkASSERT(index == 1);
- index = 0;
- SkASSERT(!fTs[0].fTiny && fTs[1].fT > 0);
- addStartSpan(1);
+ SkASSERT(!fTs[0].fTiny && fTs[idx].fT > 0);
+ addStartSpan(idx);
+ start = 0;
+ end = idx;
} else {
+ idx = count() - 1;
+ span = &fTs[idx];
do {
if (span->fFromAngle) {
SkASSERT(span->fFromAngle->loopCount() == 2);
@@ -837,29 +845,48 @@ void SkOpSegment::addSimpleAngle(int index) {
span->fToAngle = span->fFromAngle->next();
return;
}
- span = &fTs[--index];
+ span = &fTs[--idx];
} while (span->fT == 1);
- SkASSERT(index == count() - 2);
- index = count() - 1;
- SkASSERT(!fTs[index - 1].fTiny && fTs[index - 1].fT < 1);
- addEndSpan(index);
+ SkASSERT(!fTs[idx].fTiny && fTs[idx].fT < 1);
+ addEndSpan(++idx);
+ start = idx;
+ end = count();
}
- span = &fTs[index];
- SkOpSegment* other = span->fOther;
- SkOpSpan& oSpan = other->fTs[span->fOtherIndex];
+ SkOpSegment* other;
+ SkOpSpan* oSpan;
+ index = start;
+ do {
+ span = &fTs[index];
+ other = span->fOther;
+ int oFrom = span->fOtherIndex;
+ oSpan = &other->fTs[oFrom];
+ if (oSpan->fT < 1 && oSpan->fWindValue) {
+ break;
+ }
+ if (oSpan->fT == 0) {
+ continue;
+ }
+ oFrom = other->nextExactSpan(oFrom, -1);
+ SkOpSpan* oFromSpan = &other->fTs[oFrom];
+ SkASSERT(oFromSpan->fT < 1);
+ if (oFromSpan->fWindValue) {
+ break;
+ }
+ } while (++index < end);
SkOpAngle* angle, * oAngle;
- if (index == 0) {
+ if (span->fT == 0) {
SkASSERT(span->fOtherIndex - 1 >= 0);
SkASSERT(span->fOtherT == 1);
- SkDEBUGCODE(SkOpSpan& oPrior = other->fTs[span->fOtherIndex - 1]);
+ SkDEBUGCODE(int oPriorIndex = other->nextExactSpan(span->fOtherIndex, -1));
+ SkDEBUGCODE(const SkOpSpan& oPrior = other->span(oPriorIndex));
SkASSERT(!oPrior.fTiny && oPrior.fT < 1);
other->addEndSpan(span->fOtherIndex);
angle = span->fToAngle;
- oAngle = oSpan.fFromAngle;
+ oAngle = oSpan->fFromAngle;
} else {
SkASSERT(span->fOtherIndex + 1 < other->count());
SkASSERT(span->fOtherT == 0);
- SkASSERT(!oSpan.fTiny && (other->fTs[span->fOtherIndex + 1].fT > 0
+ SkASSERT(!oSpan->fTiny && (other->fTs[span->fOtherIndex + 1].fT > 0
|| (other->fTs[span->fOtherIndex + 1].fFromAngle == NULL
&& other->fTs[span->fOtherIndex + 1].fToAngle == NULL)));
int oIndex = 1;
@@ -873,7 +900,7 @@ void SkOpSegment::addSimpleAngle(int index) {
} while (true);
other->addStartSpan(oIndex);
angle = span->fFromAngle;
- oAngle = oSpan.fToAngle;
+ oAngle = oSpan->fToAngle;
}
angle->insert(oAngle);
}
@@ -1348,7 +1375,10 @@ void SkOpSegment::addTCoincident(const SkPoint& startPt, const SkPoint& endPt, d
success = true;
break;
}
- oPeek = &other->fTs[++oPeekIndex];
+ if (++oPeekIndex == oCount) {
+ break;
+ }
+ oPeek = &other->fTs[oPeekIndex];
} while (endPt == oPeek->fPt);
}
if (success) {
@@ -3402,7 +3432,7 @@ SkOpSpan* SkOpSegment::markAndChaseWinding(const SkOpAngle* angle, int winding)
SkOpSegment* other = this;
while ((other = other->nextChase(&index, &step, &min, &last))) {
if (other->fTs[min].fWindSum != SK_MinS32) {
- SkASSERT(other->fTs[min].fWindSum == winding);
+// SkASSERT(other->fTs[min].fWindSum == winding);
SkASSERT(!last);
break;
}
« no previous file with comments | « src/pathops/SkDLineIntersection.cpp ('k') | src/pathops/SkPathOpsDebug.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698