| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 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 "SkMutex.h" | 8 #include "SkMutex.h" |
| 9 #include "SkOpCoincidence.h" | 9 #include "SkOpCoincidence.h" |
| 10 #include "SkOpContour.h" | 10 #include "SkOpContour.h" |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 262 #if DEBUG_COINCIDENCE_VERBOSE | 262 #if DEBUG_COINCIDENCE_VERBOSE |
| 263 GlitchLog glitches; | 263 GlitchLog glitches; |
| 264 const SkOpContour* contour = contourList; | 264 const SkOpContour* contour = contourList; |
| 265 const SkOpCoincidence* coincidence = contour->globalState()->coincidence(); | 265 const SkOpCoincidence* coincidence = contour->globalState()->coincidence(); |
| 266 coincidence->debugCheckValid(id, &glitches); // don't call validate; spans m
ay be inconsistent | 266 coincidence->debugCheckValid(id, &glitches); // don't call validate; spans m
ay be inconsistent |
| 267 do { | 267 do { |
| 268 contour->debugCheckHealth(id, &glitches); | 268 contour->debugCheckHealth(id, &glitches); |
| 269 contour->debugMissingCoincidence(id, &glitches); | 269 contour->debugMissingCoincidence(id, &glitches); |
| 270 } while ((contour = contour->next())); | 270 } while ((contour = contour->next())); |
| 271 coincidence->debugRemoveCollapsed(id, &glitches); | 271 coincidence->debugRemoveCollapsed(id, &glitches); |
| 272 coincidence->debugAddMissing(id, &glitches); | 272 bool added; |
| 273 coincidence->debugAddMissing(id, &glitches, &added); |
| 273 coincidence->debugExpand(id, &glitches); | 274 coincidence->debugExpand(id, &glitches); |
| 274 coincidence->debugAddExpanded(id, &glitches); | 275 coincidence->debugAddExpanded(id, &glitches); |
| 275 coincidence->debugMark(id, &glitches); | 276 coincidence->debugMark(id, &glitches); |
| 276 coincidence->debugReorder(id, &glitches); | 277 coincidence->debugReorder(id, &glitches); |
| 277 unsigned mask = 0; | 278 unsigned mask = 0; |
| 278 for (int index = 0; index < glitches.fGlitches.count(); ++index) { | 279 for (int index = 0; index < glitches.fGlitches.count(); ++index) { |
| 279 const SpanGlitch& glitch = glitches.fGlitches[index]; | 280 const SpanGlitch& glitch = glitches.fGlitches[index]; |
| 280 mask |= 1 << glitch.fType; | 281 mask |= 1 << glitch.fType; |
| 281 } | 282 } |
| 282 for (int index = 0; index < kGlitchType_Count; ++index) { | 283 for (int index = 0; index < kGlitchType_Count; ++index) { |
| (...skipping 1103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1386 return; | 1387 return; |
| 1387 } | 1388 } |
| 1388 log->record(kAddIfMissingCoin_Glitch, id, outer->coinPtTStart(), outer->coin
PtTEnd(), over1s, over1e); | 1389 log->record(kAddIfMissingCoin_Glitch, id, outer->coinPtTStart(), outer->coin
PtTEnd(), over1s, over1e); |
| 1389 this->debugValidate(); | 1390 this->debugValidate(); |
| 1390 return; | 1391 return; |
| 1391 } | 1392 } |
| 1392 | 1393 |
| 1393 /* Commented-out lines keep this in sync addIfMissing() */ | 1394 /* Commented-out lines keep this in sync addIfMissing() */ |
| 1394 // note that over1s, over1e, over2s, over2e are ordered | 1395 // note that over1s, over1e, over2s, over2e are ordered |
| 1395 void SkOpCoincidence::debugAddIfMissing(const char* id, SkPathOpsDebug::GlitchLo
g* log, const SkOpPtT* over1s, const SkOpPtT* over2s, | 1396 void SkOpCoincidence::debugAddIfMissing(const char* id, SkPathOpsDebug::GlitchLo
g* log, const SkOpPtT* over1s, const SkOpPtT* over2s, |
| 1396 double tStart, double tEnd, const SkOpSegment* coinSeg, const SkOpSegmen
t* oppSeg, | 1397 double tStart, double tEnd, const SkOpSegment* coinSeg, const SkOpSegmen
t* oppSeg, bool* added, |
| 1397 const SkOpPtT* over1e, const SkOpPtT* over2e) const { | 1398 const SkOpPtT* over1e, const SkOpPtT* over2e) const { |
| 1398 SkASSERT(tStart < tEnd); | 1399 SkASSERT(tStart < tEnd); |
| 1399 SkASSERT(over1s->fT < over1e->fT); | 1400 SkASSERT(over1s->fT < over1e->fT); |
| 1400 SkASSERT(between(over1s->fT, tStart, over1e->fT)); | 1401 SkASSERT(between(over1s->fT, tStart, over1e->fT)); |
| 1401 SkASSERT(between(over1s->fT, tEnd, over1e->fT)); | 1402 SkASSERT(between(over1s->fT, tEnd, over1e->fT)); |
| 1402 SkASSERT(over2s->fT < over2e->fT); | 1403 SkASSERT(over2s->fT < over2e->fT); |
| 1403 SkASSERT(between(over2s->fT, tStart, over2e->fT)); | 1404 SkASSERT(between(over2s->fT, tStart, over2e->fT)); |
| 1404 SkASSERT(between(over2s->fT, tEnd, over2e->fT)); | 1405 SkASSERT(between(over2s->fT, tEnd, over2e->fT)); |
| 1405 SkASSERT(over1s->segment() == over1e->segment()); | 1406 SkASSERT(over1s->segment() == over1e->segment()); |
| 1406 SkASSERT(over2s->segment() == over2e->segment()); | 1407 SkASSERT(over2s->segment() == over2e->segment()); |
| 1407 SkASSERT(over1s->segment() == over2s->segment()); | 1408 SkASSERT(over1s->segment() == over2s->segment()); |
| 1408 SkASSERT(over1s->segment() != coinSeg); | 1409 SkASSERT(over1s->segment() != coinSeg); |
| 1409 SkASSERT(over1s->segment() != oppSeg); | 1410 SkASSERT(over1s->segment() != oppSeg); |
| 1410 SkASSERT(coinSeg != oppSeg); | 1411 SkASSERT(coinSeg != oppSeg); |
| 1411 double coinTs, coinTe, oppTs, oppTe; | 1412 double coinTs, coinTe, oppTs, oppTe; |
| 1412 coinTs = TRange(over1s, tStart, coinSeg SkDEBUGPARAMS(over1e)); | 1413 coinTs = TRange(over1s, tStart, coinSeg SkDEBUGPARAMS(over1e)); |
| 1413 coinTe = TRange(over1s, tEnd, coinSeg SkDEBUGPARAMS(over1e)); | 1414 coinTe = TRange(over1s, tEnd, coinSeg SkDEBUGPARAMS(over1e)); |
| 1414 if (coinSeg->collapsed(coinTs, coinTe)) { | 1415 if (coinSeg->collapsed(coinTs, coinTe)) { |
| 1415 return log->record(kAddIfCollapsed_Glitch, id, coinSeg); | 1416 return log->record(kAddIfCollapsed_Glitch, id, coinSeg); |
| 1416 } | 1417 } |
| 1417 oppTs = TRange(over2s, tStart, oppSeg SkDEBUGPARAMS(over2e)); | 1418 oppTs = TRange(over2s, tStart, oppSeg SkDEBUGPARAMS(over2e)); |
| 1418 oppTe = TRange(over2s, tEnd, oppSeg SkDEBUGPARAMS(over2e)); | 1419 oppTe = TRange(over2s, tEnd, oppSeg SkDEBUGPARAMS(over2e)); |
| 1419 if (oppSeg->collapsed(oppTs, oppTe)) { | 1420 if (oppSeg->collapsed(oppTs, oppTe)) { |
| 1420 return log->record(kAddIfCollapsed_Glitch, id, oppSeg); | 1421 return log->record(kAddIfCollapsed_Glitch, id, oppSeg); |
| 1421 } | 1422 } |
| 1422 if (coinTs > coinTe) { | 1423 if (coinTs > coinTe) { |
| 1423 SkTSwap(coinTs, coinTe); | 1424 SkTSwap(coinTs, coinTe); |
| 1424 SkTSwap(oppTs, oppTe); | 1425 SkTSwap(oppTs, oppTe); |
| 1425 } | 1426 } |
| 1426 return this->debugAddOrOverlap(id, log, coinSeg, oppSeg, coinTs, coinTe, opp
Ts, oppTe | 1427 return this->debugAddOrOverlap(id, log, coinSeg, oppSeg, coinTs, coinTe, opp
Ts, oppTe, added |
| 1427 ); | 1428 ); |
| 1428 } | 1429 } |
| 1429 | 1430 |
| 1430 /* Commented-out lines keep this in sync addOrOverlap() */ | 1431 /* Commented-out lines keep this in sync addOrOverlap() */ |
| 1431 // If this is called by addEndMovedSpans(), a returned false propogates out to a
n abort. | 1432 // If this is called by addEndMovedSpans(), a returned false propogates out to a
n abort. |
| 1432 // If this is called by AddIfMissing(), a returned false indicates there was not
hing to add | 1433 // If this is called by AddIfMissing(), a returned false indicates there was not
hing to add |
| 1433 void SkOpCoincidence::debugAddOrOverlap(const char* id, SkPathOpsDebug::GlitchLo
g* log, | 1434 void SkOpCoincidence::debugAddOrOverlap(const char* id, SkPathOpsDebug::GlitchLo
g* log, |
| 1434 const SkOpSegment* coinSeg, const SkOpSegment* oppSeg, | 1435 const SkOpSegment* coinSeg, const SkOpSegment* oppSeg, |
| 1435 double coinTs, double coinTe, double oppTs, double oppTe) const { | 1436 double coinTs, double coinTe, double oppTs, double oppTe, bool* added) c
onst { |
| 1436 SkTDArray<SkCoincidentSpans*> overlaps; | 1437 SkTDArray<SkCoincidentSpans*> overlaps; |
| 1437 SkASSERT(!fTop); // this is (correctly) reversed in addifMissing() | 1438 SkASSERT(!fTop); // this is (correctly) reversed in addifMissing() |
| 1438 if (fTop && !this->checkOverlap(fTop, coinSeg, oppSeg, coinTs, coinTe, oppTs
, oppTe, &overlaps)) { | 1439 if (fTop && !this->checkOverlap(fTop, coinSeg, oppSeg, coinTs, coinTe, oppTs
, oppTe, |
| 1440 &overlaps)) { |
| 1439 return; | 1441 return; |
| 1440 } | 1442 } |
| 1441 if (fHead && !this->checkOverlap(fHead, coinSeg, oppSeg, coinTs, | 1443 if (fHead && !this->checkOverlap(fHead, coinSeg, oppSeg, coinTs, |
| 1442 coinTe, oppTs, oppTe, &overlaps)) { | 1444 coinTe, oppTs, oppTe, &overlaps)) { |
| 1443 return; | 1445 return; |
| 1444 } | 1446 } |
| 1445 const SkCoincidentSpans* overlap = overlaps.count() ? overlaps[0] : nullptr; | 1447 const SkCoincidentSpans* overlap = overlaps.count() ? overlaps[0] : nullptr; |
| 1446 for (int index = 1; index < overlaps.count(); ++index) { // combine overlaps
before continuing | 1448 for (int index = 1; index < overlaps.count(); ++index) { // combine overlaps
before continuing |
| 1447 const SkCoincidentSpans* test = overlaps[index]; | 1449 const SkCoincidentSpans* test = overlaps[index]; |
| 1448 if (overlap->coinPtTStart()->fT > test->coinPtTStart()->fT) { | 1450 if (overlap->coinPtTStart()->fT > test->coinPtTStart()->fT) { |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1541 #endif | 1543 #endif |
| 1542 } | 1544 } |
| 1543 this->debugValidate(); | 1545 this->debugValidate(); |
| 1544 return (void) result; | 1546 return (void) result; |
| 1545 } | 1547 } |
| 1546 | 1548 |
| 1547 // Extra commented-out lines keep this in sync with addMissing() | 1549 // Extra commented-out lines keep this in sync with addMissing() |
| 1548 /* detects overlaps of different coincident runs on same segment */ | 1550 /* detects overlaps of different coincident runs on same segment */ |
| 1549 /* does not detect overlaps for pairs without any segments in common */ | 1551 /* does not detect overlaps for pairs without any segments in common */ |
| 1550 // returns true if caller should loop again | 1552 // returns true if caller should loop again |
| 1551 void SkOpCoincidence::debugAddMissing(const char* id, SkPathOpsDebug::GlitchLog*
log) const { | 1553 void SkOpCoincidence::debugAddMissing(const char* id, SkPathOpsDebug::GlitchLog*
log, bool* added) const { |
| 1552 const SkCoincidentSpans* outer = fHead; | 1554 const SkCoincidentSpans* outer = fHead; |
| 1553 if (!outer) { | 1555 if (!outer) { |
| 1554 return; | 1556 return; |
| 1555 } | 1557 } |
| 1556 // bool added = false; | 1558 // bool added = false; |
| 1557 // fTop = outer; | 1559 // fTop = outer; |
| 1558 // fHead = nullptr; | 1560 // fHead = nullptr; |
| 1559 do { | 1561 do { |
| 1560 // addifmissing can modify the list that this is walking | 1562 // addifmissing can modify the list that this is walking |
| 1561 // save head so that walker can iterate over old data unperturbed | 1563 // save head so that walker can iterate over old data unperturbed |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1584 SkASSERT(!innerOpp->done()); | 1586 SkASSERT(!innerOpp->done()); |
| 1585 // SkOpSegment* innerCoinWritable = const_cast<SkOpSegment*>(innerCoi
n); | 1587 // SkOpSegment* innerCoinWritable = const_cast<SkOpSegment*>(innerCoi
n); |
| 1586 // SkOpSegment* innerOppWritable = const_cast<SkOpSegment*>(innerOpp)
; | 1588 // SkOpSegment* innerOppWritable = const_cast<SkOpSegment*>(innerOpp)
; |
| 1587 if (outerCoin == innerCoin) { | 1589 if (outerCoin == innerCoin) { |
| 1588 const SkOpPtT* oce = outer->coinPtTEnd(); | 1590 const SkOpPtT* oce = outer->coinPtTEnd(); |
| 1589 SkASSERT(!oce->deleted()); | 1591 SkASSERT(!oce->deleted()); |
| 1590 const SkOpPtT* ice = inner->coinPtTEnd(); | 1592 const SkOpPtT* ice = inner->coinPtTEnd(); |
| 1591 SkASSERT(!ice->deleted()); | 1593 SkASSERT(!ice->deleted()); |
| 1592 if (outerOpp != innerOpp && this->overlap(ocs, oce, ics, ice, &o
verS, &overE)) { | 1594 if (outerOpp != innerOpp && this->overlap(ocs, oce, ics, ice, &o
verS, &overE)) { |
| 1593 this->debugAddIfMissing(id, log, ocs->starter(oce), ics->sta
rter(ice), | 1595 this->debugAddIfMissing(id, log, ocs->starter(oce), ics->sta
rter(ice), |
| 1594 overS, overE, outerOpp, innerOpp, | 1596 overS, overE, outerOpp, innerOpp, added, |
| 1595 ocs->debugEnder(oce), | 1597 ocs->debugEnder(oce), |
| 1596 ics->debugEnder(ice)); | 1598 ics->debugEnder(ice)); |
| 1597 } | 1599 } |
| 1598 } else if (outerCoin == innerOpp) { | 1600 } else if (outerCoin == innerOpp) { |
| 1599 const SkOpPtT* oce = outer->coinPtTEnd(); | 1601 const SkOpPtT* oce = outer->coinPtTEnd(); |
| 1600 SkASSERT(!oce->deleted()); | 1602 SkASSERT(!oce->deleted()); |
| 1601 const SkOpPtT* ioe = inner->oppPtTEnd(); | 1603 const SkOpPtT* ioe = inner->oppPtTEnd(); |
| 1602 SkASSERT(!ioe->deleted()); | 1604 SkASSERT(!ioe->deleted()); |
| 1603 if (outerOpp != innerCoin && this->overlap(ocs, oce, ios, ioe, &
overS, &overE)) { | 1605 if (outerOpp != innerCoin && this->overlap(ocs, oce, ios, ioe, &
overS, &overE)) { |
| 1604 this->debugAddIfMissing(id, log, ocs->starter(oce), ios->sta
rter(ioe), | 1606 this->debugAddIfMissing(id, log, ocs->starter(oce), ios->sta
rter(ioe), |
| 1605 overS, overE, outerOpp, innerCoin, | 1607 overS, overE, outerOpp, innerCoin, added, |
| 1606 ocs->debugEnder(oce), | 1608 ocs->debugEnder(oce), |
| 1607 ios->debugEnder(ioe)); | 1609 ios->debugEnder(ioe)); |
| 1608 } | 1610 } |
| 1609 } else if (outerOpp == innerCoin) { | 1611 } else if (outerOpp == innerCoin) { |
| 1610 const SkOpPtT* ooe = outer->oppPtTEnd(); | 1612 const SkOpPtT* ooe = outer->oppPtTEnd(); |
| 1611 SkASSERT(!ooe->deleted()); | 1613 SkASSERT(!ooe->deleted()); |
| 1612 const SkOpPtT* ice = inner->coinPtTEnd(); | 1614 const SkOpPtT* ice = inner->coinPtTEnd(); |
| 1613 SkASSERT(!ice->deleted()); | 1615 SkASSERT(!ice->deleted()); |
| 1614 SkASSERT(outerCoin != innerOpp); | 1616 SkASSERT(outerCoin != innerOpp); |
| 1615 if (this->overlap(oos, ooe, ics, ice, &overS, &overE)) { | 1617 if (this->overlap(oos, ooe, ics, ice, &overS, &overE)) { |
| 1616 this->debugAddIfMissing(id, log, oos->starter(ooe), ics->sta
rter(ice), | 1618 this->debugAddIfMissing(id, log, oos->starter(ooe), ics->sta
rter(ice), |
| 1617 overS, overE, outerCoin, innerOpp, | 1619 overS, overE, outerCoin, innerOpp, added, |
| 1618 oos->debugEnder(ooe), | 1620 oos->debugEnder(ooe), |
| 1619 ics->debugEnder(ice)); | 1621 ics->debugEnder(ice)); |
| 1620 } | 1622 } |
| 1621 } else if (outerOpp == innerOpp) { | 1623 } else if (outerOpp == innerOpp) { |
| 1622 const SkOpPtT* ooe = outer->oppPtTEnd(); | 1624 const SkOpPtT* ooe = outer->oppPtTEnd(); |
| 1623 SkASSERT(!ooe->deleted()); | 1625 SkASSERT(!ooe->deleted()); |
| 1624 const SkOpPtT* ioe = inner->oppPtTEnd(); | 1626 const SkOpPtT* ioe = inner->oppPtTEnd(); |
| 1625 SkASSERT(!ioe->deleted()); | 1627 SkASSERT(!ioe->deleted()); |
| 1626 SkASSERT(outerCoin != innerCoin); | 1628 SkASSERT(outerCoin != innerCoin); |
| 1627 if (this->overlap(oos, ooe, ios, ioe, &overS, &overE)) { | 1629 if (this->overlap(oos, ooe, ios, ioe, &overS, &overE)) { |
| 1628 this->debugAddIfMissing(id, log, oos->starter(ooe), ios->sta
rter(ioe), | 1630 this->debugAddIfMissing(id, log, oos->starter(ooe), ios->sta
rter(ioe), |
| 1629 overS, overE, outerCoin, innerCoin, | 1631 overS, overE, outerCoin, innerCoin, added, |
| 1630 oos->debugEnder(ooe), | 1632 oos->debugEnder(ooe), |
| 1631 ios->debugEnder(ioe)); | 1633 ios->debugEnder(ioe)); |
| 1632 } | 1634 } |
| 1633 } | 1635 } |
| 1634 this->debugValidate(); | 1636 this->debugValidate(); |
| 1635 } | 1637 } |
| 1636 } while ((outer = outer->next())); | 1638 } while ((outer = outer->next())); |
| 1637 // this->restoreHead(); | 1639 // this->restoreHead(); |
| 1638 return; | 1640 return; |
| 1639 } | 1641 } |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1966 // check for overlapping coincident spans | 1968 // check for overlapping coincident spans |
| 1967 const SkCoincidentSpans* test = head; | 1969 const SkCoincidentSpans* test = head; |
| 1968 while (test) { | 1970 while (test) { |
| 1969 const SkCoincidentSpans* next = test->next(); | 1971 const SkCoincidentSpans* next = test->next(); |
| 1970 DebugCheckOverlap(test, next, id, log); | 1972 DebugCheckOverlap(test, next, id, log); |
| 1971 DebugCheckOverlap(test, opt, id, log); | 1973 DebugCheckOverlap(test, opt, id, log); |
| 1972 test = next; | 1974 test = next; |
| 1973 } | 1975 } |
| 1974 } | 1976 } |
| 1975 | 1977 |
| 1976 #if DEBUG_COINCIDENCE_VERBOSE | |
| 1977 void SkOpCoincidence::debugCheckOverlap(const char* id, SkPathOpsDebug::GlitchLo
g* log) const { | |
| 1978 DebugCheckOverlapTop(fHead, fTop, id, log); | |
| 1979 DebugCheckOverlapTop(fTop, nullptr, id, log); | |
| 1980 } | |
| 1981 #endif | |
| 1982 | |
| 1983 static void DebugValidate(const SkCoincidentSpans* head, const SkCoincidentSpans
* opt, | 1978 static void DebugValidate(const SkCoincidentSpans* head, const SkCoincidentSpans
* opt, |
| 1984 const char* id, SkPathOpsDebug::GlitchLog* log) { | 1979 const char* id, SkPathOpsDebug::GlitchLog* log) { |
| 1985 // look for pts inside coincident spans that are not inside the opposite spa
ns | 1980 // look for pts inside coincident spans that are not inside the opposite spa
ns |
| 1986 const SkCoincidentSpans* coin = head; | 1981 const SkCoincidentSpans* coin = head; |
| 1987 while (coin) { | 1982 while (coin) { |
| 1988 SkASSERT(SkOpCoincidence::Ordered(coin->coinPtTStart()->segment(), | 1983 SkASSERT(SkOpCoincidence::Ordered(coin->coinPtTStart()->segment(), |
| 1989 coin->oppPtTStart()->segment())); | 1984 coin->oppPtTStart()->segment())); |
| 1990 SkASSERT(coin->coinPtTStart()->span()->ptT() == coin->coinPtTStart()); | 1985 SkASSERT(coin->coinPtTStart()->span()->ptT() == coin->coinPtTStart()); |
| 1991 SkASSERT(coin->coinPtTEnd()->span()->ptT() == coin->coinPtTEnd()); | 1986 SkASSERT(coin->coinPtTEnd()->span()->ptT() == coin->coinPtTEnd()); |
| 1992 SkASSERT(coin->oppPtTStart()->span()->ptT() == coin->oppPtTStart()); | 1987 SkASSERT(coin->oppPtTStart()->span()->ptT() == coin->oppPtTStart()); |
| (...skipping 649 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2642 #endif | 2637 #endif |
| 2643 SkPath::FillType fillType = path.getFillType(); | 2638 SkPath::FillType fillType = path.getFillType(); |
| 2644 SkASSERT(fillType >= SkPath::kWinding_FillType && fillType <= SkPath::kInver
seEvenOdd_FillType); | 2639 SkASSERT(fillType >= SkPath::kWinding_FillType && fillType <= SkPath::kInver
seEvenOdd_FillType); |
| 2645 if (includeDeclaration) { | 2640 if (includeDeclaration) { |
| 2646 SkDebugf(" SkPath %s;\n", name); | 2641 SkDebugf(" SkPath %s;\n", name); |
| 2647 } | 2642 } |
| 2648 SkDebugf(" %s.setFillType(SkPath::%s);\n", name, gFillTypeStr[fillType]); | 2643 SkDebugf(" %s.setFillType(SkPath::%s);\n", name, gFillTypeStr[fillType]); |
| 2649 iter.setPath(path); | 2644 iter.setPath(path); |
| 2650 showPathContours(iter, name); | 2645 showPathContours(iter, name); |
| 2651 } | 2646 } |
| OLD | NEW |