| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 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 "SkIntersections.h" | 7 #include "SkIntersections.h" |
| 8 #include "SkOpContour.h" | 8 #include "SkOpContour.h" |
| 9 #include "SkOpSegment.h" | 9 #include "SkOpSegment.h" |
| 10 #include "SkPathWriter.h" | 10 #include "SkPathWriter.h" |
| (...skipping 1193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1204 int oWindValue = oTest.fWindValue; | 1204 int oWindValue = oTest.fWindValue; |
| 1205 int oOppValue = oTest.fOppValue; | 1205 int oOppValue = oTest.fOppValue; |
| 1206 if (binary) { | 1206 if (binary) { |
| 1207 SkTSwap<int>(oWindValue, oOppValue); | 1207 SkTSwap<int>(oWindValue, oOppValue); |
| 1208 } | 1208 } |
| 1209 do { | 1209 do { |
| 1210 (void) bumpSpan(&fTs[index], oWindValue, oOppValue); | 1210 (void) bumpSpan(&fTs[index], oWindValue, oOppValue); |
| 1211 } while (++index < endIndex); | 1211 } while (++index < endIndex); |
| 1212 } | 1212 } |
| 1213 | 1213 |
| 1214 void SkOpSegment::bumpCoincidentThis(const SkOpSpan& oTest, bool binary, int* in
dexPtr, | 1214 bool SkOpSegment::bumpCoincidentThis(const SkOpSpan& oTest, bool binary, int* in
dexPtr, |
| 1215 SkTArray<SkPoint, true>* outsideTs) { | 1215 SkTArray<SkPoint, true>* outsideTs) { |
| 1216 int index = *indexPtr; | 1216 int index = *indexPtr; |
| 1217 int oWindValue = oTest.fWindValue; | 1217 int oWindValue = oTest.fWindValue; |
| 1218 int oOppValue = oTest.fOppValue; | 1218 int oOppValue = oTest.fOppValue; |
| 1219 if (binary) { | 1219 if (binary) { |
| 1220 SkTSwap<int>(oWindValue, oOppValue); | 1220 SkTSwap<int>(oWindValue, oOppValue); |
| 1221 } | 1221 } |
| 1222 SkOpSpan* const test = &fTs[index]; | 1222 SkOpSpan* const test = &fTs[index]; |
| 1223 SkOpSpan* end = test; | 1223 SkOpSpan* end = test; |
| 1224 const SkPoint& oStartPt = oTest.fPt; | 1224 const SkPoint& oStartPt = oTest.fPt; |
| 1225 do { | 1225 do { |
| 1226 if (end->fDone && !end->fTiny && !end->fSmall) { // extremely large pat
hs trigger this |
| 1227 return false; |
| 1228 } |
| 1226 if (bumpSpan(end, oWindValue, oOppValue)) { | 1229 if (bumpSpan(end, oWindValue, oOppValue)) { |
| 1227 TrackOutside(outsideTs, oStartPt); | 1230 TrackOutside(outsideTs, oStartPt); |
| 1228 } | 1231 } |
| 1229 end = &fTs[++index]; | 1232 end = &fTs[++index]; |
| 1230 } while ((end->fPt == test->fPt || precisely_equal(end->fT, test->fT)) && en
d->fT < 1); | 1233 } while ((end->fPt == test->fPt || precisely_equal(end->fT, test->fT)) && en
d->fT < 1); |
| 1231 *indexPtr = index; | 1234 *indexPtr = index; |
| 1235 return true; |
| 1232 } | 1236 } |
| 1233 | 1237 |
| 1234 void SkOpSegment::bumpCoincidentOBlind(int index, int endIndex) { | 1238 void SkOpSegment::bumpCoincidentOBlind(int index, int endIndex) { |
| 1235 do { | 1239 do { |
| 1236 zeroSpan(&fTs[index]); | 1240 zeroSpan(&fTs[index]); |
| 1237 } while (++index < endIndex); | 1241 } while (++index < endIndex); |
| 1238 } | 1242 } |
| 1239 | 1243 |
| 1240 // because of the order in which coincidences are resolved, this and other | 1244 // because of the order in which coincidences are resolved, this and other |
| 1241 // may not have the same intermediate points. Compute the corresponding | 1245 // may not have the same intermediate points. Compute the corresponding |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1322 SkDEBUGCODE(firstWind = oTest->fWindValue); | 1326 SkDEBUGCODE(firstWind = oTest->fWindValue); |
| 1323 SkDEBUGCODE(firstOpp = oTest->fOppValue); | 1327 SkDEBUGCODE(firstOpp = oTest->fOppValue); |
| 1324 do { | 1328 do { |
| 1325 SkASSERT(firstWind == other->fTs[oIndex].fWindValue); | 1329 SkASSERT(firstWind == other->fTs[oIndex].fWindValue); |
| 1326 SkASSERT(firstOpp == other->fTs[oIndex].fOppValue); | 1330 SkASSERT(firstOpp == other->fTs[oIndex].fOppValue); |
| 1327 ++oIndex; | 1331 ++oIndex; |
| 1328 SkASSERT(oIndex < other->fTs.count()); | 1332 SkASSERT(oIndex < other->fTs.count()); |
| 1329 } while (*oTestPt == other->fTs[oIndex].fPt); | 1333 } while (*oTestPt == other->fTs[oIndex].fPt); |
| 1330 } else { | 1334 } else { |
| 1331 if (!binary || test->fWindValue + oTest->fOppValue >= 0) { | 1335 if (!binary || test->fWindValue + oTest->fOppValue >= 0) { |
| 1332 bumpCoincidentThis(*oTest, binary, &index, &outsidePts); | 1336 if (!bumpCoincidentThis(*oTest, binary, &index, &outsidePts)) { |
| 1337 return false; |
| 1338 } |
| 1333 other->bumpCoincidentOther(*test, &oIndex, &oOutsidePts); | 1339 other->bumpCoincidentOther(*test, &oIndex, &oOutsidePts); |
| 1334 } else { | 1340 } else { |
| 1335 other->bumpCoincidentThis(*test, binary, &oIndex, &oOutsidePts); | 1341 if (!other->bumpCoincidentThis(*test, binary, &oIndex, &oOutside
Pts)) { |
| 1342 return false; |
| 1343 } |
| 1336 bumpCoincidentOther(*oTest, &index, &outsidePts); | 1344 bumpCoincidentOther(*oTest, &index, &outsidePts); |
| 1337 } | 1345 } |
| 1338 } | 1346 } |
| 1339 test = &fTs[index]; | 1347 test = &fTs[index]; |
| 1340 testPt = &test->fPt; | 1348 testPt = &test->fPt; |
| 1341 testT = test->fT; | 1349 testT = test->fT; |
| 1342 oTest = &other->fTs[oIndex]; | 1350 oTest = &other->fTs[oIndex]; |
| 1343 oTestPt = &oTest->fPt; | 1351 oTestPt = &oTest->fPt; |
| 1344 if (endPt == *testPt || precisely_equal(endT, testT)) { | 1352 if (endPt == *testPt || precisely_equal(endT, testT)) { |
| 1345 break; | 1353 break; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1389 break; | 1397 break; |
| 1390 } | 1398 } |
| 1391 oPeek = &other->fTs[oPeekIndex]; | 1399 oPeek = &other->fTs[oPeekIndex]; |
| 1392 } while (endPt == oPeek->fPt); | 1400 } while (endPt == oPeek->fPt); |
| 1393 } | 1401 } |
| 1394 if (success) { | 1402 if (success) { |
| 1395 do { | 1403 do { |
| 1396 if (!binary || test->fWindValue + oTest->fOppValue >= 0) { | 1404 if (!binary || test->fWindValue + oTest->fOppValue >= 0) { |
| 1397 other->bumpCoincidentOther(*test, &oIndex, &oOutsidePts); | 1405 other->bumpCoincidentOther(*test, &oIndex, &oOutsidePts); |
| 1398 } else { | 1406 } else { |
| 1399 other->bumpCoincidentThis(*test, binary, &oIndex, &oOutsideP
ts); | 1407 if (!other->bumpCoincidentThis(*test, binary, &oIndex, &oOut
sidePts)) { |
| 1408 return false; |
| 1409 } |
| 1400 } | 1410 } |
| 1401 oTest = &other->fTs[oIndex]; | 1411 oTest = &other->fTs[oIndex]; |
| 1402 oTestPt = &oTest->fPt; | 1412 oTestPt = &oTest->fPt; |
| 1403 } while (endPt != *oTestPt); | 1413 } while (endPt != *oTestPt); |
| 1404 } | 1414 } |
| 1405 } | 1415 } |
| 1406 int outCount = outsidePts.count(); | 1416 int outCount = outsidePts.count(); |
| 1407 if (!done() && outCount) { | 1417 if (!done() && outCount) { |
| 1408 addCoinOutsides(outsidePts[0], endPt, other); | 1418 addCoinOutsides(outsidePts[0], endPt, other); |
| 1409 } | 1419 } |
| (...skipping 3035 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4445 SkASSERT(span->fWindValue > 0 || span->fOppValue != 0); | 4455 SkASSERT(span->fWindValue > 0 || span->fOppValue != 0); |
| 4446 span->fWindValue = 0; | 4456 span->fWindValue = 0; |
| 4447 span->fOppValue = 0; | 4457 span->fOppValue = 0; |
| 4448 if (span->fTiny || span->fSmall) { | 4458 if (span->fTiny || span->fSmall) { |
| 4449 return; | 4459 return; |
| 4450 } | 4460 } |
| 4451 SkASSERT(!span->fDone); | 4461 SkASSERT(!span->fDone); |
| 4452 span->fDone = true; | 4462 span->fDone = true; |
| 4453 ++fDoneSpans; | 4463 ++fDoneSpans; |
| 4454 } | 4464 } |
| OLD | NEW |