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 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 if (oppTs > oppTe) { | 121 if (oppTs > oppTe) { |
122 SkTSwap(oppTs, oppTe); | 122 SkTSwap(oppTs, oppTe); |
123 } | 123 } |
124 return oppTs <= s->fT && e->fT <= oppTe; | 124 return oppTs <= s->fT && e->fT <= oppTe; |
125 } | 125 } |
126 } | 126 } |
127 | 127 |
128 // A coincident span is unordered if the pairs of points in the main and opposit
e curves' | 128 // A coincident span is unordered if the pairs of points in the main and opposit
e curves' |
129 // t values do not ascend or descend. For instance, if a tightly arced quadratic
is | 129 // t values do not ascend or descend. For instance, if a tightly arced quadratic
is |
130 // coincident with another curve, it may intersect it out of order. | 130 // coincident with another curve, it may intersect it out of order. |
131 bool SkCoincidentSpans::ordered() const { | 131 bool SkCoincidentSpans::ordered(bool* result) const { |
132 const SkOpSpanBase* start = this->coinPtTStart()->span(); | 132 const SkOpSpanBase* start = this->coinPtTStart()->span(); |
133 const SkOpSpanBase* end = this->coinPtTEnd()->span(); | 133 const SkOpSpanBase* end = this->coinPtTEnd()->span(); |
134 const SkOpSpanBase* next = start->upCast()->next(); | 134 const SkOpSpanBase* next = start->upCast()->next(); |
135 if (next == end) { | 135 if (next == end) { |
| 136 *result = true; |
136 return true; | 137 return true; |
137 } | 138 } |
138 bool flipped = this->flipped(); | 139 bool flipped = this->flipped(); |
139 const SkOpSegment* oppSeg = this->oppPtTStart()->segment(); | 140 const SkOpSegment* oppSeg = this->oppPtTStart()->segment(); |
140 double oppLastT = fOppPtTStart->fT; | 141 double oppLastT = fOppPtTStart->fT; |
141 do { | 142 do { |
142 const SkOpPtT* opp = next->contains(oppSeg); | 143 const SkOpPtT* opp = next->contains(oppSeg); |
143 if (!opp) { | 144 if (!opp) { |
144 SkASSERT(0); // may assert if coincident span isn't fully processed | 145 SkOPOBJASSERT(start, 0); // may assert if coincident span isn't ful
ly processed |
145 continue; | 146 return false; |
146 } | 147 } |
147 if ((oppLastT > opp->fT) != flipped) { | 148 if ((oppLastT > opp->fT) != flipped) { |
148 return false; | 149 *result = false; |
| 150 return true; |
149 } | 151 } |
150 oppLastT = opp->fT; | 152 oppLastT = opp->fT; |
151 if (next == end) { | 153 if (next == end) { |
152 break; | 154 break; |
153 } | 155 } |
154 if (!next->upCastable()) { | 156 if (!next->upCastable()) { |
155 return false; | 157 *result = false; |
| 158 return true; |
156 } | 159 } |
157 next = next->upCast()->next(); | 160 next = next->upCast()->next(); |
158 } while (true); | 161 } while (true); |
| 162 *result = true; |
159 return true; | 163 return true; |
160 } | 164 } |
161 | 165 |
162 // if there is an existing pair that overlaps the addition, extend it | 166 // if there is an existing pair that overlaps the addition, extend it |
163 bool SkOpCoincidence::extend(const SkOpPtT* coinPtTStart, const SkOpPtT* coinPtT
End, | 167 bool SkOpCoincidence::extend(const SkOpPtT* coinPtTStart, const SkOpPtT* coinPtT
End, |
164 const SkOpPtT* oppPtTStart, const SkOpPtT* oppPtTEnd) { | 168 const SkOpPtT* oppPtTStart, const SkOpPtT* oppPtTEnd) { |
165 SkCoincidentSpans* test = fHead; | 169 SkCoincidentSpans* test = fHead; |
166 if (!test) { | 170 if (!test) { |
167 return false; | 171 return false; |
168 } | 172 } |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 this->add(oppPtTEnd, oppPtTStart, coinPtTEnd, coinPtTStart); | 231 this->add(oppPtTEnd, oppPtTStart, coinPtTEnd, coinPtTStart); |
228 } | 232 } |
229 return; | 233 return; |
230 } | 234 } |
231 SkASSERT(Ordered(coinPtTStart, oppPtTStart)); | 235 SkASSERT(Ordered(coinPtTStart, oppPtTStart)); |
232 // choose the ptT at the front of the list to track | 236 // choose the ptT at the front of the list to track |
233 coinPtTStart = coinPtTStart->span()->ptT(); | 237 coinPtTStart = coinPtTStart->span()->ptT(); |
234 coinPtTEnd = coinPtTEnd->span()->ptT(); | 238 coinPtTEnd = coinPtTEnd->span()->ptT(); |
235 oppPtTStart = oppPtTStart->span()->ptT(); | 239 oppPtTStart = oppPtTStart->span()->ptT(); |
236 oppPtTEnd = oppPtTEnd->span()->ptT(); | 240 oppPtTEnd = oppPtTEnd->span()->ptT(); |
237 SkASSERT(coinPtTStart->fT < coinPtTEnd->fT); | 241 SkOPASSERT(coinPtTStart->fT < coinPtTEnd->fT); |
238 SkASSERT(oppPtTStart->fT != oppPtTEnd->fT); | 242 SkASSERT(oppPtTStart->fT != oppPtTEnd->fT); |
239 SkOPASSERT(!coinPtTStart->deleted()); | 243 SkOPASSERT(!coinPtTStart->deleted()); |
240 SkOPASSERT(!coinPtTEnd->deleted()); | 244 SkOPASSERT(!coinPtTEnd->deleted()); |
241 SkOPASSERT(!oppPtTStart->deleted()); | 245 SkOPASSERT(!oppPtTStart->deleted()); |
242 SkOPASSERT(!oppPtTEnd->deleted()); | 246 SkOPASSERT(!oppPtTEnd->deleted()); |
243 DebugCheckAdd(fHead, coinPtTStart, coinPtTEnd, oppPtTStart, oppPtTEnd); | 247 DebugCheckAdd(fHead, coinPtTStart, coinPtTEnd, oppPtTStart, oppPtTEnd); |
244 DebugCheckAdd(fTop, coinPtTStart, coinPtTEnd, oppPtTStart, oppPtTEnd); | 248 DebugCheckAdd(fTop, coinPtTStart, coinPtTEnd, oppPtTStart, oppPtTEnd); |
245 SkCoincidentSpans* coinRec = SkOpTAllocator<SkCoincidentSpans>::Allocate( | 249 SkCoincidentSpans* coinRec = SkOpTAllocator<SkCoincidentSpans>::Allocate( |
246 this->globalState()->allocator()); | 250 this->globalState()->allocator()); |
247 coinRec->init(SkDEBUGCODE(fGlobalState)); | 251 coinRec->init(SkDEBUGCODE(fGlobalState)); |
(...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
747 if (!outer) { | 751 if (!outer) { |
748 return true; | 752 return true; |
749 } | 753 } |
750 fTop = outer; | 754 fTop = outer; |
751 fHead = nullptr; | 755 fHead = nullptr; |
752 do { | 756 do { |
753 // addifmissing can modify the list that this is walking | 757 // addifmissing can modify the list that this is walking |
754 // save head so that walker can iterate over old data unperturbed | 758 // save head so that walker can iterate over old data unperturbed |
755 // addifmissing adds to head freely then add saved head in the end | 759 // addifmissing adds to head freely then add saved head in the end |
756 const SkOpPtT* ocs = outer->coinPtTStart(); | 760 const SkOpPtT* ocs = outer->coinPtTStart(); |
757 SkASSERT(!ocs->deleted()); | 761 FAIL_IF(ocs->deleted()); |
758 const SkOpSegment* outerCoin = ocs->segment(); | 762 const SkOpSegment* outerCoin = ocs->segment(); |
759 SkASSERT(!outerCoin->done()); // if it's done, should have already been
removed from list | 763 SkASSERT(!outerCoin->done()); // if it's done, should have already been
removed from list |
760 const SkOpPtT* oos = outer->oppPtTStart(); | 764 const SkOpPtT* oos = outer->oppPtTStart(); |
761 if (oos->deleted()) { | 765 if (oos->deleted()) { |
762 return true; | 766 return true; |
763 } | 767 } |
764 const SkOpSegment* outerOpp = oos->segment(); | 768 const SkOpSegment* outerOpp = oos->segment(); |
765 SkASSERT(!outerOpp->done()); | 769 SkASSERT(!outerOpp->done()); |
766 SkOpSegment* outerCoinWritable = const_cast<SkOpSegment*>(outerCoin); | 770 SkOpSegment* outerCoinWritable = const_cast<SkOpSegment*>(outerCoin); |
767 SkOpSegment* outerOppWritable = const_cast<SkOpSegment*>(outerOpp); | 771 SkOpSegment* outerOppWritable = const_cast<SkOpSegment*>(outerOpp); |
768 SkCoincidentSpans* inner = outer; | 772 SkCoincidentSpans* inner = outer; |
769 while ((inner = inner->next())) { | 773 while ((inner = inner->next())) { |
770 this->debugValidate(); | 774 this->debugValidate(); |
771 double overS, overE; | 775 double overS, overE; |
772 const SkOpPtT* ics = inner->coinPtTStart(); | 776 const SkOpPtT* ics = inner->coinPtTStart(); |
773 FAIL_IF(ics->deleted()); | 777 FAIL_IF(ics->deleted()); |
774 const SkOpSegment* innerCoin = ics->segment(); | 778 const SkOpSegment* innerCoin = ics->segment(); |
775 SkASSERT(!innerCoin->done()); | 779 FAIL_IF(innerCoin->done()); |
776 const SkOpPtT* ios = inner->oppPtTStart(); | 780 const SkOpPtT* ios = inner->oppPtTStart(); |
777 SkASSERT(!ios->deleted()); | 781 FAIL_IF(ios->deleted()); |
778 const SkOpSegment* innerOpp = ios->segment(); | 782 const SkOpSegment* innerOpp = ios->segment(); |
779 SkASSERT(!innerOpp->done()); | 783 SkASSERT(!innerOpp->done()); |
780 SkOpSegment* innerCoinWritable = const_cast<SkOpSegment*>(innerCoin)
; | 784 SkOpSegment* innerCoinWritable = const_cast<SkOpSegment*>(innerCoin)
; |
781 SkOpSegment* innerOppWritable = const_cast<SkOpSegment*>(innerOpp); | 785 SkOpSegment* innerOppWritable = const_cast<SkOpSegment*>(innerOpp); |
782 if (outerCoin == innerCoin) { | 786 if (outerCoin == innerCoin) { |
783 const SkOpPtT* oce = outer->coinPtTEnd(); | 787 const SkOpPtT* oce = outer->coinPtTEnd(); |
784 if (oce->deleted()) { | 788 if (oce->deleted()) { |
785 return true; | 789 return true; |
786 } | 790 } |
787 const SkOpPtT* ice = inner->coinPtTEnd(); | 791 const SkOpPtT* ice = inner->coinPtTEnd(); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
848 s1 = overS->find(seg1o); | 852 s1 = overS->find(seg1o); |
849 e1 = overE->find(seg1o); | 853 e1 = overE->find(seg1o); |
850 FAIL_IF(!s1); | 854 FAIL_IF(!s1); |
851 FAIL_IF(!e1); | 855 FAIL_IF(!e1); |
852 if (!s1->starter(e1)->span()->upCast()->windValue()) { | 856 if (!s1->starter(e1)->span()->upCast()->windValue()) { |
853 return true; | 857 return true; |
854 } | 858 } |
855 } | 859 } |
856 const SkOpPtT* s2 = overS->find(seg2); | 860 const SkOpPtT* s2 = overS->find(seg2); |
857 const SkOpPtT* e2 = overE->find(seg2); | 861 const SkOpPtT* e2 = overE->find(seg2); |
| 862 FAIL_IF(!e2); |
858 if (!s2->starter(e2)->span()->upCast()->windValue()) { | 863 if (!s2->starter(e2)->span()->upCast()->windValue()) { |
859 s2 = overS->find(seg2o); | 864 s2 = overS->find(seg2o); |
860 e2 = overE->find(seg2o); | 865 e2 = overE->find(seg2o); |
| 866 FAIL_IF(!s2); |
861 if (!s2->starter(e2)->span()->upCast()->windValue()) { | 867 if (!s2->starter(e2)->span()->upCast()->windValue()) { |
862 return true; | 868 return true; |
863 } | 869 } |
864 } | 870 } |
865 if (s1->segment() == s2->segment()) { | 871 if (s1->segment() == s2->segment()) { |
866 return true; | 872 return true; |
867 } | 873 } |
868 if (s1->fT > e1->fT) { | 874 if (s1->fT > e1->fT) { |
869 SkTSwap(s1, e1); | 875 SkTSwap(s1, e1); |
870 SkTSwap(s2, e2); | 876 SkTSwap(s2, e2); |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
949 SkCoincidentSpans* coin = fHead; | 955 SkCoincidentSpans* coin = fHead; |
950 if (!coin) { | 956 if (!coin) { |
951 return; | 957 return; |
952 } | 958 } |
953 do { | 959 do { |
954 coin->correctEnds(); | 960 coin->correctEnds(); |
955 } while ((coin = coin->next())); | 961 } while ((coin = coin->next())); |
956 } | 962 } |
957 | 963 |
958 // walk span sets in parallel, moving winding from one to the other | 964 // walk span sets in parallel, moving winding from one to the other |
959 void SkOpCoincidence::apply(DEBUG_COIN_DECLARE_ONLY_PARAMS()) { | 965 bool SkOpCoincidence::apply(DEBUG_COIN_DECLARE_ONLY_PARAMS()) { |
960 DEBUG_SET_PHASE(); | 966 DEBUG_SET_PHASE(); |
961 SkCoincidentSpans* coin = fHead; | 967 SkCoincidentSpans* coin = fHead; |
962 if (!coin) { | 968 if (!coin) { |
963 return; | 969 return true; |
964 } | 970 } |
965 do { | 971 do { |
966 SkOpSpan* start = coin->coinPtTStartWritable()->span()->upCast(); | 972 SkOpSpan* start = coin->coinPtTStartWritable()->span()->upCast(); |
967 if (start->deleted()) { | 973 if (start->deleted()) { |
968 continue; | 974 continue; |
969 } | 975 } |
970 const SkOpSpanBase* end = coin->coinPtTEnd()->span(); | 976 const SkOpSpanBase* end = coin->coinPtTEnd()->span(); |
971 SkASSERT(start == start->starter(end)); | 977 SkASSERT(start == start->starter(end)); |
972 bool flipped = coin->flipped(); | 978 bool flipped = coin->flipped(); |
973 SkOpSpan* oStart = (flipped ? coin->oppPtTEndWritable() | 979 SkOpSpan* oStart = (flipped ? coin->oppPtTEndWritable() |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1048 windValue = oppValue = 0; | 1054 windValue = oppValue = 0; |
1049 } | 1055 } |
1050 #if 0 && DEBUG_COINCIDENCE | 1056 #if 0 && DEBUG_COINCIDENCE |
1051 SkDebugf("seg=%d span=%d windValue=%d oppValue=%d\n", segment->debug
ID(), | 1057 SkDebugf("seg=%d span=%d windValue=%d oppValue=%d\n", segment->debug
ID(), |
1052 start->debugID(), windValue, oppValue); | 1058 start->debugID(), windValue, oppValue); |
1053 SkDebugf("seg=%d span=%d windValue=%d oppValue=%d\n", oSegment->debu
gID(), | 1059 SkDebugf("seg=%d span=%d windValue=%d oppValue=%d\n", oSegment->debu
gID(), |
1054 oStart->debugID(), oWindValue, oOppValue); | 1060 oStart->debugID(), oWindValue, oOppValue); |
1055 #endif | 1061 #endif |
1056 start->setWindValue(windValue); | 1062 start->setWindValue(windValue); |
1057 start->setOppValue(oppValue); | 1063 start->setOppValue(oppValue); |
| 1064 FAIL_IF(oWindValue == -1); |
1058 oStart->setWindValue(oWindValue); | 1065 oStart->setWindValue(oWindValue); |
1059 oStart->setOppValue(oOppValue); | 1066 oStart->setOppValue(oOppValue); |
1060 if (!windValue && !oppValue) { | 1067 if (!windValue && !oppValue) { |
1061 segment->markDone(start); | 1068 segment->markDone(start); |
1062 } | 1069 } |
1063 if (!oWindValue && !oOppValue) { | 1070 if (!oWindValue && !oOppValue) { |
1064 oSegment->markDone(oStart); | 1071 oSegment->markDone(oStart); |
1065 } | 1072 } |
1066 SkOpSpanBase* next = start->next(); | 1073 SkOpSpanBase* next = start->next(); |
1067 SkOpSpanBase* oNext = flipped ? oStart->prev() : oStart->next(); | 1074 SkOpSpanBase* oNext = flipped ? oStart->prev() : oStart->next(); |
1068 if (next == end) { | 1075 if (next == end) { |
1069 break; | 1076 break; |
1070 } | 1077 } |
1071 start = next->upCast(); | 1078 start = next->upCast(); |
1072 // if the opposite ran out too soon, just reuse the last span | 1079 // if the opposite ran out too soon, just reuse the last span |
1073 if (!oNext || !oNext->upCastable()) { | 1080 if (!oNext || !oNext->upCastable()) { |
1074 oNext = oStart; | 1081 oNext = oStart; |
1075 } | 1082 } |
1076 oStart = oNext->upCast(); | 1083 oStart = oNext->upCast(); |
1077 } while (true); | 1084 } while (true); |
1078 } while ((coin = coin->next())); | 1085 } while ((coin = coin->next())); |
| 1086 return true; |
1079 } | 1087 } |
1080 | 1088 |
1081 // Please keep this in sync with debugRelease() | 1089 // Please keep this in sync with debugRelease() |
1082 bool SkOpCoincidence::release(SkCoincidentSpans* coin, SkCoincidentSpans* remove
) { | 1090 bool SkOpCoincidence::release(SkCoincidentSpans* coin, SkCoincidentSpans* remove
) { |
1083 SkCoincidentSpans* head = coin; | 1091 SkCoincidentSpans* head = coin; |
1084 SkCoincidentSpans* prev = nullptr; | 1092 SkCoincidentSpans* prev = nullptr; |
1085 SkCoincidentSpans* next; | 1093 SkCoincidentSpans* next; |
1086 do { | 1094 do { |
1087 next = coin->next(); | 1095 next = coin->next(); |
1088 if (coin == remove) { | 1096 if (coin == remove) { |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1265 bool SkOpCoincidence::mark(DEBUG_COIN_DECLARE_ONLY_PARAMS()) { | 1273 bool SkOpCoincidence::mark(DEBUG_COIN_DECLARE_ONLY_PARAMS()) { |
1266 DEBUG_SET_PHASE(); | 1274 DEBUG_SET_PHASE(); |
1267 SkCoincidentSpans* coin = fHead; | 1275 SkCoincidentSpans* coin = fHead; |
1268 if (!coin) { | 1276 if (!coin) { |
1269 return true; | 1277 return true; |
1270 } | 1278 } |
1271 do { | 1279 do { |
1272 SkOpSpanBase* startBase = coin->coinPtTStartWritable()->span(); | 1280 SkOpSpanBase* startBase = coin->coinPtTStartWritable()->span(); |
1273 FAIL_IF(!startBase->upCastable()); | 1281 FAIL_IF(!startBase->upCastable()); |
1274 SkOpSpan* start = startBase->upCast(); | 1282 SkOpSpan* start = startBase->upCast(); |
1275 SkASSERT(!start->deleted()); | 1283 FAIL_IF(start->deleted()); |
1276 SkOpSpanBase* end = coin->coinPtTEndWritable()->span(); | 1284 SkOpSpanBase* end = coin->coinPtTEndWritable()->span(); |
1277 SkOPASSERT(!end->deleted()); | 1285 SkOPASSERT(!end->deleted()); |
1278 SkOpSpanBase* oStart = coin->oppPtTStartWritable()->span(); | 1286 SkOpSpanBase* oStart = coin->oppPtTStartWritable()->span(); |
1279 SkOPASSERT(!oStart->deleted()); | 1287 SkOPASSERT(!oStart->deleted()); |
1280 SkOpSpanBase* oEnd = coin->oppPtTEndWritable()->span(); | 1288 SkOpSpanBase* oEnd = coin->oppPtTEndWritable()->span(); |
1281 SkASSERT(!oEnd->deleted()); | 1289 SkASSERT(!oEnd->deleted()); |
1282 bool flipped = coin->flipped(); | 1290 bool flipped = coin->flipped(); |
1283 if (flipped) { | 1291 if (flipped) { |
1284 SkTSwap(oStart, oEnd); | 1292 SkTSwap(oStart, oEnd); |
1285 } | 1293 } |
1286 /* coin and opp spans may not match up. Mark the ends, and then let the
interior | 1294 /* coin and opp spans may not match up. Mark the ends, and then let the
interior |
1287 get marked as many times as the spans allow */ | 1295 get marked as many times as the spans allow */ |
1288 start->insertCoincidence(oStart->upCast()); | 1296 start->insertCoincidence(oStart->upCast()); |
1289 end->insertCoinEnd(oEnd); | 1297 end->insertCoinEnd(oEnd); |
1290 const SkOpSegment* segment = start->segment(); | 1298 const SkOpSegment* segment = start->segment(); |
1291 const SkOpSegment* oSegment = oStart->segment(); | 1299 const SkOpSegment* oSegment = oStart->segment(); |
1292 SkOpSpanBase* next = start; | 1300 SkOpSpanBase* next = start; |
1293 SkOpSpanBase* oNext = oStart; | 1301 SkOpSpanBase* oNext = oStart; |
1294 bool ordered = coin->ordered(); | 1302 bool ordered; |
| 1303 FAIL_IF(!coin->ordered(&ordered)); |
1295 while ((next = next->upCast()->next()) != end) { | 1304 while ((next = next->upCast()->next()) != end) { |
1296 FAIL_IF(!next->upCastable()); | 1305 FAIL_IF(!next->upCastable()); |
1297 SkAssertResult(next->upCast()->insertCoincidence(oSegment, flipped,
ordered)); | 1306 SkAssertResult(next->upCast()->insertCoincidence(oSegment, flipped,
ordered)); |
1298 } | 1307 } |
1299 while ((oNext = oNext->upCast()->next()) != oEnd) { | 1308 while ((oNext = oNext->upCast()->next()) != oEnd) { |
1300 FAIL_IF(!oNext->upCast()->insertCoincidence(segment, flipped, ordere
d)); | 1309 FAIL_IF(!oNext->upCast()->insertCoincidence(segment, flipped, ordere
d)); |
1301 } | 1310 } |
1302 } while ((coin = coin->next())); | 1311 } while ((coin = coin->next())); |
1303 return true; | 1312 return true; |
1304 } | 1313 } |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1365 } | 1374 } |
1366 do { | 1375 do { |
1367 if (coin->coinPtTStart()->segment() == deleted | 1376 if (coin->coinPtTStart()->segment() == deleted |
1368 || coin->coinPtTEnd()->segment() == deleted | 1377 || coin->coinPtTEnd()->segment() == deleted |
1369 || coin->oppPtTStart()->segment() == deleted | 1378 || coin->oppPtTStart()->segment() == deleted |
1370 || coin->oppPtTEnd()->segment() == deleted) { | 1379 || coin->oppPtTEnd()->segment() == deleted) { |
1371 this->release(fHead, coin); | 1380 this->release(fHead, coin); |
1372 } | 1381 } |
1373 } while ((coin = coin->next())); | 1382 } while ((coin = coin->next())); |
1374 } | 1383 } |
OLD | NEW |