Index: tests/PathOpsTSectDebug.h |
diff --git a/tests/PathOpsTSectDebug.h b/tests/PathOpsTSectDebug.h |
index 5f8915f68123778a857c7abea9e99286ab10f33d..e28cba8bc266227b702b3a6296514f563dca3cd1 100644 |
--- a/tests/PathOpsTSectDebug.h |
+++ b/tests/PathOpsTSectDebug.h |
@@ -8,77 +8,161 @@ |
#include "SkPathOpsTSect.h" |
template<typename TCurve> |
+const SkTSpan<TCurve>* SkTSect<TCurve>::debugSpan(int id) const { |
+ const SkTSpan<TCurve>* test = fHead; |
+ do { |
+ if (test->debugID() == id) { |
+ return test; |
+ } |
+ } while ((test = test->next())); |
+#ifndef SK_RELEASE |
+ test = fOppSect->fHead; |
+ do { |
+ if (test->debugID() == id) { |
+ return test; |
+ } |
+ } while ((test = test->next())); |
+#endif |
+ return NULL; |
+} |
+ |
+template<typename TCurve> |
+const SkTSpan<TCurve>* SkTSect<TCurve>::debugT(double t) const { |
+ const SkTSpan<TCurve>* test = fHead; |
+ const SkTSpan<TCurve>* closest = NULL; |
+ double bestDist = DBL_MAX; |
+ do { |
+ if (between(test->fStartT, t, test->fEndT)) { |
+ return test; |
+ } |
+ double testDist = SkTMin(fabs(test->fStartT - t), fabs(test->fEndT - t)); |
+ if (bestDist > testDist) { |
+ bestDist = testDist; |
+ closest = test; |
+ } |
+ } while ((test = test->next())); |
+ SkASSERT(closest); |
+ return closest; |
+} |
+ |
+template<typename TCurve> |
void SkTSect<TCurve>::dump() const { |
+ dumpCommon(fHead); |
+} |
+ |
+extern int gDumpTSectNum; |
+ |
+template<typename TCurve> |
+void SkTSect<TCurve>::dumpBoth(SkTSect* opp) const { |
+#if DEBUG_T_SECT_DUMP <= 2 |
+#if DEBUG_T_SECT_DUMP == 2 |
+ SkDebugf("%d ", ++gDumpTSectNum); |
+#endif |
+ this->dump(); |
+ SkDebugf(" "); |
+ opp->dump(); |
+ SkDebugf("\n"); |
+#elif DEBUG_T_SECT_DUMP == 3 |
+ SkDebugf("<div id=\"sect%d\">\n", ++gDumpTSectNum); |
+ if (this->fHead) { |
+ this->dumpCurves(); |
+ } |
+ if (opp->fHead) { |
+ PATH_OPS_DEBUG_CODE(opp->dumpCurves()); |
+ } |
+ SkDebugf("</div>\n\n"); |
+#endif |
+} |
+ |
+template<typename TCurve> |
+void SkTSect<TCurve>::dumpBounds(int id) const { |
+ const SkTSpan<TCurve>* bounded = debugSpan(id); |
+ if (!bounded) { |
+ SkDebugf("no span matches %d\n", id); |
+ return; |
+ } |
+ const SkTSpan<TCurve>* test = bounded->debugOpp()->fHead; |
+ do { |
+ if (test->findOppSpan(bounded)) { |
+ test->dump(); |
+ } |
+ } while ((test = test->next())); |
+} |
+ |
+template<typename TCurve> |
+void SkTSect<TCurve>::dumpCoin() const { |
+ dumpCommon(fCoincident); |
+} |
+ |
+template<typename TCurve> |
+void SkTSect<TCurve>::dumpCoinCurves() const { |
+ dumpCommonCurves(fCoincident); |
+} |
+ |
+template<typename TCurve> |
+void SkTSect<TCurve>::dumpCommon(const SkTSpan<TCurve>* test) const { |
SkDebugf("id=%d", debugID()); |
- const SkTSpan<TCurve>* test = fHead; |
if (!test) { |
SkDebugf(" (empty)"); |
return; |
} |
do { |
SkDebugf(" "); |
- test->dump(this); |
+ test->dump(); |
} while ((test = test->next())); |
} |
template<typename TCurve> |
-void SkTSect<TCurve>::dumpBoth(const SkTSect& opp) const { |
- dump(); |
- SkDebugf(" "); |
- opp.dump(); |
- SkDebugf("\n"); |
+void SkTSect<TCurve>::dumpCommonCurves(const SkTSpan<TCurve>* test) const { |
+ do { |
+ test->fPart.dumpID(test->debugID()); |
+ } while ((test = test->next())); |
} |
template<typename TCurve> |
-void SkTSect<TCurve>::dumpBoth(const SkTSect* opp) const { |
- dumpBoth(*opp); |
+void SkTSect<TCurve>::dumpCurves() const { |
+ dumpCommonCurves(fHead); |
} |
template<typename TCurve> |
-void SkTSect<TCurve>::dumpCurves() const { |
- const SkTSpan<TCurve>* test = fHead; |
- do { |
- test->fPart.dump(); |
- } while ((test = test->next())); |
+const SkTSpan<TCurve>* SkTSpan<TCurve>::debugSpan(int id) const { |
+ return PATH_OPS_DEBUG_RELEASE(fDebugSect->debugSpan(id), NULL); |
} |
-#if !DEBUG_T_SECT |
template<typename TCurve> |
-int SkTSpan<TCurve>::debugID(const SkTSect<TCurve>* sect) const { |
- if (!sect) { |
- return -1; |
- } |
- int id = 1; |
- const SkTSpan* test = sect->fHead; |
- while (test && test != this) { |
- ++id; |
- test = test->fNext; |
+const SkTSpan<TCurve>* SkTSpan<TCurve>::debugT(double t) const { |
+ return PATH_OPS_DEBUG_RELEASE(fDebugSect->debugT(t), NULL); |
+} |
+ |
+template<typename TCurve> |
+void SkTSpan<TCurve>::dump() const { |
+ dumpID(); |
+ SkDebugf("=(%g,%g) [", fStartT, fEndT); |
+ const SkTSpanBounded<TCurve>* testBounded = fBounded; |
+ while (testBounded) { |
+ const SkTSpan* span = testBounded->fBounded; |
+ const SkTSpanBounded<TCurve>* next = testBounded->fNext; |
+ span->dumpID(); |
+ if (next) { |
+ SkDebugf(","); |
+ } |
+ testBounded = next; |
} |
- return id; |
+ SkDebugf("]"); |
} |
-#endif |
template<typename TCurve> |
-void SkTSpan<TCurve>::dumpID(const SkTSect<TCurve>* sect) const { |
+void SkTSpan<TCurve>::dumpBounds(int id) const { |
+ PATH_OPS_DEBUG_CODE(fDebugSect->dumpBounds(id)); |
+} |
+ |
+template<typename TCurve> |
+void SkTSpan<TCurve>::dumpID() const { |
if (fCoinStart.isCoincident()) { |
SkDebugf("%c", '*'); |
} |
- SkDebugf("%d", debugID(sect)); |
+ SkDebugf("%d", debugID()); |
if (fCoinEnd.isCoincident()) { |
SkDebugf("%c", '*'); |
} |
} |
- |
-template<typename TCurve> |
-void SkTSpan<TCurve>::dump(const SkTSect<TCurve>* sect) const { |
- dumpID(sect); |
- SkDebugf("=(%g,%g) [", fStartT, fEndT); |
- for (int index = 0; index < fBounded.count(); ++index) { |
- SkTSpan* span = fBounded[index]; |
- span->dumpID(sect); |
- if (index < fBounded.count() - 1) { |
- SkDebugf(","); |
- } |
- } |
- SkDebugf("]"); |
-} |