| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright 2015 Google Inc. | 2  * Copyright 2015 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 "SkOpCoincidence.h" | 7 #include "SkOpCoincidence.h" | 
| 8 #include "SkOpSegment.h" | 8 #include "SkOpSegment.h" | 
| 9 #include "SkPathOpsTSect.h" | 9 #include "SkPathOpsTSect.h" | 
| 10 | 10 | 
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 210 | 210 | 
| 211 /* detects overlaps of different coincident runs on same segment */ | 211 /* detects overlaps of different coincident runs on same segment */ | 
| 212 /* does not detect overlaps for pairs without any segments in common */ | 212 /* does not detect overlaps for pairs without any segments in common */ | 
| 213 bool SkOpCoincidence::addMissing(SkChunkAlloc* allocator) { | 213 bool SkOpCoincidence::addMissing(SkChunkAlloc* allocator) { | 
| 214     SkCoincidentSpans* outer = fHead; | 214     SkCoincidentSpans* outer = fHead; | 
| 215     if (!outer) { | 215     if (!outer) { | 
| 216         return true; | 216         return true; | 
| 217     } | 217     } | 
| 218     bool result; | 218     bool result; | 
| 219     fTop = outer; | 219     fTop = outer; | 
| 220     fHead = NULL; | 220     fHead = nullptr; | 
| 221     do { | 221     do { | 
| 222     // addifmissing can modify the list that this is walking | 222     // addifmissing can modify the list that this is walking | 
| 223     // maybe save head so that walker can iterate over old data unperturbed | 223     // maybe save head so that walker can iterate over old data unperturbed | 
| 224     // and addifmissing can add to head freely then add saved head in the end | 224     // and addifmissing can add to head freely then add saved head in the end | 
| 225         const SkOpSegment* outerCoin = outer->fCoinPtTStart->segment(); | 225         const SkOpSegment* outerCoin = outer->fCoinPtTStart->segment(); | 
| 226         SkASSERT(outerCoin == outer->fCoinPtTEnd->segment()); | 226         SkASSERT(outerCoin == outer->fCoinPtTEnd->segment()); | 
| 227         const SkOpSegment* outerOpp = outer->fOppPtTStart->segment(); | 227         const SkOpSegment* outerOpp = outer->fOppPtTStart->segment(); | 
| 228         SkASSERT(outerOpp == outer->fOppPtTEnd->segment()); | 228         SkASSERT(outerOpp == outer->fOppPtTEnd->segment()); | 
| 229         SkCoincidentSpans* inner = outer; | 229         SkCoincidentSpans* inner = outer; | 
| 230         while ((inner = inner->fNext)) { | 230         while ((inner = inner->fNext)) { | 
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 460                oNext = oStart; | 460                oNext = oStart; | 
| 461             } | 461             } | 
| 462             oStart = oNext->upCast(); | 462             oStart = oNext->upCast(); | 
| 463         } while (true); | 463         } while (true); | 
| 464     } while ((coin = coin->fNext)); | 464     } while ((coin = coin->fNext)); | 
| 465     return true; | 465     return true; | 
| 466 } | 466 } | 
| 467 | 467 | 
| 468 void SkOpCoincidence::detach(SkCoincidentSpans* remove) { | 468 void SkOpCoincidence::detach(SkCoincidentSpans* remove) { | 
| 469     SkCoincidentSpans* coin = fHead; | 469     SkCoincidentSpans* coin = fHead; | 
| 470     SkCoincidentSpans* prev = NULL; | 470     SkCoincidentSpans* prev = nullptr; | 
| 471     SkCoincidentSpans* next; | 471     SkCoincidentSpans* next; | 
| 472     do { | 472     do { | 
| 473         next = coin->fNext; | 473         next = coin->fNext; | 
| 474         if (coin == remove) { | 474         if (coin == remove) { | 
| 475             if (prev) { | 475             if (prev) { | 
| 476                 prev->fNext = next; | 476                 prev->fNext = next; | 
| 477             } else { | 477             } else { | 
| 478                 fHead = next; | 478                 fHead = next; | 
| 479             } | 479             } | 
| 480             break; | 480             break; | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
| 498         SkOpSpan* prev = start->prev(); | 498         SkOpSpan* prev = start->prev(); | 
| 499         SkOpPtT* oppPtT; | 499         SkOpPtT* oppPtT; | 
| 500         if (prev && (oppPtT = prev->contains(oppSegment))) { | 500         if (prev && (oppPtT = prev->contains(oppSegment))) { | 
| 501             double midT = (prev->t() + start->t()) / 2; | 501             double midT = (prev->t() + start->t()) / 2; | 
| 502             if (segment->isClose(midT, oppSegment)) { | 502             if (segment->isClose(midT, oppSegment)) { | 
| 503                 coin->fCoinPtTStart = prev->ptT(); | 503                 coin->fCoinPtTStart = prev->ptT(); | 
| 504                 coin->fOppPtTStart = oppPtT; | 504                 coin->fOppPtTStart = oppPtT; | 
| 505                 expanded = true; | 505                 expanded = true; | 
| 506             } | 506             } | 
| 507         } | 507         } | 
| 508         SkOpSpanBase* next = end->final() ? NULL : end->upCast()->next(); | 508         SkOpSpanBase* next = end->final() ? nullptr : end->upCast()->next(); | 
| 509         if (next && (oppPtT = next->contains(oppSegment))) { | 509         if (next && (oppPtT = next->contains(oppSegment))) { | 
| 510             double midT = (end->t() + next->t()) / 2; | 510             double midT = (end->t() + next->t()) / 2; | 
| 511             if (segment->isClose(midT, oppSegment)) { | 511             if (segment->isClose(midT, oppSegment)) { | 
| 512                 coin->fCoinPtTEnd = next->ptT(); | 512                 coin->fCoinPtTEnd = next->ptT(); | 
| 513                 coin->fOppPtTEnd = oppPtT; | 513                 coin->fOppPtTEnd = oppPtT; | 
| 514                 expanded = true; | 514                 expanded = true; | 
| 515             } | 515             } | 
| 516         } | 516         } | 
| 517     } while ((coin = coin->fNext)); | 517     } while ((coin = coin->fNext)); | 
| 518     return expanded; | 518     return expanded; | 
| 519 } | 519 } | 
| 520 | 520 | 
| 521 void SkOpCoincidence::findOverlaps(SkOpCoincidence* overlaps, SkChunkAlloc* allo
     cator) const { | 521 void SkOpCoincidence::findOverlaps(SkOpCoincidence* overlaps, SkChunkAlloc* allo
     cator) const { | 
| 522     overlaps->fHead = overlaps->fTop = NULL; | 522     overlaps->fHead = overlaps->fTop = nullptr; | 
| 523     SkDEBUGCODE_(overlaps->debugSetGlobalState(fDebugState)); | 523     SkDEBUGCODE_(overlaps->debugSetGlobalState(fDebugState)); | 
| 524     SkCoincidentSpans* outer = fHead; | 524     SkCoincidentSpans* outer = fHead; | 
| 525     while (outer) { | 525     while (outer) { | 
| 526         SkOpSegment* outerCoin = outer->fCoinPtTStart->segment(); | 526         SkOpSegment* outerCoin = outer->fCoinPtTStart->segment(); | 
| 527         SkOpSegment* outerOpp = outer->fOppPtTStart->segment(); | 527         SkOpSegment* outerOpp = outer->fOppPtTStart->segment(); | 
| 528         SkCoincidentSpans* inner = outer; | 528         SkCoincidentSpans* inner = outer; | 
| 529         while ((inner = inner->fNext)) { | 529         while ((inner = inner->fNext)) { | 
| 530             SkOpSegment* innerCoin = inner->fCoinPtTStart->segment(); | 530             SkOpSegment* innerCoin = inner->fCoinPtTStart->segment(); | 
| 531             if (outerCoin == innerCoin) { | 531             if (outerCoin == innerCoin) { | 
| 532                 continue;  // both winners are the same segment, so there's no a
     dditional overlap | 532                 continue;  // both winners are the same segment, so there's no a
     dditional overlap | 
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 660     *overS = SkTMax(SkTMin(coin1s->fT, coin1e->fT), SkTMin(coin2s->fT, coin2e->f
     T)); | 660     *overS = SkTMax(SkTMin(coin1s->fT, coin1e->fT), SkTMin(coin2s->fT, coin2e->f
     T)); | 
| 661     *overE = SkTMin(SkTMax(coin1s->fT, coin1e->fT), SkTMax(coin2s->fT, coin2e->f
     T)); | 661     *overE = SkTMin(SkTMax(coin1s->fT, coin1e->fT), SkTMax(coin2s->fT, coin2e->f
     T)); | 
| 662     return *overS < *overE; | 662     return *overS < *overE; | 
| 663 } | 663 } | 
| 664 | 664 | 
| 665 bool SkOpCoincidence::testForCoincidence(const SkCoincidentSpans* outer, SkOpPtT
     * testS, | 665 bool SkOpCoincidence::testForCoincidence(const SkCoincidentSpans* outer, SkOpPtT
     * testS, | 
| 666         SkOpPtT* testE) const { | 666         SkOpPtT* testE) const { | 
| 667     return testS->segment()->testForCoincidence(testS, testE, testS->span(), | 667     return testS->segment()->testForCoincidence(testS, testE, testS->span(), | 
| 668             testE->span(), outer->fCoinPtTStart->segment(), 120000);  // FIXME: 
     replace with tuned | 668             testE->span(), outer->fCoinPtTStart->segment(), 120000);  // FIXME: 
     replace with tuned | 
| 669 } | 669 } | 
| OLD | NEW | 
|---|