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 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
254 SkASSERT(coinPtTStart->fT < coinPtTEnd->fT); | 254 SkASSERT(coinPtTStart->fT < coinPtTEnd->fT); |
255 SkASSERT(oppPtTStart->fT != oppPtTEnd->fT); | 255 SkASSERT(oppPtTStart->fT != oppPtTEnd->fT); |
256 SkASSERT(!coinPtTStart->deleted()); | 256 SkASSERT(!coinPtTStart->deleted()); |
257 SkASSERT(!coinPtTEnd->deleted()); | 257 SkASSERT(!coinPtTEnd->deleted()); |
258 SkASSERT(!oppPtTStart->deleted()); | 258 SkASSERT(!oppPtTStart->deleted()); |
259 SkASSERT(!oppPtTEnd->deleted()); | 259 SkASSERT(!oppPtTEnd->deleted()); |
260 DebugCheckAdd(fHead, coinPtTStart, coinPtTEnd, oppPtTStart, oppPtTEnd); | 260 DebugCheckAdd(fHead, coinPtTStart, coinPtTEnd, oppPtTStart, oppPtTEnd); |
261 DebugCheckAdd(fTop, coinPtTStart, coinPtTEnd, oppPtTStart, oppPtTEnd); | 261 DebugCheckAdd(fTop, coinPtTStart, coinPtTEnd, oppPtTStart, oppPtTEnd); |
262 SkCoincidentSpans* coinRec = SkOpTAllocator<SkCoincidentSpans>::Allocate( | 262 SkCoincidentSpans* coinRec = SkOpTAllocator<SkCoincidentSpans>::Allocate( |
263 this->globalState()->allocator()); | 263 this->globalState()->allocator()); |
264 coinRec->init(); | 264 coinRec->init(SkDEBUGCODE(fGlobalState)); |
265 coinRec->set(this->fHead, coinPtTStart, coinPtTEnd, oppPtTStart, oppPtTEnd | 265 coinRec->set(this->fHead, coinPtTStart, coinPtTEnd, oppPtTStart, oppPtTEnd |
266 SkDEBUGPARAMS(fGlobalState->nextCoinID())); | 266 SkDEBUGPARAMS(fGlobalState->nextCoinID())); |
267 fHead = coinRec; | 267 fHead = coinRec; |
268 } | 268 } |
269 | 269 |
270 // description below | 270 // description below |
271 bool SkOpCoincidence::addEndMovedSpans(const SkOpSpan* base, const SkOpSpanBase*
testSpan) { | 271 bool SkOpCoincidence::addEndMovedSpans(const SkOpSpan* base, const SkOpSpanBase*
testSpan) { |
272 const SkOpPtT* testPtT = testSpan->ptT(); | 272 const SkOpPtT* testPtT = testSpan->ptT(); |
273 const SkOpPtT* stopPtT = testPtT; | 273 const SkOpPtT* stopPtT = testPtT; |
274 const SkOpSegment* baseSeg = base->segment(); | 274 const SkOpSegment* baseSeg = base->segment(); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
327 if (!this->addOrOverlap(coinSeg, oppSeg, coinTs, coinTe, oppTs, oppT
e)) { | 327 if (!this->addOrOverlap(coinSeg, oppSeg, coinTs, coinTe, oppTs, oppT
e)) { |
328 return false; | 328 return false; |
329 } | 329 } |
330 } | 330 } |
331 } | 331 } |
332 return true; | 332 return true; |
333 } | 333 } |
334 | 334 |
335 // description below | 335 // description below |
336 bool SkOpCoincidence::addEndMovedSpans(const SkOpPtT* ptT) { | 336 bool SkOpCoincidence::addEndMovedSpans(const SkOpPtT* ptT) { |
| 337 if (!ptT->span()->upCastable()) { |
| 338 return false; |
| 339 } |
337 const SkOpSpan* base = ptT->span()->upCast(); | 340 const SkOpSpan* base = ptT->span()->upCast(); |
338 const SkOpSpan* prev = base->prev(); | 341 const SkOpSpan* prev = base->prev(); |
339 if (!prev) { | 342 if (!prev) { |
340 return false; | 343 return false; |
341 } | 344 } |
342 if (!prev->isCanceled()) { | 345 if (!prev->isCanceled()) { |
343 if (!this->addEndMovedSpans(base, base->prev())) { | 346 if (!this->addEndMovedSpans(base, base->prev())) { |
344 return false; | 347 return false; |
345 } | 348 } |
346 } | 349 } |
(...skipping 1014 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1361 } | 1364 } |
1362 /* coin and opp spans may not match up. Mark the ends, and then let the
interior | 1365 /* coin and opp spans may not match up. Mark the ends, and then let the
interior |
1363 get marked as many times as the spans allow */ | 1366 get marked as many times as the spans allow */ |
1364 start->insertCoincidence(oStart->upCast()); | 1367 start->insertCoincidence(oStart->upCast()); |
1365 end->insertCoinEnd(oEnd); | 1368 end->insertCoinEnd(oEnd); |
1366 const SkOpSegment* segment = start->segment(); | 1369 const SkOpSegment* segment = start->segment(); |
1367 const SkOpSegment* oSegment = oStart->segment(); | 1370 const SkOpSegment* oSegment = oStart->segment(); |
1368 SkOpSpanBase* next = start; | 1371 SkOpSpanBase* next = start; |
1369 SkOpSpanBase* oNext = oStart; | 1372 SkOpSpanBase* oNext = oStart; |
1370 while ((next = next->upCast()->next()) != end) { | 1373 while ((next = next->upCast()->next()) != end) { |
| 1374 if (!next->upCastable()) { |
| 1375 return false; |
| 1376 } |
1371 if (!next->upCast()->insertCoincidence(oSegment, flipped)) { | 1377 if (!next->upCast()->insertCoincidence(oSegment, flipped)) { |
1372 return false; | 1378 return false; |
1373 } | 1379 } |
1374 } | 1380 } |
1375 while ((oNext = oNext->upCast()->next()) != oEnd) { | 1381 while ((oNext = oNext->upCast()->next()) != oEnd) { |
1376 if (!oNext->upCast()->insertCoincidence(segment, flipped)) { | 1382 if (!oNext->upCast()->insertCoincidence(segment, flipped)) { |
1377 return false; | 1383 return false; |
1378 } | 1384 } |
1379 } | 1385 } |
1380 } while ((coin = coin->next())); | 1386 } while ((coin = coin->next())); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1449 this->release(fHead, coin); | 1455 this->release(fHead, coin); |
1450 } | 1456 } |
1451 } while ((coin = coin->next())); | 1457 } while ((coin = coin->next())); |
1452 } | 1458 } |
1453 | 1459 |
1454 bool SkOpCoincidence::testForCoincidence(const SkCoincidentSpans* outer, const S
kOpPtT* testS, | 1460 bool SkOpCoincidence::testForCoincidence(const SkCoincidentSpans* outer, const S
kOpPtT* testS, |
1455 const SkOpPtT* testE) const { | 1461 const SkOpPtT* testE) const { |
1456 return testS->segment()->testForCoincidence(testS, testE, testS->span(), | 1462 return testS->segment()->testForCoincidence(testS, testE, testS->span(), |
1457 testE->span(), outer->coinPtTStart()->segment()); | 1463 testE->span(), outer->coinPtTStart()->segment()); |
1458 } | 1464 } |
OLD | NEW |