| 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 |