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 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 } while ((contour = contour->next())); | 270 } while ((contour = contour->next())); |
271 } | 271 } |
272 | 272 |
273 | 273 |
274 #endif | 274 #endif |
275 | 275 |
276 #if DEBUG_COIN | 276 #if DEBUG_COIN |
277 void SkOpGlobalState::debugAddToCoinChangedDict() { | 277 void SkOpGlobalState::debugAddToCoinChangedDict() { |
278 | 278 |
279 #if DEBUG_COINCIDENCE | 279 #if DEBUG_COINCIDENCE |
280 CheckHealth(contourList); | 280 SkPathOpsDebug::CheckHealth(fContourHead); |
281 #endif | 281 #endif |
282 // see if next coincident operation makes a change; if so, record it | 282 // see if next coincident operation makes a change; if so, record it |
283 SkPathOpsDebug::GlitchLog glitches; | 283 SkPathOpsDebug::GlitchLog glitches; |
284 const char* funcName = fCoinDictEntry.fFunctionName; | 284 const char* funcName = fCoinDictEntry.fFunctionName; |
285 if (!strcmp("calc_angles", funcName)) { | 285 if (!strcmp("calc_angles", funcName)) { |
286 ; | 286 ; |
287 } else if (!strcmp("missing_coincidence", funcName)) { | 287 } else if (!strcmp("missing_coincidence", funcName)) { |
288 missing_coincidence(&glitches, fContourHead); | 288 missing_coincidence(&glitches, fContourHead); |
289 } else if (!strcmp("move_multiples", funcName)) { | 289 } else if (!strcmp("move_multiples", funcName)) { |
290 move_multiples(&glitches, fContourHead); | 290 move_multiples(&glitches, fContourHead); |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
470 } | 470 } |
471 memmove(&str[idx + 2], &str[idx + 1], len - idx); | 471 memmove(&str[idx + 2], &str[idx + 1], len - idx); |
472 str[idx] = '*'; | 472 str[idx] = '*'; |
473 str[idx + 1] = '^'; | 473 str[idx + 1] = '^'; |
474 ++len; | 474 ++len; |
475 } | 475 } |
476 num = str[idx] >= '0' && str[idx] <= '9'; | 476 num = str[idx] >= '0' && str[idx] <= '9'; |
477 } | 477 } |
478 } | 478 } |
479 | 479 |
480 #if DEBUG_VALIDATE | |
481 void SkPathOpsDebug::SetPhase(SkOpContourHead* contourList, CoinID next, | |
482 int lineNumber, SkOpPhase phase) { | |
483 AddedCoin(contourList, next, 0, lineNumber); | |
484 contourList->globalState()->setPhase(phase); | |
485 } | |
486 #endif | |
487 | |
488 bool SkPathOpsDebug::ValidWind(int wind) { | 480 bool SkPathOpsDebug::ValidWind(int wind) { |
489 return wind > SK_MinS32 + 0xFFFF && wind < SK_MaxS32 - 0xFFFF; | 481 return wind > SK_MinS32 + 0xFFFF && wind < SK_MaxS32 - 0xFFFF; |
490 } | 482 } |
491 | 483 |
492 void SkPathOpsDebug::WindingPrintf(int wind) { | 484 void SkPathOpsDebug::WindingPrintf(int wind) { |
493 if (wind == SK_MinS32) { | 485 if (wind == SK_MinS32) { |
494 SkDebugf("?"); | 486 SkDebugf("?"); |
495 } else { | 487 } else { |
496 SkDebugf("%d", wind); | 488 SkDebugf("%d", wind); |
497 } | 489 } |
(...skipping 1183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1681 if (oTest != oEnd) { | 1673 if (oTest != oEnd) { |
1682 oPriorT = oTest->t(); | 1674 oPriorT = oTest->t(); |
1683 oTest = coin->flipped() ? oTest->prev() : oTest->upCast()->next(
); | 1675 oTest = coin->flipped() ? oTest->prev() : oTest->upCast()->next(
); |
1684 FAIL_IF(!oTest, coin); | 1676 FAIL_IF(!oTest, coin); |
1685 } | 1677 } |
1686 } | 1678 } |
1687 } while ((coin = coin->next())); | 1679 } while ((coin = coin->next())); |
1688 return; | 1680 return; |
1689 } | 1681 } |
1690 | 1682 |
1691 /* Commented-out lines keep this in sync with addIfMissing() */ | |
1692 void SkOpCoincidence::debugAddIfMissing(SkPathOpsDebug::GlitchLog* log, const Sk
CoincidentSpans* outer, const SkOpPtT* over1s, | |
1693 const SkOpPtT* over1e) const { | |
1694 // SkASSERT(fTop); | |
1695 if (fTop && alreadyAdded(fTop, outer, over1s, over1e)) { // in debug, fTop
may be null | |
1696 return; | |
1697 } | |
1698 if (fHead && alreadyAdded(fHead, outer, over1s, over1e)) { | |
1699 return; | |
1700 } | |
1701 log->record(SkPathOpsDebug::kAddIfMissingCoin_Glitch, outer->coinPtTStart(),
outer->coinPtTEnd(), over1s, over1e); | |
1702 this->debugValidate(); | |
1703 return; | |
1704 } | |
1705 | |
1706 /* Commented-out lines keep this in sync addIfMissing() */ | 1683 /* Commented-out lines keep this in sync addIfMissing() */ |
1707 // note that over1s, over1e, over2s, over2e are ordered | 1684 // note that over1s, over1e, over2s, over2e are ordered |
1708 void SkOpCoincidence::debugAddIfMissing(SkPathOpsDebug::GlitchLog* log, const Sk
OpPtT* over1s, const SkOpPtT* over2s, | 1685 void SkOpCoincidence::debugAddIfMissing(SkPathOpsDebug::GlitchLog* log, const Sk
OpPtT* over1s, const SkOpPtT* over2s, |
1709 double tStart, double tEnd, const SkOpSegment* coinSeg, const SkOpSegmen
t* oppSeg, bool* added, | 1686 double tStart, double tEnd, const SkOpSegment* coinSeg, const SkOpSegmen
t* oppSeg, bool* added, |
1710 const SkOpPtT* over1e, const SkOpPtT* over2e) const { | 1687 const SkOpPtT* over1e, const SkOpPtT* over2e) const { |
1711 SkASSERT(tStart < tEnd); | 1688 SkASSERT(tStart < tEnd); |
1712 SkASSERT(over1s->fT < over1e->fT); | 1689 SkASSERT(over1s->fT < over1e->fT); |
1713 SkASSERT(between(over1s->fT, tStart, over1e->fT)); | 1690 SkASSERT(between(over1s->fT, tStart, over1e->fT)); |
1714 SkASSERT(between(over1s->fT, tEnd, over1e->fT)); | 1691 SkASSERT(between(over1s->fT, tEnd, over1e->fT)); |
1715 SkASSERT(over2s->fT < over2e->fT); | 1692 SkASSERT(over2s->fT < over2e->fT); |
(...skipping 1188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2904 #endif | 2881 #endif |
2905 SkPath::FillType fillType = path.getFillType(); | 2882 SkPath::FillType fillType = path.getFillType(); |
2906 SkASSERT(fillType >= SkPath::kWinding_FillType && fillType <= SkPath::kInver
seEvenOdd_FillType); | 2883 SkASSERT(fillType >= SkPath::kWinding_FillType && fillType <= SkPath::kInver
seEvenOdd_FillType); |
2907 if (includeDeclaration) { | 2884 if (includeDeclaration) { |
2908 SkDebugf(" SkPath %s;\n", name); | 2885 SkDebugf(" SkPath %s;\n", name); |
2909 } | 2886 } |
2910 SkDebugf(" %s.setFillType(SkPath::%s);\n", name, gFillTypeStr[fillType]); | 2887 SkDebugf(" %s.setFillType(SkPath::%s);\n", name, gFillTypeStr[fillType]); |
2911 iter.setPath(path); | 2888 iter.setPath(path); |
2912 showPathContours(iter, name); | 2889 showPathContours(iter, name); |
2913 } | 2890 } |
OLD | NEW |