| Index: src/pathops/SkPathOpsPostSect.cpp
|
| diff --git a/src/pathops/SkPathOpsPostSect.cpp b/src/pathops/SkPathOpsPostSect.cpp
|
| old mode 100644
|
| new mode 100755
|
| index 15a1900ce3b1ad48a8a62768d5564379873cda51..eb2d1ab3ab1c98f63b5bc1c24bf6c01de590169a
|
| --- a/src/pathops/SkPathOpsPostSect.cpp
|
| +++ b/src/pathops/SkPathOpsPostSect.cpp
|
| @@ -17,8 +17,8 @@ SkOpContour* SkOpPtT::contour() const {
|
| return segment()->contour();
|
| }
|
|
|
| -SkOpDebugState* SkOpPtT::debugState() const {
|
| - return PATH_OPS_DEBUG_RELEASE(contour()->debugState(), NULL);
|
| +SkOpGlobalState* SkOpPtT::globalState() const {
|
| + return PATH_OPS_DEBUG_RELEASE(contour()->globalState(), NULL);
|
| }
|
|
|
| void SkOpPtT::init(SkOpSpanBase* span, double t, const SkPoint& pt, bool duplicate) {
|
| @@ -28,7 +28,7 @@ void SkOpPtT::init(SkOpSpanBase* span, double t, const SkPoint& pt, bool duplica
|
| fNext = this;
|
| fDuplicatePt = duplicate;
|
| fDeleted = false;
|
| - PATH_OPS_DEBUG_CODE(fID = ++span->debugState()->fPtTID);
|
| + PATH_OPS_DEBUG_CODE(fID = ++span->globalState()->fPtTID);
|
| }
|
|
|
| bool SkOpPtT::onEnd() const {
|
| @@ -45,7 +45,7 @@ SkOpPtT* SkOpPtT::remove() {
|
| do {
|
| SkOpPtT* next = prev->fNext;
|
| if (next == this) {
|
| - prev->removeNext();
|
| + prev->removeNext(this);
|
| fDeleted = true;
|
| return prev;
|
| }
|
| @@ -55,14 +55,14 @@ SkOpPtT* SkOpPtT::remove() {
|
| return NULL;
|
| }
|
|
|
| -void SkOpPtT::removeNext() {
|
| +void SkOpPtT::removeNext(SkOpPtT* kept) {
|
| SkASSERT(this->fNext);
|
| SkOpPtT* next = this->fNext;
|
| this->fNext = next->fNext;
|
| SkOpSpanBase* span = next->span();
|
| next->setDeleted();
|
| if (span->ptT() == next) {
|
| - span->upCast()->detach();
|
| + span->upCast()->detach(kept);
|
| }
|
| }
|
|
|
| @@ -199,7 +199,7 @@ void SkOpSpanBase::alignInner() {
|
| // omit aliases that alignment makes redundant
|
| if ((!ptT->alias() || test->alias()) && (ptT->onEnd() || !test->onEnd())) {
|
| SkASSERT(test->alias());
|
| - prev->removeNext();
|
| + prev->removeNext(ptT);
|
| test = prev;
|
| } else {
|
| SkASSERT(ptT->alias());
|
| @@ -239,8 +239,8 @@ SkOpContour* SkOpSpanBase::contour() const {
|
| return segment()->contour();
|
| }
|
|
|
| -SkOpDebugState* SkOpSpanBase::debugState() const {
|
| - return PATH_OPS_DEBUG_RELEASE(contour()->debugState(), NULL);
|
| +SkOpGlobalState* SkOpSpanBase::globalState() const {
|
| + return PATH_OPS_DEBUG_RELEASE(contour()->globalState(), NULL);
|
| }
|
|
|
| void SkOpSpanBase::initBase(SkOpSegment* segment, SkOpSpan* prev, double t, const SkPoint& pt) {
|
| @@ -252,7 +252,7 @@ void SkOpSpanBase::initBase(SkOpSegment* segment, SkOpSpan* prev, double t, cons
|
| fAligned = true;
|
| fChased = false;
|
| PATH_OPS_DEBUG_CODE(fCount = 1);
|
| - PATH_OPS_DEBUG_CODE(fID = ++debugState()->fSpanID);
|
| + PATH_OPS_DEBUG_CODE(fID = ++globalState()->fSpanID);
|
| }
|
|
|
| // this pair of spans share a common t value or point; merge them and eliminate duplicates
|
| @@ -261,7 +261,7 @@ void SkOpSpanBase::merge(SkOpSpan* span) {
|
| SkOpPtT* spanPtT = span->ptT();
|
| SkASSERT(this->t() != spanPtT->fT);
|
| SkASSERT(!zero_or_one(spanPtT->fT));
|
| - span->detach();
|
| + span->detach(this->ptT());
|
| SkOpPtT* remainder = spanPtT->next();
|
| ptT()->insert(spanPtT);
|
| while (remainder != spanPtT) {
|
| @@ -304,7 +304,7 @@ bool SkOpSpan::containsCoincidence(const SkOpSegment* segment) const {
|
| return false;
|
| }
|
|
|
| -void SkOpSpan::detach() {
|
| +void SkOpSpan::detach(SkOpPtT* kept) {
|
| SkASSERT(!final());
|
| SkOpSpan* prev = this->prev();
|
| SkASSERT(prev);
|
| @@ -313,6 +313,9 @@ void SkOpSpan::detach() {
|
| prev->setNext(next);
|
| next->setPrev(prev);
|
| this->segment()->detach(this);
|
| + if (this->coincident()) {
|
| + this->globalState()->fCoincidence->fixUp(this->ptT(), kept);
|
| + }
|
| this->ptT()->setDeleted();
|
| }
|
|
|
|
|