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

Side by Side Diff: src/pathops/SkPathOpsTSect.h

Issue 1316233002: Style Change: NULL->nullptr (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: 2015-08-27 (Thursday) 10:25:06 EDT Created 5 years, 3 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 unified diff | Download patch
« no previous file with comments | « src/pathops/SkPathOpsSimplify.cpp ('k') | src/pathops/SkPathOpsTightBounds.cpp » ('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 2014 Google Inc. 2 * Copyright 2014 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 7
8 #include "SkChunkAlloc.h" 8 #include "SkChunkAlloc.h"
9 #include "SkPathOpsBounds.h" 9 #include "SkPathOpsBounds.h"
10 #include "SkPathOpsRect.h" 10 #include "SkPathOpsRect.h"
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 105
106 bool hasOppT(double t) const { 106 bool hasOppT(double t) const {
107 return SkToBool(oppT(t)); 107 return SkToBool(oppT(t));
108 } 108 }
109 109
110 int hullsIntersect(SkTSpan<OppCurve, TCurve>* span, bool* start, bool* oppSt art); 110 int hullsIntersect(SkTSpan<OppCurve, TCurve>* span, bool* start, bool* oppSt art);
111 void init(const TCurve& ); 111 void init(const TCurve& );
112 void initBounds(const TCurve& ); 112 void initBounds(const TCurve& );
113 113
114 bool isBounded() const { 114 bool isBounded() const {
115 return fBounded != NULL; 115 return fBounded != nullptr;
116 } 116 }
117 117
118 bool linearsIntersect(SkTSpan<OppCurve, TCurve>* span); 118 bool linearsIntersect(SkTSpan<OppCurve, TCurve>* span);
119 double linearT(const SkDPoint& ) const; 119 double linearT(const SkDPoint& ) const;
120 120
121 void markCoincident() { 121 void markCoincident() {
122 fCoinStart.markCoincident(); 122 fCoinStart.markCoincident();
123 fCoinEnd.markCoincident(); 123 fCoinEnd.markCoincident();
124 } 124 }
125 125
126 const SkTSpan* next() const { 126 const SkTSpan* next() const {
127 return fNext; 127 return fNext;
128 } 128 }
129 129
130 bool onlyEndPointsInCommon(const SkTSpan<OppCurve, TCurve>* opp, bool* start , 130 bool onlyEndPointsInCommon(const SkTSpan<OppCurve, TCurve>* opp, bool* start ,
131 bool* oppStart, bool* ptsInCommon); 131 bool* oppStart, bool* ptsInCommon);
132 132
133 const TCurve& part() const { 133 const TCurve& part() const {
134 return fPart; 134 return fPart;
135 } 135 }
136 136
137 bool removeAllBounded(); 137 bool removeAllBounded();
138 bool removeBounded(const SkTSpan<OppCurve, TCurve>* opp); 138 bool removeBounded(const SkTSpan<OppCurve, TCurve>* opp);
139 139
140 void reset() { 140 void reset() {
141 fBounded = NULL; 141 fBounded = nullptr;
142 } 142 }
143 143
144 void resetBounds(const TCurve& curve) { 144 void resetBounds(const TCurve& curve) {
145 fIsLinear = fIsLine = false; 145 fIsLinear = fIsLine = false;
146 initBounds(curve); 146 initBounds(curve);
147 } 147 }
148 148
149 bool split(SkTSpan* work, SkChunkAlloc* heap) { 149 bool split(SkTSpan* work, SkChunkAlloc* heap) {
150 return splitAt(work, (work->fStartT + work->fEndT) * 0.5, heap); 150 return splitAt(work, (work->fStartT + work->fEndT) * 0.5, heap);
151 } 151 }
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 class SkTSect { 200 class SkTSect {
201 public: 201 public:
202 SkTSect(const TCurve& c PATH_OPS_DEBUG_T_SECT_PARAMS(int id)); 202 SkTSect(const TCurve& c PATH_OPS_DEBUG_T_SECT_PARAMS(int id));
203 static void BinarySearch(SkTSect* sect1, SkTSect<OppCurve, TCurve>* sect2, 203 static void BinarySearch(SkTSect* sect1, SkTSect<OppCurve, TCurve>* sect2,
204 SkIntersections* intersections); 204 SkIntersections* intersections);
205 205
206 // for testing only 206 // for testing only
207 bool debugHasBounded(const SkTSpan<OppCurve, TCurve>* ) const; 207 bool debugHasBounded(const SkTSpan<OppCurve, TCurve>* ) const;
208 208
209 const SkTSect<OppCurve, TCurve>* debugOpp() const { 209 const SkTSect<OppCurve, TCurve>* debugOpp() const {
210 return SkDEBUGRELEASE(fOppSect, NULL); 210 return SkDEBUGRELEASE(fOppSect, nullptr);
211 } 211 }
212 212
213 const SkTSpan<TCurve, OppCurve>* debugSpan(int id) const; 213 const SkTSpan<TCurve, OppCurve>* debugSpan(int id) const;
214 const SkTSpan<TCurve, OppCurve>* debugT(double t) const; 214 const SkTSpan<TCurve, OppCurve>* debugT(double t) const;
215 void dump() const; 215 void dump() const;
216 void dumpBoth(SkTSect<OppCurve, TCurve>* ) const; 216 void dumpBoth(SkTSect<OppCurve, TCurve>* ) const;
217 void dumpBounded(int id) const; 217 void dumpBounded(int id) const;
218 void dumpBounds() const; 218 void dumpBounds() const;
219 void dumpCoin() const; 219 void dumpCoin() const;
220 void dumpCoinCurves() const; 220 void dumpCoinCurves() const;
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
445 do { 445 do {
446 if (between(work->fStartT, t, work->fEndT)) { 446 if (between(work->fStartT, t, work->fEndT)) {
447 return true; 447 return true;
448 } 448 }
449 } while ((work = work->fNext)); 449 } while ((work = work->fNext));
450 return false; 450 return false;
451 } 451 }
452 452
453 template<typename TCurve, typename OppCurve> 453 template<typename TCurve, typename OppCurve>
454 const SkTSect<OppCurve, TCurve>* SkTSpan<TCurve, OppCurve>::debugOpp() const { 454 const SkTSect<OppCurve, TCurve>* SkTSpan<TCurve, OppCurve>::debugOpp() const {
455 return SkDEBUGRELEASE(fDebugSect->debugOpp(), NULL); 455 return SkDEBUGRELEASE(fDebugSect->debugOpp(), nullptr);
456 } 456 }
457 457
458 template<typename TCurve, typename OppCurve> 458 template<typename TCurve, typename OppCurve>
459 SkTSpan<OppCurve, TCurve>* SkTSpan<TCurve, OppCurve>::findOppSpan( 459 SkTSpan<OppCurve, TCurve>* SkTSpan<TCurve, OppCurve>::findOppSpan(
460 const SkTSpan<OppCurve, TCurve>* opp) const { 460 const SkTSpan<OppCurve, TCurve>* opp) const {
461 SkTSpanBounded<OppCurve, TCurve>* bounded = fBounded; 461 SkTSpanBounded<OppCurve, TCurve>* bounded = fBounded;
462 while (bounded) { 462 while (bounded) {
463 SkTSpan<OppCurve, TCurve>* test = bounded->fBounded; 463 SkTSpan<OppCurve, TCurve>* test = bounded->fBounded;
464 if (opp == test) { 464 if (opp == test) {
465 return test; 465 return test;
466 } 466 }
467 bounded = bounded->fNext; 467 bounded = bounded->fNext;
468 } 468 }
469 return NULL; 469 return nullptr;
470 } 470 }
471 471
472 // returns 0 if no hull intersection 472 // returns 0 if no hull intersection
473 // 1 if hulls intersect 473 // 1 if hulls intersect
474 // 2 if hulls only share a common endpoint 474 // 2 if hulls only share a common endpoint
475 // -1 if linear and further checking is required 475 // -1 if linear and further checking is required
476 template<typename TCurve, typename OppCurve> 476 template<typename TCurve, typename OppCurve>
477 int SkTSpan<TCurve, OppCurve>::hullCheck(const SkTSpan<OppCurve, TCurve>* opp, 477 int SkTSpan<TCurve, OppCurve>::hullCheck(const SkTSpan<OppCurve, TCurve>* opp,
478 bool* start, bool* oppStart) { 478 bool* start, bool* oppStart) {
479 if (fIsLinear) { 479 if (fIsLinear) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 } 513 }
514 hullSect = opp->hullCheck(this, oppStart, start); 514 hullSect = opp->hullCheck(this, oppStart, start);
515 if (hullSect >= 0) { 515 if (hullSect >= 0) {
516 return hullSect; 516 return hullSect;
517 } 517 }
518 return -1; 518 return -1;
519 } 519 }
520 520
521 template<typename TCurve, typename OppCurve> 521 template<typename TCurve, typename OppCurve>
522 void SkTSpan<TCurve, OppCurve>::init(const TCurve& c) { 522 void SkTSpan<TCurve, OppCurve>::init(const TCurve& c) {
523 fPrev = fNext = NULL; 523 fPrev = fNext = nullptr;
524 fStartT = 0; 524 fStartT = 0;
525 fEndT = 1; 525 fEndT = 1;
526 fBounded = NULL; 526 fBounded = nullptr;
527 resetBounds(c); 527 resetBounds(c);
528 } 528 }
529 529
530 template<typename TCurve, typename OppCurve> 530 template<typename TCurve, typename OppCurve>
531 void SkTSpan<TCurve, OppCurve>::initBounds(const TCurve& c) { 531 void SkTSpan<TCurve, OppCurve>::initBounds(const TCurve& c) {
532 fPart = c.subDivide(fStartT, fEndT); 532 fPart = c.subDivide(fStartT, fEndT);
533 fBounds.setBounds(fPart); 533 fBounds.setBounds(fPart);
534 fCoinStart.init(); 534 fCoinStart.init();
535 fCoinEnd.init(); 535 fCoinEnd.init();
536 fBoundsMax = SkTMax(fBounds.width(), fBounds.height()); 536 fBoundsMax = SkTMax(fBounds.width(), fBounds.height());
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
649 template<typename TCurve, typename OppCurve> 649 template<typename TCurve, typename OppCurve>
650 SkTSpan<OppCurve, TCurve>* SkTSpan<TCurve, OppCurve>::oppT(double t) const { 650 SkTSpan<OppCurve, TCurve>* SkTSpan<TCurve, OppCurve>::oppT(double t) const {
651 SkTSpanBounded<OppCurve, TCurve>* bounded = fBounded; 651 SkTSpanBounded<OppCurve, TCurve>* bounded = fBounded;
652 while (bounded) { 652 while (bounded) {
653 SkTSpan<OppCurve, TCurve>* test = bounded->fBounded; 653 SkTSpan<OppCurve, TCurve>* test = bounded->fBounded;
654 if (between(test->fStartT, t, test->fEndT)) { 654 if (between(test->fStartT, t, test->fEndT)) {
655 return test; 655 return test;
656 } 656 }
657 bounded = bounded->fNext; 657 bounded = bounded->fNext;
658 } 658 }
659 return NULL; 659 return nullptr;
660 } 660 }
661 661
662 template<typename TCurve, typename OppCurve> 662 template<typename TCurve, typename OppCurve>
663 bool SkTSpan<TCurve, OppCurve>::removeAllBounded() { 663 bool SkTSpan<TCurve, OppCurve>::removeAllBounded() {
664 bool deleteSpan = false; 664 bool deleteSpan = false;
665 SkTSpanBounded<OppCurve, TCurve>* bounded = fBounded; 665 SkTSpanBounded<OppCurve, TCurve>* bounded = fBounded;
666 while (bounded) { 666 while (bounded) {
667 SkTSpan<OppCurve, TCurve>* opp = bounded->fBounded; 667 SkTSpan<OppCurve, TCurve>* opp = bounded->fBounded;
668 deleteSpan |= opp->removeBounded(this); 668 deleteSpan |= opp->removeBounded(this);
669 bounded = bounded->fNext; 669 bounded = bounded->fNext;
(...skipping 15 matching lines...) Expand all
685 } 685 }
686 bounded = bounded->fNext; 686 bounded = bounded->fNext;
687 } 687 }
688 if (!foundStart || !foundEnd) { 688 if (!foundStart || !foundEnd) {
689 fHasPerp = false; 689 fHasPerp = false;
690 fCoinStart.init(); 690 fCoinStart.init();
691 fCoinEnd.init(); 691 fCoinEnd.init();
692 } 692 }
693 } 693 }
694 SkTSpanBounded<OppCurve, TCurve>* bounded = fBounded; 694 SkTSpanBounded<OppCurve, TCurve>* bounded = fBounded;
695 SkTSpanBounded<OppCurve, TCurve>* prev = NULL; 695 SkTSpanBounded<OppCurve, TCurve>* prev = nullptr;
696 while (bounded) { 696 while (bounded) {
697 SkTSpanBounded<OppCurve, TCurve>* boundedNext = bounded->fNext; 697 SkTSpanBounded<OppCurve, TCurve>* boundedNext = bounded->fNext;
698 if (opp == bounded->fBounded) { 698 if (opp == bounded->fBounded) {
699 if (prev) { 699 if (prev) {
700 prev->fNext = boundedNext; 700 prev->fNext = boundedNext;
701 return false; 701 return false;
702 } else { 702 } else {
703 fBounded = boundedNext; 703 fBounded = boundedNext;
704 return fBounded == NULL; 704 return fBounded == nullptr;
705 } 705 }
706 } 706 }
707 prev = bounded; 707 prev = bounded;
708 bounded = boundedNext; 708 bounded = boundedNext;
709 } 709 }
710 SkASSERT(0); 710 SkASSERT(0);
711 return false; 711 return false;
712 } 712 }
713 713
714 template<typename TCurve, typename OppCurve> 714 template<typename TCurve, typename OppCurve>
(...skipping 12 matching lines...) Expand all
727 fPrev = work; 727 fPrev = work;
728 fNext = work->fNext; 728 fNext = work->fNext;
729 fIsLinear = work->fIsLinear; 729 fIsLinear = work->fIsLinear;
730 fIsLine = work->fIsLine; 730 fIsLine = work->fIsLine;
731 731
732 work->fNext = this; 732 work->fNext = this;
733 if (fNext) { 733 if (fNext) {
734 fNext->fPrev = this; 734 fNext->fPrev = this;
735 } 735 }
736 SkTSpanBounded<OppCurve, TCurve>* bounded = work->fBounded; 736 SkTSpanBounded<OppCurve, TCurve>* bounded = work->fBounded;
737 fBounded = NULL; 737 fBounded = nullptr;
738 while (bounded) { 738 while (bounded) {
739 this->addBounded(bounded->fBounded, heap); 739 this->addBounded(bounded->fBounded, heap);
740 bounded = bounded->fNext; 740 bounded = bounded->fNext;
741 } 741 }
742 bounded = fBounded; 742 bounded = fBounded;
743 while (bounded) { 743 while (bounded) {
744 bounded->fBounded->addBounded(this, heap); 744 bounded->fBounded->addBounded(this, heap);
745 bounded = bounded->fNext; 745 bounded = bounded->fNext;
746 } 746 }
747 return true; 747 return true;
748 } 748 }
749 749
750 template<typename TCurve, typename OppCurve> 750 template<typename TCurve, typename OppCurve>
751 void SkTSpan<TCurve, OppCurve>::validate() const { 751 void SkTSpan<TCurve, OppCurve>::validate() const {
752 #if DEBUG_T_SECT 752 #if DEBUG_T_SECT
753 SkASSERT(fNext == NULL || fNext != fPrev); 753 SkASSERT(fNext == nullptr || fNext != fPrev);
754 SkASSERT(fNext == NULL || this == fNext->fPrev); 754 SkASSERT(fNext == nullptr || this == fNext->fPrev);
755 SkASSERT(fPrev == NULL || this == fPrev->fNext); 755 SkASSERT(fPrev == nullptr || this == fPrev->fNext);
756 SkASSERT(fBounds.width() || fBounds.height() || fCollapsed); 756 SkASSERT(fBounds.width() || fBounds.height() || fCollapsed);
757 SkASSERT(fBoundsMax == SkTMax(fBounds.width(), fBounds.height())); 757 SkASSERT(fBoundsMax == SkTMax(fBounds.width(), fBounds.height()));
758 SkASSERT(0 <= fStartT); 758 SkASSERT(0 <= fStartT);
759 SkASSERT(fEndT <= 1); 759 SkASSERT(fEndT <= 1);
760 SkASSERT(fStartT <= fEndT); 760 SkASSERT(fStartT <= fEndT);
761 SkASSERT(fBounded); 761 SkASSERT(fBounded);
762 this->validateBounded(); 762 this->validateBounded();
763 if (fHasPerp) { 763 if (fHasPerp) {
764 if (fCoinStart.isCoincident()) { 764 if (fCoinStart.isCoincident()) {
765 validatePerpT(fCoinStart.perpT()); 765 validatePerpT(fCoinStart.perpT());
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
803 template<typename TCurve, typename OppCurve> 803 template<typename TCurve, typename OppCurve>
804 void SkTSpan<TCurve, OppCurve>::validatePerpPt(double t, const SkDPoint& pt) con st { 804 void SkTSpan<TCurve, OppCurve>::validatePerpPt(double t, const SkDPoint& pt) con st {
805 SkASSERT(fDebugSect->fOppSect->fCurve.ptAtT(t) == pt); 805 SkASSERT(fDebugSect->fOppSect->fCurve.ptAtT(t) == pt);
806 } 806 }
807 807
808 808
809 template<typename TCurve, typename OppCurve> 809 template<typename TCurve, typename OppCurve>
810 SkTSect<TCurve, OppCurve>::SkTSect(const TCurve& c PATH_OPS_DEBUG_T_SECT_PARAMS( int id)) 810 SkTSect<TCurve, OppCurve>::SkTSect(const TCurve& c PATH_OPS_DEBUG_T_SECT_PARAMS( int id))
811 : fCurve(c) 811 : fCurve(c)
812 , fHeap(sizeof(SkTSpan<TCurve, OppCurve>) * 4) 812 , fHeap(sizeof(SkTSpan<TCurve, OppCurve>) * 4)
813 , fCoincident(NULL) 813 , fCoincident(nullptr)
814 , fDeleted(NULL) 814 , fDeleted(nullptr)
815 , fActiveCount(0) 815 , fActiveCount(0)
816 PATH_OPS_DEBUG_T_SECT_PARAMS(fID(id)) 816 PATH_OPS_DEBUG_T_SECT_PARAMS(fID(id))
817 PATH_OPS_DEBUG_T_SECT_PARAMS(fDebugCount(0)) 817 PATH_OPS_DEBUG_T_SECT_PARAMS(fDebugCount(0))
818 PATH_OPS_DEBUG_T_SECT_PARAMS(fDebugAllocatedCount(0)) 818 PATH_OPS_DEBUG_T_SECT_PARAMS(fDebugAllocatedCount(0))
819 { 819 {
820 fHead = addOne(); 820 fHead = addOne();
821 fHead->init(c); 821 fHead->init(c);
822 } 822 }
823 823
824 template<typename TCurve, typename OppCurve> 824 template<typename TCurve, typename OppCurve>
825 SkTSpan<TCurve, OppCurve>* SkTSect<TCurve, OppCurve>::addOne() { 825 SkTSpan<TCurve, OppCurve>* SkTSect<TCurve, OppCurve>::addOne() {
826 SkTSpan<TCurve, OppCurve>* result; 826 SkTSpan<TCurve, OppCurve>* result;
827 if (fDeleted) { 827 if (fDeleted) {
828 result = fDeleted; 828 result = fDeleted;
829 result->reset(); 829 result->reset();
830 fDeleted = result->fNext; 830 fDeleted = result->fNext;
831 } else { 831 } else {
832 result = new (fHeap.allocThrow(sizeof(SkTSpan<TCurve, OppCurve>)))( 832 result = new (fHeap.allocThrow(sizeof(SkTSpan<TCurve, OppCurve>)))(
833 SkTSpan<TCurve, OppCurve>); 833 SkTSpan<TCurve, OppCurve>);
834 result->fBounded = NULL; 834 result->fBounded = nullptr;
835 #if DEBUG_T_SECT 835 #if DEBUG_T_SECT
836 ++fDebugAllocatedCount; 836 ++fDebugAllocatedCount;
837 #endif 837 #endif
838 } 838 }
839 result->fHasPerp = false; 839 result->fHasPerp = false;
840 result->fDeleted = false; 840 result->fDeleted = false;
841 ++fActiveCount; 841 ++fActiveCount;
842 PATH_OPS_DEBUG_T_SECT_CODE(result->fID = fDebugCount++ * 2 + fID); 842 PATH_OPS_DEBUG_T_SECT_CODE(result->fID = fDebugCount++ * 2 + fID);
843 SkDEBUGCODE(result->fDebugSect = this); 843 SkDEBUGCODE(result->fDebugSect = this);
844 return result; 844 return result;
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
966 test = test->next(); 966 test = test->next();
967 } 967 }
968 return result; 968 return result;
969 } 969 }
970 970
971 template<typename TCurve, typename OppCurve> 971 template<typename TCurve, typename OppCurve>
972 void SkTSect<TCurve, OppCurve>::computePerpendiculars(SkTSect<OppCurve, TCurve>* sect2, 972 void SkTSect<TCurve, OppCurve>::computePerpendiculars(SkTSect<OppCurve, TCurve>* sect2,
973 SkTSpan<TCurve, OppCurve>* first, SkTSpan<TCurve, OppCurve>* last) { 973 SkTSpan<TCurve, OppCurve>* first, SkTSpan<TCurve, OppCurve>* last) {
974 const OppCurve& opp = sect2->fCurve; 974 const OppCurve& opp = sect2->fCurve;
975 SkTSpan<TCurve, OppCurve>* work = first; 975 SkTSpan<TCurve, OppCurve>* work = first;
976 SkTSpan<TCurve, OppCurve>* prior = NULL; 976 SkTSpan<TCurve, OppCurve>* prior = nullptr;
977 do { 977 do {
978 if (!work->fHasPerp && !work->fCollapsed) { 978 if (!work->fHasPerp && !work->fCollapsed) {
979 if (prior) { 979 if (prior) {
980 work->fCoinStart = prior->fCoinEnd; 980 work->fCoinStart = prior->fCoinEnd;
981 } else { 981 } else {
982 work->fCoinStart.setPerp(fCurve, work->fStartT, work->fPart[0], opp); 982 work->fCoinStart.setPerp(fCurve, work->fStartT, work->fPart[0], opp);
983 } 983 }
984 if (work->fCoinStart.isCoincident()) { 984 if (work->fCoinStart.isCoincident()) {
985 double perpT = work->fCoinStart.perpT(); 985 double perpT = work->fCoinStart.perpT();
986 if (sect2->coincidentHasT(perpT)) { 986 if (sect2->coincidentHasT(perpT)) {
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1054 } 1054 }
1055 } 1055 }
1056 } 1056 }
1057 1057
1058 template<typename TCurve, typename OppCurve> 1058 template<typename TCurve, typename OppCurve>
1059 SkTSpan<TCurve, OppCurve>* SkTSect<TCurve, OppCurve>::extractCoincident( 1059 SkTSpan<TCurve, OppCurve>* SkTSect<TCurve, OppCurve>::extractCoincident(
1060 SkTSect<OppCurve, TCurve>* sect2, 1060 SkTSect<OppCurve, TCurve>* sect2,
1061 SkTSpan<TCurve, OppCurve>* first, SkTSpan<TCurve, OppCurve>* last) { 1061 SkTSpan<TCurve, OppCurve>* first, SkTSpan<TCurve, OppCurve>* last) {
1062 first = findCoincidentRun(first, &last); 1062 first = findCoincidentRun(first, &last);
1063 if (!first) { 1063 if (!first) {
1064 return NULL; 1064 return nullptr;
1065 } 1065 }
1066 // march outwards to find limit of coincidence from here to previous and nex t spans 1066 // march outwards to find limit of coincidence from here to previous and nex t spans
1067 double startT = first->fStartT; 1067 double startT = first->fStartT;
1068 double oppStartT SK_INIT_TO_AVOID_WARNING; 1068 double oppStartT SK_INIT_TO_AVOID_WARNING;
1069 double oppEndT SK_INIT_TO_AVOID_WARNING; 1069 double oppEndT SK_INIT_TO_AVOID_WARNING;
1070 SkTSpan<TCurve, OppCurve>* prev = first->fPrev; 1070 SkTSpan<TCurve, OppCurve>* prev = first->fPrev;
1071 SkASSERT(first->fCoinStart.isCoincident()); 1071 SkASSERT(first->fCoinStart.isCoincident());
1072 SkTSpan<OppCurve, TCurve>* oppFirst = first->findOppT(first->fCoinStart.perp T()); 1072 SkTSpan<OppCurve, TCurve>* oppFirst = first->findOppT(first->fCoinStart.perp T());
1073 SkASSERT(last->fCoinEnd.isCoincident()); 1073 SkASSERT(last->fCoinEnd.isCoincident());
1074 bool oppMatched = first->fCoinStart.perpT() < first->fCoinEnd.perpT(); 1074 bool oppMatched = first->fCoinStart.perpT() < first->fCoinEnd.perpT();
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1139 sect2->validateBounded(); 1139 sect2->validateBounded();
1140 last = first->fNext; 1140 last = first->fNext;
1141 this->removeCoincident(first, false); 1141 this->removeCoincident(first, false);
1142 sect2->removeCoincident(oppFirst, true); 1142 sect2->removeCoincident(oppFirst, true);
1143 if (deleteEmptySpans) { 1143 if (deleteEmptySpans) {
1144 this->deleteEmptySpans(); 1144 this->deleteEmptySpans();
1145 sect2->deleteEmptySpans(); 1145 sect2->deleteEmptySpans();
1146 } 1146 }
1147 this->validate(); 1147 this->validate();
1148 sect2->validate(); 1148 sect2->validate();
1149 return last && !last->fDeleted ? last : NULL; 1149 return last && !last->fDeleted ? last : nullptr;
1150 } 1150 }
1151 1151
1152 template<typename TCurve, typename OppCurve> 1152 template<typename TCurve, typename OppCurve>
1153 SkTSpan<TCurve, OppCurve>* SkTSect<TCurve, OppCurve>::findCoincidentRun( 1153 SkTSpan<TCurve, OppCurve>* SkTSect<TCurve, OppCurve>::findCoincidentRun(
1154 SkTSpan<TCurve, OppCurve>* first, SkTSpan<TCurve, OppCurve>** lastPtr) { 1154 SkTSpan<TCurve, OppCurve>* first, SkTSpan<TCurve, OppCurve>** lastPtr) {
1155 SkTSpan<TCurve, OppCurve>* work = first; 1155 SkTSpan<TCurve, OppCurve>* work = first;
1156 SkTSpan<TCurve, OppCurve>* lastCandidate = NULL; 1156 SkTSpan<TCurve, OppCurve>* lastCandidate = nullptr;
1157 first = NULL; 1157 first = nullptr;
1158 // find the first fully coincident span 1158 // find the first fully coincident span
1159 do { 1159 do {
1160 if (work->fCoinStart.isCoincident()) { 1160 if (work->fCoinStart.isCoincident()) {
1161 #if DEBUG_T_SECT 1161 #if DEBUG_T_SECT
1162 work->validatePerpT(work->fCoinStart.perpT()); 1162 work->validatePerpT(work->fCoinStart.perpT());
1163 work->validatePerpPt(work->fCoinStart.perpT(), work->fCoinStart.perp Pt()); 1163 work->validatePerpPt(work->fCoinStart.perpT(), work->fCoinStart.perp Pt());
1164 #endif 1164 #endif
1165 SkASSERT(work->hasOppT(work->fCoinStart.perpT())); 1165 SkASSERT(work->hasOppT(work->fCoinStart.perpT()));
1166 if (!work->fCoinEnd.isCoincident()) { 1166 if (!work->fCoinEnd.isCoincident()) {
1167 break; 1167 break;
1168 } 1168 }
1169 lastCandidate = work; 1169 lastCandidate = work;
1170 if (!first) { 1170 if (!first) {
1171 first = work; 1171 first = work;
1172 } 1172 }
1173 } else if (first && work->fCollapsed) { 1173 } else if (first && work->fCollapsed) {
1174 *lastPtr = lastCandidate; 1174 *lastPtr = lastCandidate;
1175 return first; 1175 return first;
1176 } else { 1176 } else {
1177 lastCandidate = NULL; 1177 lastCandidate = nullptr;
1178 SkASSERT(!first); 1178 SkASSERT(!first);
1179 } 1179 }
1180 if (work == *lastPtr) { 1180 if (work == *lastPtr) {
1181 return first; 1181 return first;
1182 } 1182 }
1183 work = work->fNext; 1183 work = work->fNext;
1184 SkASSERT(work); 1184 SkASSERT(work);
1185 } while (true); 1185 } while (true);
1186 if (lastCandidate) { 1186 if (lastCandidate) {
1187 *lastPtr = lastCandidate; 1187 *lastPtr = lastCandidate;
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
1397 *oppMatched = this->matchedDirection(t, sect2, t2); 1397 *oppMatched = this->matchedDirection(t, sect2, t2);
1398 *calcMatched = true; 1398 *calcMatched = true;
1399 } 1399 }
1400 } 1400 }
1401 1401
1402 template<typename TCurve, typename OppCurve> 1402 template<typename TCurve, typename OppCurve>
1403 void SkTSect<TCurve, OppCurve>::mergeCoincidence(SkTSect<OppCurve, TCurve>* sect 2) { 1403 void SkTSect<TCurve, OppCurve>::mergeCoincidence(SkTSect<OppCurve, TCurve>* sect 2) {
1404 double smallLimit = 0; 1404 double smallLimit = 0;
1405 do { 1405 do {
1406 // find the smallest unprocessed span 1406 // find the smallest unprocessed span
1407 SkTSpan<TCurve, OppCurve>* smaller = NULL; 1407 SkTSpan<TCurve, OppCurve>* smaller = nullptr;
1408 SkTSpan<TCurve, OppCurve>* test = fCoincident; 1408 SkTSpan<TCurve, OppCurve>* test = fCoincident;
1409 do { 1409 do {
1410 if (test->fStartT < smallLimit) { 1410 if (test->fStartT < smallLimit) {
1411 continue; 1411 continue;
1412 } 1412 }
1413 if (smaller && smaller->fEndT < test->fStartT) { 1413 if (smaller && smaller->fEndT < test->fStartT) {
1414 continue; 1414 continue;
1415 } 1415 }
1416 smaller = test; 1416 smaller = test;
1417 } while ((test = test->fNext)); 1417 } while ((test = test->fNext));
1418 if (!smaller) { 1418 if (!smaller) {
1419 return; 1419 return;
1420 } 1420 }
1421 smallLimit = smaller->fEndT; 1421 smallLimit = smaller->fEndT;
1422 // find next larger span 1422 // find next larger span
1423 SkTSpan<TCurve, OppCurve>* prior = NULL; 1423 SkTSpan<TCurve, OppCurve>* prior = nullptr;
1424 SkTSpan<TCurve, OppCurve>* larger = NULL; 1424 SkTSpan<TCurve, OppCurve>* larger = nullptr;
1425 SkTSpan<TCurve, OppCurve>* largerPrior = NULL; 1425 SkTSpan<TCurve, OppCurve>* largerPrior = nullptr;
1426 test = fCoincident; 1426 test = fCoincident;
1427 do { 1427 do {
1428 if (test->fStartT < smaller->fEndT) { 1428 if (test->fStartT < smaller->fEndT) {
1429 continue; 1429 continue;
1430 } 1430 }
1431 SkASSERT(test->fStartT != smaller->fEndT); 1431 SkASSERT(test->fStartT != smaller->fEndT);
1432 if (larger && larger->fStartT < test->fStartT) { 1432 if (larger && larger->fStartT < test->fStartT) {
1433 continue; 1433 continue;
1434 } 1434 }
1435 largerPrior = prior; 1435 largerPrior = prior;
(...skipping 15 matching lines...) Expand all
1451 } else { 1451 } else {
1452 fCoincident = larger->fNext; 1452 fCoincident = larger->fNext;
1453 } 1453 }
1454 } 1454 }
1455 } while (true); 1455 } while (true);
1456 } 1456 }
1457 1457
1458 template<typename TCurve, typename OppCurve> 1458 template<typename TCurve, typename OppCurve>
1459 SkTSpan<TCurve, OppCurve>* SkTSect<TCurve, OppCurve>::prev( 1459 SkTSpan<TCurve, OppCurve>* SkTSect<TCurve, OppCurve>::prev(
1460 SkTSpan<TCurve, OppCurve>* span) const { 1460 SkTSpan<TCurve, OppCurve>* span) const {
1461 SkTSpan<TCurve, OppCurve>* result = NULL; 1461 SkTSpan<TCurve, OppCurve>* result = nullptr;
1462 SkTSpan<TCurve, OppCurve>* test = fHead; 1462 SkTSpan<TCurve, OppCurve>* test = fHead;
1463 while (span != test) { 1463 while (span != test) {
1464 result = test; 1464 result = test;
1465 test = test->fNext; 1465 test = test->fNext;
1466 SkASSERT(test); 1466 SkASSERT(test);
1467 } 1467 }
1468 return result; 1468 return result;
1469 } 1469 }
1470 1470
1471 template<typename TCurve, typename OppCurve> 1471 template<typename TCurve, typename OppCurve>
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
1581 } 1581 }
1582 SkASSERT(!span->fDeleted || !opp->debugHasBounded(span)); 1582 SkASSERT(!span->fDeleted || !opp->debugHasBounded(span));
1583 bounded = next; 1583 bounded = next;
1584 } 1584 }
1585 } 1585 }
1586 1586
1587 template<typename TCurve, typename OppCurve> 1587 template<typename TCurve, typename OppCurve>
1588 SkTSpan<TCurve, OppCurve>* SkTSect<TCurve, OppCurve>::spanAtT(double t, 1588 SkTSpan<TCurve, OppCurve>* SkTSect<TCurve, OppCurve>::spanAtT(double t,
1589 SkTSpan<TCurve, OppCurve>** priorSpan) { 1589 SkTSpan<TCurve, OppCurve>** priorSpan) {
1590 SkTSpan<TCurve, OppCurve>* test = fHead; 1590 SkTSpan<TCurve, OppCurve>* test = fHead;
1591 SkTSpan<TCurve, OppCurve>* prev = NULL; 1591 SkTSpan<TCurve, OppCurve>* prev = nullptr;
1592 while (test && test->fEndT < t) { 1592 while (test && test->fEndT < t) {
1593 prev = test; 1593 prev = test;
1594 test = test->fNext; 1594 test = test->fNext;
1595 } 1595 }
1596 *priorSpan = prev; 1596 *priorSpan = prev;
1597 return test && test->fStartT <= t ? test : NULL; 1597 return test && test->fStartT <= t ? test : nullptr;
1598 } 1598 }
1599 1599
1600 template<typename TCurve, typename OppCurve> 1600 template<typename TCurve, typename OppCurve>
1601 SkTSpan<TCurve, OppCurve>* SkTSect<TCurve, OppCurve>::tail() { 1601 SkTSpan<TCurve, OppCurve>* SkTSect<TCurve, OppCurve>::tail() {
1602 SkTSpan<TCurve, OppCurve>* result = fHead; 1602 SkTSpan<TCurve, OppCurve>* result = fHead;
1603 SkTSpan<TCurve, OppCurve>* next = fHead; 1603 SkTSpan<TCurve, OppCurve>* next = fHead;
1604 while ((next = next->fNext)) { 1604 while ((next = next->fNext)) {
1605 if (next->fEndT > result->fEndT) { 1605 if (next->fEndT > result->fEndT) {
1606 result = next; 1606 result = next;
1607 } 1607 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1647 SkTSpan<TCurve, OppCurve>* prev = span->fPrev; 1647 SkTSpan<TCurve, OppCurve>* prev = span->fPrev;
1648 SkTSpan<TCurve, OppCurve>* next = span->fNext; 1648 SkTSpan<TCurve, OppCurve>* next = span->fNext;
1649 if (prev) { 1649 if (prev) {
1650 prev->fNext = next; 1650 prev->fNext = next;
1651 if (next) { 1651 if (next) {
1652 next->fPrev = prev; 1652 next->fPrev = prev;
1653 } 1653 }
1654 } else { 1654 } else {
1655 fHead = next; 1655 fHead = next;
1656 if (next) { 1656 if (next) {
1657 next->fPrev = NULL; 1657 next->fPrev = nullptr;
1658 } 1658 }
1659 } 1659 }
1660 } 1660 }
1661 1661
1662 template<typename TCurve, typename OppCurve> 1662 template<typename TCurve, typename OppCurve>
1663 bool SkTSect<TCurve, OppCurve>::updateBounded(SkTSpan<TCurve, OppCurve>* first, 1663 bool SkTSect<TCurve, OppCurve>::updateBounded(SkTSpan<TCurve, OppCurve>* first,
1664 SkTSpan<TCurve, OppCurve>* last, SkTSpan<OppCurve, TCurve>* oppFirst) { 1664 SkTSpan<TCurve, OppCurve>* last, SkTSpan<OppCurve, TCurve>* oppFirst) {
1665 SkTSpan<TCurve, OppCurve>* test = first; 1665 SkTSpan<TCurve, OppCurve>* test = first;
1666 const SkTSpan<TCurve, OppCurve>* final = last->next(); 1666 const SkTSpan<TCurve, OppCurve>* final = last->next();
1667 bool deleteSpan = false; 1667 bool deleteSpan = false;
1668 do { 1668 do {
1669 deleteSpan |= test->removeAllBounded(); 1669 deleteSpan |= test->removeAllBounded();
1670 } while ((test = test->fNext) != final); 1670 } while ((test = test->fNext) != final);
1671 first->fBounded = NULL; 1671 first->fBounded = nullptr;
1672 first->addBounded(oppFirst, &fHeap); 1672 first->addBounded(oppFirst, &fHeap);
1673 // cannot call validate until remove span range is called 1673 // cannot call validate until remove span range is called
1674 return deleteSpan; 1674 return deleteSpan;
1675 } 1675 }
1676 1676
1677 1677
1678 template<typename TCurve, typename OppCurve> 1678 template<typename TCurve, typename OppCurve>
1679 void SkTSect<TCurve, OppCurve>::validate() const { 1679 void SkTSect<TCurve, OppCurve>::validate() const {
1680 #if DEBUG_T_SECT 1680 #if DEBUG_T_SECT
1681 int count = 0; 1681 int count = 0;
1682 if (fHead) { 1682 if (fHead) {
1683 const SkTSpan<TCurve, OppCurve>* span = fHead; 1683 const SkTSpan<TCurve, OppCurve>* span = fHead;
1684 SkASSERT(!span->fPrev); 1684 SkASSERT(!span->fPrev);
1685 SkDEBUGCODE(double last = 0); 1685 SkDEBUGCODE(double last = 0);
1686 do { 1686 do {
1687 span->validate(); 1687 span->validate();
1688 SkASSERT(span->fStartT >= last); 1688 SkASSERT(span->fStartT >= last);
1689 SkDEBUGCODE(last = span->fEndT); 1689 SkDEBUGCODE(last = span->fEndT);
1690 ++count; 1690 ++count;
1691 } while ((span = span->fNext) != NULL); 1691 } while ((span = span->fNext) != nullptr);
1692 } 1692 }
1693 SkASSERT(count == fActiveCount); 1693 SkASSERT(count == fActiveCount);
1694 SkASSERT(fActiveCount <= fDebugAllocatedCount); 1694 SkASSERT(fActiveCount <= fDebugAllocatedCount);
1695 int deletedCount = 0; 1695 int deletedCount = 0;
1696 const SkTSpan<TCurve, OppCurve>* deleted = fDeleted; 1696 const SkTSpan<TCurve, OppCurve>* deleted = fDeleted;
1697 while (deleted) { 1697 while (deleted) {
1698 ++deletedCount; 1698 ++deletedCount;
1699 deleted = deleted->fNext; 1699 deleted = deleted->fNext;
1700 } 1700 }
1701 const SkTSpan<TCurve, OppCurve>* coincident = fCoincident; 1701 const SkTSpan<TCurve, OppCurve>* coincident = fCoincident;
1702 while (coincident) { 1702 while (coincident) {
1703 ++deletedCount; 1703 ++deletedCount;
1704 coincident = coincident->fNext; 1704 coincident = coincident->fNext;
1705 } 1705 }
1706 SkASSERT(fActiveCount + deletedCount == fDebugAllocatedCount); 1706 SkASSERT(fActiveCount + deletedCount == fDebugAllocatedCount);
1707 #endif 1707 #endif
1708 } 1708 }
1709 1709
1710 template<typename TCurve, typename OppCurve> 1710 template<typename TCurve, typename OppCurve>
1711 void SkTSect<TCurve, OppCurve>::validateBounded() const { 1711 void SkTSect<TCurve, OppCurve>::validateBounded() const {
1712 #if DEBUG_T_SECT 1712 #if DEBUG_T_SECT
1713 if (!fHead) { 1713 if (!fHead) {
1714 return; 1714 return;
1715 } 1715 }
1716 const SkTSpan<TCurve, OppCurve>* span = fHead; 1716 const SkTSpan<TCurve, OppCurve>* span = fHead;
1717 do { 1717 do {
1718 span->validateBounded(); 1718 span->validateBounded();
1719 } while ((span = span->fNext) != NULL); 1719 } while ((span = span->fNext) != nullptr);
1720 #endif 1720 #endif
1721 } 1721 }
1722 1722
1723 template<typename TCurve, typename OppCurve> 1723 template<typename TCurve, typename OppCurve>
1724 int SkTSect<TCurve, OppCurve>::EndsEqual(const SkTSect<TCurve, OppCurve>* sect1, 1724 int SkTSect<TCurve, OppCurve>::EndsEqual(const SkTSect<TCurve, OppCurve>* sect1,
1725 const SkTSect<OppCurve, TCurve>* sect2, SkIntersections* intersections) { 1725 const SkTSect<OppCurve, TCurve>* sect2, SkIntersections* intersections) {
1726 int zeroOneSet = 0; 1726 int zeroOneSet = 0;
1727 if (sect1->fCurve[0] == sect2->fCurve[0]) { 1727 if (sect1->fCurve[0] == sect2->fCurve[0]) {
1728 zeroOneSet |= kZeroS1Set | kZeroS2Set; 1728 zeroOneSet |= kZeroS1Set | kZeroS2Set;
1729 intersections->insert(0, 0, sect1->fCurve[0]); 1729 intersections->insert(0, 0, sect1->fCurve[0]);
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1816 void merge(const SkClosestRecord& mate) { 1816 void merge(const SkClosestRecord& mate) {
1817 fC1Span = mate.fC1Span; 1817 fC1Span = mate.fC1Span;
1818 fC2Span = mate.fC2Span; 1818 fC2Span = mate.fC2Span;
1819 fClosest = mate.fClosest; 1819 fClosest = mate.fClosest;
1820 fC1Index = mate.fC1Index; 1820 fC1Index = mate.fC1Index;
1821 fC2Index = mate.fC2Index; 1821 fC2Index = mate.fC2Index;
1822 } 1822 }
1823 1823
1824 void reset() { 1824 void reset() {
1825 fClosest = FLT_MAX; 1825 fClosest = FLT_MAX;
1826 SkDEBUGCODE(fC1Span = NULL); 1826 SkDEBUGCODE(fC1Span = nullptr);
1827 SkDEBUGCODE(fC2Span = NULL); 1827 SkDEBUGCODE(fC2Span = nullptr);
1828 SkDEBUGCODE(fC1Index = fC2Index = -1); 1828 SkDEBUGCODE(fC1Index = fC2Index = -1);
1829 } 1829 }
1830 1830
1831 void update(const SkClosestRecord& mate) { 1831 void update(const SkClosestRecord& mate) {
1832 fC1StartT = SkTMin(fC1StartT, mate.fC1StartT); 1832 fC1StartT = SkTMin(fC1StartT, mate.fC1StartT);
1833 fC1EndT = SkTMax(fC1EndT, mate.fC1EndT); 1833 fC1EndT = SkTMax(fC1EndT, mate.fC1EndT);
1834 fC2StartT = SkTMin(fC2StartT, mate.fC2StartT); 1834 fC2StartT = SkTMin(fC2StartT, mate.fC2StartT);
1835 fC2EndT = SkTMax(fC2EndT, mate.fC2EndT); 1835 fC2EndT = SkTMax(fC2EndT, mate.fC2EndT);
1836 } 1836 }
1837 1837
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
2086 } else if (intersections->isCoincident(index + 1)) { 2086 } else if (intersections->isCoincident(index + 1)) {
2087 intersections->removeOne(index + 1); 2087 intersections->removeOne(index + 1);
2088 --last; 2088 --last;
2089 } else { 2089 } else {
2090 intersections->setCoincident(index++); 2090 intersections->setCoincident(index++);
2091 } 2091 }
2092 intersections->setCoincident(index); 2092 intersections->setCoincident(index);
2093 } 2093 }
2094 SkASSERT(intersections->used() <= TCurve::kMaxIntersections); 2094 SkASSERT(intersections->used() <= TCurve::kMaxIntersections);
2095 } 2095 }
OLDNEW
« no previous file with comments | « src/pathops/SkPathOpsSimplify.cpp ('k') | src/pathops/SkPathOpsTightBounds.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698