Index: tests/PathOpsDebug.cpp |
diff --git a/tests/PathOpsDebug.cpp b/tests/PathOpsDebug.cpp |
index 9930453d01ea9fb0a7d37af298ebc1fa59a4b7ad..c4fbbfa69517610c7168e6fb9e6f361b2c455e78 100755 |
--- a/tests/PathOpsDebug.cpp |
+++ b/tests/PathOpsDebug.cpp |
@@ -1,12 +1,3 @@ |
-/* |
- * Copyright 2014 Google Inc. |
- * |
- * Use of this source code is governed by a BSD-style license that can be |
- * found in the LICENSE file. |
- */ |
- |
-#include "PathOpsTSectDebug.h" |
-#include "SkOpCoincidence.h" |
#include "SkOpContour.h" |
#include "SkIntersectionHelper.h" |
#include "SkOpSegment.h" |
@@ -59,6 +50,7 @@ |
SkDebugf(", "); |
} |
} |
+ SkDebugf(");\n"); |
} |
static void showPathContours(SkPath::RawIter& iter, const char* pathName) { |
@@ -69,27 +61,18 @@ |
case SkPath::kMove_Verb: |
SkDebugf(" %s.moveTo(", pathName); |
output_points(&pts[0], 1); |
- SkDebugf(");\n"); |
continue; |
case SkPath::kLine_Verb: |
SkDebugf(" %s.lineTo(", pathName); |
output_points(&pts[1], 1); |
- SkDebugf(");\n"); |
break; |
case SkPath::kQuad_Verb: |
SkDebugf(" %s.quadTo(", pathName); |
output_points(&pts[1], 2); |
- SkDebugf(");\n"); |
- break; |
- case SkPath::kConic_Verb: |
- SkDebugf(" %s.conicTo(", pathName); |
- output_points(&pts[1], 2); |
- SkDebugf(", %1.9gf);\n", iter.conicWeight()); |
break; |
case SkPath::kCubic_Verb: |
SkDebugf(" %s.cubicTo(", pathName); |
output_points(&pts[1], 3); |
- SkDebugf(");\n"); |
break; |
case SkPath::kClose_Verb: |
SkDebugf(" %s.close();\n", pathName); |
@@ -185,393 +168,6 @@ |
} |
#endif |
-void SkDCubic::dump() const { |
- dumpInner(); |
- SkDebugf("}},\n"); |
-} |
- |
-void SkDCubic::dumpID(int id) const { |
- dumpInner(); |
- SkDebugf("}} id=%d\n", id); |
-} |
- |
-static inline bool double_is_NaN(double x) { return x != x; } |
- |
-void SkDCubic::dumpInner() const { |
- SkDebugf("{{"); |
- int index = 0; |
- do { |
- if (index != 0) { |
- if (double_is_NaN(fPts[index].fX) && double_is_NaN(fPts[index].fY)) { |
- return; |
- } |
- SkDebugf(", "); |
- } |
- fPts[index].dump(); |
- } while (++index < 3); |
- if (double_is_NaN(fPts[index].fX) && double_is_NaN(fPts[index].fY)) { |
- return; |
- } |
- SkDebugf(", "); |
- fPts[index].dump(); |
-} |
- |
-void SkDLine::dump() const { |
- SkDebugf("{{"); |
- fPts[0].dump(); |
- SkDebugf(", "); |
- fPts[1].dump(); |
- SkDebugf("}},\n"); |
-} |
- |
-void SkDPoint::dump() const { |
- SkDebugf("{"); |
- DebugDumpDouble(fX); |
- SkDebugf(", "); |
- DebugDumpDouble(fY); |
- SkDebugf("}"); |
-} |
- |
-void SkDPoint::Dump(const SkPoint& pt) { |
- SkDebugf("{"); |
- DebugDumpFloat(pt.fX); |
- SkDebugf(", "); |
- DebugDumpFloat(pt.fY); |
- SkDebugf("}"); |
-} |
- |
-void SkDPoint::DumpHex(const SkPoint& pt) { |
- SkDebugf("{"); |
- DebugDumpHexFloat(pt.fX); |
- SkDebugf(", "); |
- DebugDumpHexFloat(pt.fY); |
- SkDebugf("}"); |
-} |
- |
-void SkDQuad::dump() const { |
- dumpInner(); |
- SkDebugf("}},\n"); |
-} |
- |
-void SkDQuad::dumpID(int id) const { |
- dumpInner(); |
- SkDebugf("}} id=%d\n", id); |
-} |
- |
-void SkDQuad::dumpInner() const { |
- SkDebugf("{{"); |
- int index = 0; |
- do { |
- fPts[index].dump(); |
- SkDebugf(", "); |
- } while (++index < 2); |
- fPts[index].dump(); |
-} |
- |
-void SkIntersections::dump() const { |
- SkDebugf("used=%d of %d", fUsed, fMax); |
- for (int index = 0; index < fUsed; ++index) { |
- SkDebugf(" t=(%s%1.9g,%s%1.9g) pt=(%1.9g,%1.9g)", |
- fIsCoincident[0] & (1 << index) ? "*" : "", fT[0][index], |
- fIsCoincident[1] & (1 << index) ? "*" : "", fT[1][index], |
- fPt[index].fX, fPt[index].fY); |
- if (index < 2 && fNearlySame[index]) { |
- SkDebugf(" pt2=(%1.9g,%1.9g)",fPt2[index].fX, fPt2[index].fY); |
- } |
- } |
- SkDebugf("\n"); |
-} |
- |
-const SkOpAngle* SkPathOpsDebug::DebugAngleAngle(const SkOpAngle* angle, int id) { |
- return angle->debugAngle(id); |
-} |
- |
-SkOpContour* SkPathOpsDebug::DebugAngleContour(SkOpAngle* angle, int id) { |
- return angle->debugContour(id); |
-} |
- |
-const SkOpPtT* SkPathOpsDebug::DebugAnglePtT(const SkOpAngle* angle, int id) { |
- return angle->debugPtT(id); |
-} |
- |
-const SkOpSegment* SkPathOpsDebug::DebugAngleSegment(const SkOpAngle* angle, int id) { |
- return angle->debugSegment(id); |
-} |
- |
-const SkOpSpanBase* SkPathOpsDebug::DebugAngleSpan(const SkOpAngle* angle, int id) { |
- return angle->debugSpan(id); |
-} |
- |
-const SkOpAngle* SkPathOpsDebug::DebugContourAngle(SkOpContour* contour, int id) { |
- return contour->debugAngle(id); |
-} |
- |
-SkOpContour* SkPathOpsDebug::DebugContourContour(SkOpContour* contour, int id) { |
- return contour->debugContour(id); |
-} |
- |
-const SkOpPtT* SkPathOpsDebug::DebugContourPtT(SkOpContour* contour, int id) { |
- return contour->debugPtT(id); |
-} |
- |
-const SkOpSegment* SkPathOpsDebug::DebugContourSegment(SkOpContour* contour, int id) { |
- return contour->debugSegment(id); |
-} |
- |
-const SkOpSpanBase* SkPathOpsDebug::DebugContourSpan(SkOpContour* contour, int id) { |
- return contour->debugSpan(id); |
-} |
- |
-const SkOpAngle* SkPathOpsDebug::DebugPtTAngle(const SkOpPtT* ptT, int id) { |
- return ptT->debugAngle(id); |
-} |
- |
-SkOpContour* SkPathOpsDebug::DebugPtTContour(SkOpPtT* ptT, int id) { |
- return ptT->debugContour(id); |
-} |
- |
-const SkOpPtT* SkPathOpsDebug::DebugPtTPtT(const SkOpPtT* ptT, int id) { |
- return ptT->debugPtT(id); |
-} |
- |
-const SkOpSegment* SkPathOpsDebug::DebugPtTSegment(const SkOpPtT* ptT, int id) { |
- return ptT->debugSegment(id); |
-} |
- |
-const SkOpSpanBase* SkPathOpsDebug::DebugPtTSpan(const SkOpPtT* ptT, int id) { |
- return ptT->debugSpan(id); |
-} |
- |
-const SkOpAngle* SkPathOpsDebug::DebugSegmentAngle(const SkOpSegment* span, int id) { |
- return span->debugAngle(id); |
-} |
- |
-SkOpContour* SkPathOpsDebug::DebugSegmentContour(SkOpSegment* span, int id) { |
- return span->debugContour(id); |
-} |
- |
-const SkOpPtT* SkPathOpsDebug::DebugSegmentPtT(const SkOpSegment* span, int id) { |
- return span->debugPtT(id); |
-} |
- |
-const SkOpSegment* SkPathOpsDebug::DebugSegmentSegment(const SkOpSegment* span, int id) { |
- return span->debugSegment(id); |
-} |
- |
-const SkOpSpanBase* SkPathOpsDebug::DebugSegmentSpan(const SkOpSegment* span, int id) { |
- return span->debugSpan(id); |
-} |
- |
-const SkOpAngle* SkPathOpsDebug::DebugSpanAngle(const SkOpSpanBase* span, int id) { |
- return span->debugAngle(id); |
-} |
- |
-SkOpContour* SkPathOpsDebug::DebugSpanContour(SkOpSpanBase* span, int id) { |
- return span->debugContour(id); |
-} |
- |
-const SkOpPtT* SkPathOpsDebug::DebugSpanPtT(const SkOpSpanBase* span, int id) { |
- return span->debugPtT(id); |
-} |
- |
-const SkOpSegment* SkPathOpsDebug::DebugSpanSegment(const SkOpSpanBase* span, int id) { |
- return span->debugSegment(id); |
-} |
- |
-const SkOpSpanBase* SkPathOpsDebug::DebugSpanSpan(const SkOpSpanBase* span, int id) { |
- return span->debugSpan(id); |
-} |
- |
-void SkPathOpsDebug::DumpContours(SkTDArray<SkOpContour* >* contours) { |
- int count = contours->count(); |
- for (int index = 0; index < count; ++index) { |
- (*contours)[index]->dump(); |
- } |
-} |
- |
-void SkPathOpsDebug::DumpContoursAll(SkTDArray<SkOpContour* >* contours) { |
- int count = contours->count(); |
- for (int index = 0; index < count; ++index) { |
- (*contours)[index]->dumpAll(); |
- } |
-} |
- |
-void SkPathOpsDebug::DumpContoursAngles(const SkTDArray<SkOpContour* >* contours) { |
- int count = contours->count(); |
- for (int index = 0; index < count; ++index) { |
- (*contours)[index]->dumpAngles(); |
- } |
-} |
- |
-void SkPathOpsDebug::DumpContoursPts(const SkTDArray<SkOpContour* >* contours) { |
- int count = contours->count(); |
- for (int index = 0; index < count; ++index) { |
- (*contours)[index]->dumpPts(); |
- } |
-} |
- |
-void SkPathOpsDebug::DumpContoursPt(const SkTDArray<SkOpContour* >* contours, int segmentID) { |
- int count = contours->count(); |
- for (int index = 0; index < count; ++index) { |
- (*contours)[index]->dumpPt(segmentID); |
- } |
-} |
- |
-void SkPathOpsDebug::DumpContoursSegment(const SkTDArray<SkOpContour* >* contours, |
- int segmentID) { |
- if (contours->count()) { |
- (*contours)[0]->dumpSegment(segmentID); |
- } |
-} |
- |
-void SkPathOpsDebug::DumpContoursSpan(const SkTDArray<SkOpContour* >* contours, |
- int spanID) { |
- if (contours->count()) { |
- (*contours)[0]->dumpSpan(spanID); |
- } |
-} |
- |
-void SkPathOpsDebug::DumpContoursSpans(const SkTDArray<SkOpContour* >* contours) { |
- int count = contours->count(); |
- for (int index = 0; index < count; ++index) { |
- (*contours)[index]->dumpSpans(); |
- } |
-} |
- |
-const SkTSpan<SkDCubic>* DebugSpan(const SkTSect<SkDCubic>* sect, int id) { |
- return sect->debugSpan(id); |
-} |
- |
-const SkTSpan<SkDQuad>* DebugSpan(const SkTSect<SkDQuad>* sect, int id) { |
- return sect->debugSpan(id); |
-} |
- |
-const SkTSpan<SkDCubic>* DebugT(const SkTSect<SkDCubic>* sect, double t) { |
- return sect->debugT(t); |
-} |
- |
-const SkTSpan<SkDQuad>* DebugT(const SkTSect<SkDQuad>* sect, double t) { |
- return sect->debugT(t); |
-} |
- |
-const SkTSpan<SkDCubic>* DebugSpan(const SkTSpan<SkDCubic>* span, int id) { |
- return span->debugSpan(id); |
-} |
- |
-const SkTSpan<SkDQuad>* DebugSpan(const SkTSpan<SkDQuad>* span, int id) { |
- return span->debugSpan(id); |
-} |
- |
-const SkTSpan<SkDCubic>* DebugT(const SkTSpan<SkDCubic>* span, double t) { |
- return span->debugT(t); |
-} |
- |
-const SkTSpan<SkDQuad>* DebugT(const SkTSpan<SkDQuad>* span, double t) { |
- return span->debugT(t); |
-} |
- |
-void Dump(const SkTSect<SkDCubic>* sect) { |
- sect->dump(); |
-} |
- |
-void Dump(const SkTSect<SkDQuad>* sect) { |
- sect->dump(); |
-} |
- |
-void Dump(const SkTSpan<SkDCubic>* span) { |
- span->dump(); |
-} |
- |
-void Dump(const SkTSpan<SkDQuad>* span) { |
- span->dump(); |
-} |
- |
-void DumpBoth(SkTSect<SkDCubic>* sect1, SkTSect<SkDCubic>* sect2) { |
- sect1->dumpBoth(sect2); |
-} |
- |
-void DumpBoth(SkTSect<SkDQuad>* sect1, SkTSect<SkDQuad>* sect2) { |
- sect1->dumpBoth(sect2); |
-} |
- |
-void DumpCoin(SkTSect<SkDCubic>* sect1) { |
- sect1->dumpCoin(); |
-} |
- |
-void DumpCoin(SkTSect<SkDQuad>* sect1) { |
- sect1->dumpCoin(); |
-} |
- |
-void DumpCoinCurves(SkTSect<SkDCubic>* sect1) { |
- sect1->dumpCoinCurves(); |
-} |
- |
-void DumpCoinCurves(SkTSect<SkDQuad>* sect1) { |
- sect1->dumpCoinCurves(); |
-} |
- |
-void DumpCurves(const SkTSect<SkDQuad>* sect) { |
- sect->dumpCurves(); |
-} |
- |
-void DumpCurves(const SkTSect<SkDCubic>* sect) { |
- sect->dumpCurves(); |
-} |
- |
-static void dumpTestCase(const SkDQuad& quad1, const SkDQuad& quad2, int testNo) { |
- SkDebugf("\n<div id=\"quad%d\">\n", testNo); |
- quad1.dumpInner(); |
- SkDebugf("}}, "); |
- quad2.dump(); |
- SkDebugf("</div>\n\n"); |
-} |
- |
-static void dumpTestTrailer() { |
- SkDebugf("</div>\n\n<script type=\"text/javascript\">\n\n"); |
- SkDebugf(" var testDivs = [\n"); |
-} |
- |
-static void dumpTestList(int testNo, double min) { |
- SkDebugf(" quad%d,", testNo); |
- if (min > 0) { |
- SkDebugf(" // %1.9g", min); |
- } |
- SkDebugf("\n"); |
-} |
- |
-void DumpQ(const SkDQuad& quad1, const SkDQuad& quad2, int testNo) { |
- SkDebugf("\n"); |
- dumpTestCase(quad1, quad2, testNo); |
- dumpTestTrailer(); |
- dumpTestList(testNo, 0); |
- SkDebugf("\n"); |
-} |
- |
-void DumpT(const SkDQuad& quad, double t) { |
- SkDLine line = {{quad.ptAtT(t), quad[0]}}; |
- line.dump(); |
-} |
- |
-const SkOpAngle* SkOpAngle::debugAngle(int id) const { |
- return this->segment()->debugAngle(id); |
-} |
- |
-SkOpContour* SkOpAngle::debugContour(int id) { |
- return this->segment()->debugContour(id); |
-} |
- |
-const SkOpPtT* SkOpAngle::debugPtT(int id) const { |
- return this->segment()->debugPtT(id); |
-} |
- |
-const SkOpSegment* SkOpAngle::debugSegment(int id) const { |
- return this->segment()->debugSegment(id); |
-} |
- |
-const SkOpSpanBase* SkOpAngle::debugSpan(int id) const { |
- return this->segment()->debugSpan(id); |
-} |
- |
void SkOpAngle::dump() const { |
dumpOne(true); |
SkDebugf("\n"); |
@@ -579,39 +175,44 @@ |
void SkOpAngle::dumpOne(bool functionHeader) const { |
// fSegment->debugValidate(); |
- const SkOpSegment* segment = this->segment(); |
- const SkOpSpan& mSpan = *fStart->starter(fEnd); |
+ const SkOpSpan& mSpan = fSegment->span(SkMin32(fStart, fEnd)); |
if (functionHeader) { |
SkDebugf("%s ", __FUNCTION__); |
} |
- SkDebugf("[%d", segment->debugID()); |
+ SkDebugf("[%d", fSegment->debugID()); |
SkDebugf("/%d", debugID()); |
SkDebugf("] next="); |
if (fNext) { |
- SkDebugf("%d", fNext->fStart->segment()->debugID()); |
+ SkDebugf("%d", fNext->fSegment->debugID()); |
SkDebugf("/%d", fNext->debugID()); |
} else { |
SkDebugf("?"); |
} |
SkDebugf(" sect=%d/%d ", fSectorStart, fSectorEnd); |
- SkDebugf(" s=%1.9g [%d] e=%1.9g [%d]", fStart->t(), fStart->debugID(), |
- fEnd->t(), fEnd->debugID()); |
- SkDebugf(" sgn=%d windVal=%d", this->sign(), mSpan.windValue()); |
+ SkDebugf(" s=%1.9g [%d] e=%1.9g [%d]", fSegment->span(fStart).fT, fStart, |
+ fSegment->span(fEnd).fT, fEnd); |
+ SkDebugf(" sgn=%d windVal=%d", sign(), mSpan.fWindValue); |
SkDebugf(" windSum="); |
- SkPathOpsDebug::WindingPrintf(mSpan.windSum()); |
- if (mSpan.oppValue() != 0 || mSpan.oppSum() != SK_MinS32) { |
- SkDebugf(" oppVal=%d", mSpan.oppValue()); |
+ SkPathOpsDebug::WindingPrintf(mSpan.fWindSum); |
+ if (mSpan.fOppValue != 0 || mSpan.fOppSum != SK_MinS32) { |
+ SkDebugf(" oppVal=%d", mSpan.fOppValue); |
SkDebugf(" oppSum="); |
- SkPathOpsDebug::WindingPrintf(mSpan.oppSum()); |
- } |
- if (mSpan.done()) { |
+ SkPathOpsDebug::WindingPrintf(mSpan.fOppSum); |
+ } |
+ if (mSpan.fDone) { |
SkDebugf(" done"); |
} |
if (unorderable()) { |
SkDebugf(" unorderable"); |
} |
- if (segment->operand()) { |
+ if (small()) { |
+ SkDebugf(" small"); |
+ } |
+ if (mSpan.fTiny) { |
+ SkDebugf(" tiny"); |
+ } |
+ if (fSegment->operand()) { |
SkDebugf(" operand"); |
} |
if (fStop) { |
@@ -626,7 +227,7 @@ |
do { |
SkDebugf("%s", indent); |
next->dumpOne(false); |
- if (segment == next->fStart->segment()) { |
+ if (segment == next->fSegment) { |
if (this == fNext) { |
SkDebugf(" << from"); |
} |
@@ -636,15 +237,6 @@ |
} |
SkDebugf("\n"); |
indent = " "; |
- next = next->fNext; |
- } while (next && next != first); |
-} |
- |
-void SkOpAngle::dumpCurves() const { |
- const SkOpAngle* first = this; |
- const SkOpAngle* next = this; |
- do { |
- next->fCurvePart.dumpID(next->segment()->debugID()); |
next = next->fNext; |
} while (next && next != first); |
} |
@@ -659,250 +251,248 @@ |
} while (next && next != first); |
} |
-void SkOpAngle::dumpTest() const { |
+void SkOpAngle::dumpPartials() const { |
const SkOpAngle* first = this; |
const SkOpAngle* next = this; |
do { |
- SkDebugf("{ "); |
- SkOpSegment* segment = next->segment(); |
- segment->dumpPts(); |
- SkDebugf(", %d, %1.9g, %1.9g, {} },\n", SkPathOpsVerbToPoints(segment->verb()) + 1, |
- next->start()->t(), next->end()->t()); |
+ next->fCurvePart.dumpNumber(); |
next = next->fNext; |
} while (next && next != first); |
} |
-bool SkOpPtT::debugMatchID(int id) const { |
- int limit = this->debugLoopLimit(false); |
- int loop = 0; |
- const SkOpPtT* ptT = this; |
+void SkOpAngleSet::dump() const { |
+ // FIXME: unimplemented |
+/* This requires access to the internal SkChunkAlloc data |
+ Defer implementing this until it is needed for debugging |
+*/ |
+ SkASSERT(0); |
+} |
+ |
+void SkOpContour::dump() const { |
+ int segmentCount = fSegments.count(); |
+ SkDebugf("((SkOpContour*) 0x%p) [%d]\n", this, debugID()); |
+ for (int test = 0; test < segmentCount; ++test) { |
+ SkDebugf(" [%d] ((SkOpSegment*) 0x%p) [%d]\n", test, &fSegments[test], |
+ fSegments[test].debugID()); |
+ } |
+} |
+ |
+void SkOpContour::dumpAngles() const { |
+ int segmentCount = fSegments.count(); |
+ SkDebugf("((SkOpContour*) 0x%p) [%d]\n", this, debugID()); |
+ for (int test = 0; test < segmentCount; ++test) { |
+ SkDebugf(" [%d] ", test); |
+ fSegments[test].dumpAngles(); |
+ } |
+} |
+ |
+void SkOpContour::dumpCoincidence(const SkCoincidence& coin) const { |
+ int thisIndex = coin.fSegments[0]; |
+ const SkOpSegment& s1 = fSegments[thisIndex]; |
+ int otherIndex = coin.fSegments[1]; |
+ const SkOpSegment& s2 = coin.fOther->fSegments[otherIndex]; |
+ SkDebugf("((SkOpSegment*) 0x%p) [%d] ((SkOpSegment*) 0x%p) [%d]\n", &s1, s1.debugID(), |
+ &s2, s2.debugID()); |
+ for (int index = 0; index < 2; ++index) { |
+ SkDebugf(" {%1.9gf, %1.9gf}", coin.fPts[0][index].fX, coin.fPts[0][index].fY); |
+ if (coin.fNearly[index]) { |
+ SkDebugf(" {%1.9gf, %1.9gf}", coin.fPts[1][index].fX, coin.fPts[1][index].fY); |
+ } |
+ SkDebugf(" seg1t=%1.9g seg2t=%1.9g\n", coin.fTs[0][index], coin.fTs[1][index]); |
+ } |
+} |
+ |
+void SkOpContour::dumpCoincidences() const { |
+ int count = fCoincidences.count(); |
+ if (count > 0) { |
+ SkDebugf("fCoincidences count=%d\n", count); |
+ for (int test = 0; test < count; ++test) { |
+ dumpCoincidence(fCoincidences[test]); |
+ } |
+ } |
+ count = fPartialCoincidences.count(); |
+ if (count == 0) { |
+ return; |
+ } |
+ SkDebugf("fPartialCoincidences count=%d\n", count); |
+ for (int test = 0; test < count; ++test) { |
+ dumpCoincidence(fPartialCoincidences[test]); |
+ } |
+} |
+ |
+void SkOpContour::dumpPt(int index) const { |
+ int segmentCount = fSegments.count(); |
+ for (int test = 0; test < segmentCount; ++test) { |
+ const SkOpSegment& segment = fSegments[test]; |
+ if (segment.debugID() == index) { |
+ fSegments[test].dumpPts(); |
+ } |
+ } |
+} |
+ |
+void SkOpContour::dumpPts() const { |
+ int segmentCount = fSegments.count(); |
+ SkDebugf("((SkOpContour*) 0x%p) [%d]\n", this, debugID()); |
+ for (int test = 0; test < segmentCount; ++test) { |
+ SkDebugf(" [%d] ", test); |
+ fSegments[test].dumpPts(); |
+ } |
+} |
+ |
+void SkOpContour::dumpSpan(int index) const { |
+ int segmentCount = fSegments.count(); |
+ for (int test = 0; test < segmentCount; ++test) { |
+ const SkOpSegment& segment = fSegments[test]; |
+ if (segment.debugID() == index) { |
+ fSegments[test].dumpSpans(); |
+ } |
+ } |
+} |
+ |
+void SkOpContour::dumpSpans() const { |
+ int segmentCount = fSegments.count(); |
+ SkDebugf("((SkOpContour*) 0x%p) [%d]\n", this, debugID()); |
+ for (int test = 0; test < segmentCount; ++test) { |
+ SkDebugf(" [%d] ", test); |
+ fSegments[test].dumpSpans(); |
+ } |
+} |
+ |
+void SkDCubic::dump() const { |
+ SkDebugf("{{"); |
+ int index = 0; |
do { |
- if (ptT->debugID() == id) { |
- return true; |
- } |
- } while ((!limit || ++loop <= limit) && (ptT = ptT->next()) && ptT != this); |
- return false; |
-} |
- |
-const SkOpAngle* SkOpPtT::debugAngle(int id) const { |
- return this->span()->debugAngle(id); |
-} |
- |
-SkOpContour* SkOpPtT::debugContour(int id) { |
- return this->span()->debugContour(id); |
-} |
- |
-const SkOpPtT* SkOpPtT::debugPtT(int id) const { |
- return this->span()->debugPtT(id); |
-} |
- |
-const SkOpSegment* SkOpPtT::debugSegment(int id) const { |
- return this->span()->debugSegment(id); |
-} |
- |
-const SkOpSpanBase* SkOpPtT::debugSpan(int id) const { |
- return this->span()->debugSpan(id); |
-} |
- |
-void SkOpPtT::dump() const { |
- SkDebugf("seg=%d span=%d ptT=%d", |
- this->segment()->debugID(), this->span()->debugID(), this->debugID()); |
- this->dumpBase(); |
- SkDebugf("\n"); |
-} |
- |
-void SkOpPtT::dumpAll() const { |
- contour()->indentDump(); |
- const SkOpPtT* next = this; |
- int limit = debugLoopLimit(true); |
- int loop = 0; |
+ fPts[index].dump(); |
+ SkDebugf(", "); |
+ } while (++index < 3); |
+ fPts[index].dump(); |
+ SkDebugf("}}\n"); |
+} |
+ |
+void SkDCubic::dumpNumber() const { |
+ SkDebugf("{{"); |
+ int index = 0; |
+ bool dumpedOne = false; |
do { |
- SkDebugf("%.*s", contour()->debugIndent(), " "); |
- SkDebugf("seg=%d span=%d ptT=%d", |
- next->segment()->debugID(), next->span()->debugID(), next->debugID()); |
- next->dumpBase(); |
- SkDebugf("\n"); |
- if (limit && ++loop >= limit) { |
- SkDebugf("*** abort loop ***\n"); |
- break; |
- } |
- } while ((next = next->fNext) && next != this); |
- contour()->outdentDump(); |
-} |
- |
-void SkOpPtT::dumpBase() const { |
- SkDebugf(" t=%1.9g pt=(%1.9g,%1.9g)%s%s", this->fT, this->fPt.fX, this->fPt.fY, |
- this->fDuplicatePt ? " dup" : "", this->fDeleted ? " deleted" : ""); |
-} |
- |
-const SkOpAngle* SkOpSpanBase::debugAngle(int id) const { |
- return this->segment()->debugAngle(id); |
-} |
- |
-SkOpContour* SkOpSpanBase::debugContour(int id) { |
- return this->segment()->debugContour(id); |
-} |
- |
-const SkOpPtT* SkOpSpanBase::debugPtT(int id) const { |
- return this->segment()->debugPtT(id); |
-} |
- |
-const SkOpSegment* SkOpSpanBase::debugSegment(int id) const { |
- return this->segment()->debugSegment(id); |
-} |
- |
-const SkOpSpanBase* SkOpSpanBase::debugSpan(int id) const { |
- return this->segment()->debugSpan(id); |
-} |
- |
-void SkOpSpanBase::dump() const { |
- this->dumpAll(); |
- SkDebugf("\n"); |
-} |
- |
-void SkOpSpanBase::dumpAll() const { |
- SkDebugf("%.*s", contour()->debugIndent(), " "); |
- SkDebugf("seg=%d span=%d", this->segment()->debugID(), this->debugID()); |
- this->dumpBase(); |
- SkDebugf("\n"); |
- this->fPtT.dumpAll(); |
-} |
- |
-void SkOpSpanBase::dumpBase() const { |
- if (this->fAligned) { |
- SkDebugf(" aligned"); |
- } |
- if (this->fChased) { |
- SkDebugf(" chased"); |
- } |
- if (!this->final()) { |
- this->upCast()->dumpSpan(); |
- } |
- const SkOpSpanBase* coin = this->coinEnd(); |
- if (this != coin) { |
- SkDebugf(" coinEnd seg/span=%d/%d", coin->segment()->debugID(), coin->debugID()); |
- } else if (this->final() || !this->upCast()->isCoincident()) { |
- const SkOpPtT* oPt = this->ptT()->next(); |
- SkDebugf(" seg/span=%d/%d", oPt->segment()->debugID(), oPt->span()->debugID()); |
- } |
-} |
- |
-void SkOpSpanBase::dumpCoin() const { |
- const SkOpSpan* span = this->upCastable(); |
- if (!span) { |
+ if (!(fPts[index].fX == fPts[index].fX && fPts[index].fY == fPts[index].fY)) { |
+ continue; |
+ } |
+ if (dumpedOne) { |
+ SkDebugf(", "); |
+ } |
+ fPts[index].dump(); |
+ dumpedOne = true; |
+ } while (++index < 3); |
+ if (fPts[index].fX == fPts[index].fX && fPts[index].fY == fPts[index].fY) { |
+ if (dumpedOne) { |
+ SkDebugf(", "); |
+ } |
+ fPts[index].dump(); |
+ } |
+ SkDebugf("}}\n"); |
+} |
+ |
+void SkDLine::dump() const { |
+ SkDebugf("{{"); |
+ fPts[0].dump(); |
+ SkDebugf(", "); |
+ fPts[1].dump(); |
+ SkDebugf("}}\n"); |
+} |
+ |
+void SkDPoint::dump() const { |
+ SkDebugf("{"); |
+ DebugDumpDouble(fX); |
+ SkDebugf(", "); |
+ DebugDumpDouble(fY); |
+ SkDebugf("}"); |
+} |
+ |
+void SkDPoint::Dump(const SkPoint& pt) { |
+ SkDebugf("{"); |
+ DebugDumpFloat(pt.fX); |
+ SkDebugf(", "); |
+ DebugDumpFloat(pt.fY); |
+ SkDebugf("}"); |
+} |
+ |
+void SkDPoint::DumpHex(const SkPoint& pt) { |
+ SkDebugf("{"); |
+ DebugDumpHexFloat(pt.fX); |
+ SkDebugf(", "); |
+ DebugDumpHexFloat(pt.fY); |
+ SkDebugf("}"); |
+} |
+ |
+void SkDQuad::dump() const { |
+ dumpComma(""); |
+} |
+ |
+void SkDQuad::dumpComma(const char* comma) const { |
+ SkDebugf("{{"); |
+ int index = 0; |
+ do { |
+ fPts[index].dump(); |
+ SkDebugf(", "); |
+ } while (++index < 2); |
+ fPts[index].dump(); |
+ SkDebugf("}}%s\n", comma ? comma : ""); |
+} |
+ |
+void SkIntersectionHelper::dump() const { |
+ SkDPoint::Dump(pts()[0]); |
+ SkDPoint::Dump(pts()[1]); |
+ if (verb() >= SkPath::kQuad_Verb) { |
+ SkDPoint::Dump(pts()[2]); |
+ } |
+ if (verb() >= SkPath::kCubic_Verb) { |
+ SkDPoint::Dump(pts()[3]); |
+ } |
+} |
+ |
+const SkTDArray<SkOpSpan>& SkOpSegment::debugSpans() const { |
+ return fTs; |
+} |
+ |
+void SkOpSegment::dumpAngles() const { |
+ SkDebugf("((SkOpSegment*) 0x%p) [%d]\n", this, debugID()); |
+ const SkOpAngle* fromAngle = NULL; |
+ const SkOpAngle* toAngle = NULL; |
+ for (int index = 0; index < count(); ++index) { |
+ const SkOpAngle* fAngle = fTs[index].fFromAngle; |
+ const SkOpAngle* tAngle = fTs[index].fToAngle; |
+ if (fromAngle == fAngle && toAngle == tAngle) { |
+ continue; |
+ } |
+ if (fAngle) { |
+ SkDebugf(" [%d] from=%d ", index, fAngle->debugID()); |
+ fAngle->dumpTo(this, tAngle); |
+ } |
+ if (tAngle) { |
+ SkDebugf(" [%d] to=%d ", index, tAngle->debugID()); |
+ tAngle->dumpTo(this, fAngle); |
+ } |
+ fromAngle = fAngle; |
+ toAngle = tAngle; |
+ } |
+} |
+ |
+void SkOpSegment::dumpContour(int firstID, int lastID) const { |
+ if (debugID() < 0) { |
return; |
} |
- if (!span->isCoincident()) { |
- return; |
- } |
- span->dumpCoin(); |
-} |
- |
-void SkOpSpan::dumpCoin() const { |
- const SkOpSpan* coincident = fCoincident; |
- bool ok = debugCoinLoopCheck(); |
- this->dump(); |
- int loop = 0; |
- do { |
- coincident->dump(); |
- if (!ok && ++loop > 10) { |
- SkDebugf("*** abort loop ***\n"); |
- break; |
- } |
- } while ((coincident = coincident->fCoincident) != this); |
-} |
- |
-bool SkOpSpan::dumpSpan() const { |
- SkOpSpan* coin = fCoincident; |
- if (this != coin) { |
- SkDebugf(" coinStart seg/span=%d/%d", coin->segment()->debugID(), coin->debugID()); |
- } |
- SkDebugf(" windVal=%d", this->windValue()); |
- SkDebugf(" windSum="); |
- SkPathOpsDebug::WindingPrintf(this->windSum()); |
- if (this->oppValue() != 0 || this->oppSum() != SK_MinS32) { |
- SkDebugf(" oppVal=%d", this->oppValue()); |
- SkDebugf(" oppSum="); |
- SkPathOpsDebug::WindingPrintf(this->oppSum()); |
- } |
- if (this->done()) { |
- SkDebugf(" done"); |
- } |
- return this != coin; |
-} |
- |
-const SkOpAngle* SkOpSegment::debugAngle(int id) const { |
- return this->contour()->debugAngle(id); |
-} |
- |
-SkOpContour* SkOpSegment::debugContour(int id) { |
- return this->contour()->debugContour(id); |
-} |
- |
-const SkOpPtT* SkOpSegment::debugPtT(int id) const { |
- return this->contour()->debugPtT(id); |
-} |
- |
-const SkOpSegment* SkOpSegment::debugSegment(int id) const { |
- return this->contour()->debugSegment(id); |
-} |
- |
-const SkOpSpanBase* SkOpSegment::debugSpan(int id) const { |
- return this->contour()->debugSpan(id); |
-} |
- |
-void SkOpSegment::dump() const { |
- SkDebugf("%.*s", contour()->debugIndent(), " "); |
- this->dumpPts(); |
- const SkOpSpanBase* span = &fHead; |
- contour()->indentDump(); |
- do { |
- SkDebugf("%.*s span=%d ", contour()->debugIndent(), " ", span->debugID()); |
- span->ptT()->dumpBase(); |
- span->dumpBase(); |
- SkDebugf("\n"); |
- } while (!span->final() && (span = span->upCast()->next())); |
- contour()->outdentDump(); |
-} |
- |
-void SkOpSegment::dumpAll() const { |
- SkDebugf("%.*s", contour()->debugIndent(), " "); |
- this->dumpPts(); |
- const SkOpSpanBase* span = &fHead; |
- contour()->indentDump(); |
- do { |
- span->dumpAll(); |
- } while (!span->final() && (span = span->upCast()->next())); |
- contour()->outdentDump(); |
-} |
- |
-void SkOpSegment::dumpAngles() const { |
- SkDebugf("seg=%d\n", debugID()); |
- const SkOpSpanBase* span = &fHead; |
- do { |
- const SkOpAngle* fAngle = span->fromAngle(); |
- const SkOpAngle* tAngle = span->final() ? NULL : span->upCast()->toAngle(); |
- if (fAngle) { |
- SkDebugf(" span=%d from=%d ", span->debugID(), fAngle->debugID()); |
- fAngle->dumpTo(this, tAngle); |
- } |
- if (tAngle) { |
- SkDebugf(" span=%d to=%d ", span->debugID(), tAngle->debugID()); |
- tAngle->dumpTo(this, fAngle); |
- } |
- } while (!span->final() && (span = span->upCast()->next())); |
-} |
- |
-void SkOpSegment::dumpCoin() const { |
- const SkOpSpan* span = &fHead; |
- do { |
- span->dumpCoin(); |
- } while ((span = span->next()->upCastable())); |
+ const SkOpSegment* test = this - (debugID() - 1); |
+ test += (firstID - 1); |
+ const SkOpSegment* last = test + (lastID - firstID); |
+ while (test <= last) { |
+ test->dumpSpans(); |
+ ++test; |
+ } |
} |
void SkOpSegment::dumpPts() const { |
int last = SkPathOpsVerbToPoints(fVerb); |
- SkDebugf("seg=%d {{", this->debugID()); |
+ SkDebugf("((SkOpSegment*) 0x%p) [%d] {{", this, debugID()); |
int index = 0; |
do { |
SkDPoint::Dump(fPts[index]); |
@@ -912,288 +502,396 @@ |
SkDebugf("}}\n"); |
} |
-void SkCoincidentSpans::dump() const { |
- SkDebugf("- seg=%d span=%d ptT=%d ", fCoinPtTStart->segment()->debugID(), |
- fCoinPtTStart->span()->debugID(), fCoinPtTStart->debugID()); |
- fCoinPtTStart->dumpBase(); |
- SkDebugf(" span=%d ptT=%d ", fCoinPtTEnd->span()->debugID(), fCoinPtTEnd->debugID()); |
- fCoinPtTEnd->dumpBase(); |
- if (fCoinPtTStart->segment()->operand()) { |
- SkDebugf(" operand"); |
- } |
- if (fCoinPtTStart->segment()->isXor()) { |
- SkDebugf(" xor"); |
+void SkOpSegment::dumpHexPts() const { |
+ int last = SkPathOpsVerbToPoints(fVerb); |
+ SkDebugf("((SkOpSegment*) 0x%p) [%d] {{", this, debugID()); |
+ int index = 0; |
+ do { |
+ SkDPoint::DumpHex(fPts[index]); |
+ SkDebugf(", "); |
+ } while (++index < last); |
+ SkDPoint::DumpHex(fPts[index]); |
+ SkDebugf("}}\n"); |
+} |
+ |
+void SkOpSegment::dumpDPts() const { |
+ int count = SkPathOpsVerbToPoints(fVerb); |
+ SkDebugf("((SkOpSegment*) 0x%p) [%d] {{", this, debugID()); |
+ int index = 0; |
+ do { |
+ SkDPoint dPt = {fPts[index].fX, fPts[index].fY}; |
+ dPt.dump(); |
+ if (index != count) { |
+ SkDebugf(", "); |
+ } |
+ } while (++index <= count); |
+ SkDebugf("}}\n"); |
+} |
+ |
+void SkOpSegment::dumpSpans() const { |
+ int count = this->count(); |
+ SkDebugf("((SkOpSegment*) 0x%p) [%d]\n", this, debugID()); |
+ for (int index = 0; index < count; ++index) { |
+ const SkOpSpan& span = this->span(index); |
+ SkDebugf(" [%d] ", index); |
+ span.dumpOne(); |
+ } |
+} |
+ |
+void SkPathOpsDebug::DumpCoincidence(const SkTArray<SkOpContour, true>& contours) { |
+ int count = contours.count(); |
+ for (int index = 0; index < count; ++index) { |
+ contours[index].dumpCoincidences(); |
+ } |
+} |
+ |
+void SkPathOpsDebug::DumpCoincidence(const SkTArray<SkOpContour* , true>& contours) { |
+ int count = contours.count(); |
+ for (int index = 0; index < count; ++index) { |
+ contours[index]->dumpCoincidences(); |
+ } |
+} |
+ |
+void SkPathOpsDebug::DumpContours(const SkTArray<SkOpContour, true>& contours) { |
+ int count = contours.count(); |
+ for (int index = 0; index < count; ++index) { |
+ contours[index].dump(); |
+ } |
+} |
+ |
+void SkPathOpsDebug::DumpContours(const SkTArray<SkOpContour* , true>& contours) { |
+ int count = contours.count(); |
+ for (int index = 0; index < count; ++index) { |
+ contours[index]->dump(); |
+ } |
+} |
+ |
+void SkPathOpsDebug::DumpContourAngles(const SkTArray<SkOpContour, true>& contours) { |
+ int count = contours.count(); |
+ for (int index = 0; index < count; ++index) { |
+ contours[index].dumpAngles(); |
+ } |
+} |
+ |
+void SkPathOpsDebug::DumpContourAngles(const SkTArray<SkOpContour* , true>& contours) { |
+ int count = contours.count(); |
+ for (int index = 0; index < count; ++index) { |
+ contours[index]->dumpAngles(); |
+ } |
+} |
+ |
+void SkPathOpsDebug::DumpContourPts(const SkTArray<SkOpContour, true>& contours) { |
+ int count = contours.count(); |
+ for (int index = 0; index < count; ++index) { |
+ contours[index].dumpPts(); |
+ } |
+} |
+ |
+void SkPathOpsDebug::DumpContourPts(const SkTArray<SkOpContour* , true>& contours) { |
+ int count = contours.count(); |
+ for (int index = 0; index < count; ++index) { |
+ contours[index]->dumpPts(); |
+ } |
+} |
+ |
+void SkPathOpsDebug::DumpContourPt(const SkTArray<SkOpContour, true>& contours, int segmentID) { |
+ int count = contours.count(); |
+ for (int index = 0; index < count; ++index) { |
+ contours[index].dumpPt(segmentID); |
+ } |
+} |
+ |
+void SkPathOpsDebug::DumpContourPt(const SkTArray<SkOpContour* , true>& contours, int segmentID) { |
+ int count = contours.count(); |
+ for (int index = 0; index < count; ++index) { |
+ contours[index]->dumpPt(segmentID); |
+ } |
+} |
+ |
+void SkPathOpsDebug::DumpContourSpans(const SkTArray<SkOpContour, true>& contours) { |
+ int count = contours.count(); |
+ for (int index = 0; index < count; ++index) { |
+ contours[index].dumpSpans(); |
+ } |
+} |
+ |
+void SkPathOpsDebug::DumpContourSpans(const SkTArray<SkOpContour* , true>& contours) { |
+ int count = contours.count(); |
+ for (int index = 0; index < count; ++index) { |
+ contours[index]->dumpSpans(); |
+ } |
+} |
+ |
+void SkPathOpsDebug::DumpContourSpan(const SkTArray<SkOpContour, true>& contours, int segmentID) { |
+ int count = contours.count(); |
+ for (int index = 0; index < count; ++index) { |
+ contours[index].dumpSpan(segmentID); |
+ } |
+} |
+ |
+void SkPathOpsDebug::DumpContourSpan(const SkTArray<SkOpContour* , true>& contours, int segmentID) { |
+ int count = contours.count(); |
+ for (int index = 0; index < count; ++index) { |
+ contours[index]->dumpSpan(segmentID); |
+ } |
+} |
+ |
+void SkPathOpsDebug::DumpSpans(const SkTDArray<SkOpSpan *>& spans) { |
+ int count = spans.count(); |
+ for (int index = 0; index < count; ++index) { |
+ const SkOpSpan* span = spans[index]; |
+ const SkOpSpan& oSpan = span->fOther->span(span->fOtherIndex); |
+ const SkOpSegment* segment = oSpan.fOther; |
+ SkDebugf("((SkOpSegment*) 0x%p) [%d] ", segment, segment->debugID()); |
+ SkDebugf("spanIndex:%d ", oSpan.fOtherIndex); |
+ span->dumpOne(); |
+ } |
+} |
+ |
+// this does not require that other T index is initialized or correct |
+const SkOpSegment* SkOpSpan::debugToSegment(ptrdiff_t* spanIndex) const { |
+ if (!fOther) { |
+ return NULL; |
+ } |
+ int oppCount = fOther->count(); |
+ for (int index = 0; index < oppCount; ++index) { |
+ const SkOpSpan& otherSpan = fOther->span(index); |
+ double otherTestT = otherSpan.fT; |
+ if (otherTestT < fOtherT) { |
+ continue; |
+ } |
+ SkASSERT(otherTestT == fOtherT); |
+ const SkOpSegment* candidate = otherSpan.fOther; |
+ const SkOpSpan* first = candidate->debugSpans().begin(); |
+ const SkOpSpan* last = candidate->debugSpans().end() - 1; |
+ if (first <= this && this <= last) { |
+ if (spanIndex) { |
+ *spanIndex = this - first; |
+ } |
+ return candidate; |
+ } |
+ } |
+ SkASSERT(0); |
+ return NULL; |
+} |
+ |
+void SkOpSpan::dumpOne() const { |
+ SkDebugf("t="); |
+ DebugDumpDouble(fT); |
+ SkDebugf(" pt="); |
+ SkDPoint::Dump(fPt); |
+ if (fOther) { |
+ SkDebugf(" other.fID=%d", fOther->debugID()); |
+ SkDebugf(" [%d] otherT=", fOtherIndex); |
+ DebugDumpDouble(fOtherT); |
+ } else { |
+ SkDebugf(" other.fID=? [?] otherT=?"); |
+ } |
+ if (fWindSum != SK_MinS32) { |
+ SkDebugf(" windSum=%d", fWindSum); |
+ } |
+ if (fOppSum != SK_MinS32 && (SkPathOpsDebug::ValidWind(fOppSum) || fOppValue != 0)) { |
+ SkDebugf(" oppSum=%d", fOppSum); |
+ } |
+ SkDebugf(" windValue=%d", fWindValue); |
+ if (SkPathOpsDebug::ValidWind(fOppSum) || fOppValue != 0) { |
+ SkDebugf(" oppValue=%d", fOppValue); |
+ } |
+ if (fFromAngle && fFromAngle->debugID()) { |
+ SkDebugf(" from=%d", fFromAngle->debugID()); |
+ } |
+ if (fToAngle && fToAngle->debugID()) { |
+ SkDebugf(" to=%d", fToAngle->debugID()); |
+ } |
+ if (fChased) { |
+ SkDebugf(" chased"); |
+ } |
+ if (fCoincident) { |
+ SkDebugf(" coincident"); |
+ } |
+ if (fDone) { |
+ SkDebugf(" done"); |
+ } |
+ if (fLoop) { |
+ SkDebugf(" loop"); |
+ } |
+ if (fMultiple) { |
+ SkDebugf(" multiple"); |
+ } |
+ if (fNear) { |
+ SkDebugf(" near"); |
+ } |
+ if (fSmall) { |
+ SkDebugf(" small"); |
+ } |
+ if (fTiny) { |
+ SkDebugf(" tiny"); |
} |
SkDebugf("\n"); |
- SkDebugf("+ seg=%d span=%d ptT=%d ", fOppPtTStart->segment()->debugID(), |
- fOppPtTStart->span()->debugID(), fOppPtTStart->debugID()); |
- fOppPtTStart->dumpBase(); |
- SkDebugf(" span=%d ptT=%d ", fOppPtTEnd->span()->debugID(), fOppPtTEnd->debugID()); |
- fOppPtTEnd->dumpBase(); |
- if (fOppPtTStart->segment()->operand()) { |
- SkDebugf(" operand"); |
- } |
- if (fOppPtTStart->segment()->isXor()) { |
- SkDebugf(" xor"); |
+} |
+ |
+void SkOpSpan::dump() const { |
+ ptrdiff_t spanIndex; |
+ const SkOpSegment* segment = debugToSegment(&spanIndex); |
+ if (segment) { |
+ SkDebugf("((SkOpSegment*) 0x%p) [%d]\n", segment, segment->debugID()); |
+ SkDebugf(" [%d] ", spanIndex); |
+ } else { |
+ SkDebugf("((SkOpSegment*) ?) [?]\n"); |
+ SkDebugf(" [?] "); |
+ } |
+ dumpOne(); |
+} |
+ |
+void Dump(const SkTArray<class SkOpContour, true>& contours) { |
+ SkPathOpsDebug::DumpContours(contours); |
+} |
+ |
+void Dump(const SkTArray<class SkOpContour* , true>& contours) { |
+ SkPathOpsDebug::DumpContours(contours); |
+} |
+ |
+void Dump(const SkTArray<class SkOpContour, true>* contours) { |
+ SkPathOpsDebug::DumpContours(*contours); |
+} |
+ |
+void Dump(const SkTArray<class SkOpContour* , true>* contours) { |
+ SkPathOpsDebug::DumpContours(*contours); |
+} |
+ |
+void Dump(const SkTDArray<SkOpSpan *>& chase) { |
+ SkPathOpsDebug::DumpSpans(chase); |
+} |
+ |
+void Dump(const SkTDArray<SkOpSpan *>* chase) { |
+ SkPathOpsDebug::DumpSpans(*chase); |
+} |
+ |
+void DumpAngles(const SkTArray<class SkOpContour, true>& contours) { |
+ SkPathOpsDebug::DumpContourAngles(contours); |
+} |
+ |
+void DumpAngles(const SkTArray<class SkOpContour* , true>& contours) { |
+ SkPathOpsDebug::DumpContourAngles(contours); |
+} |
+ |
+void DumpAngles(const SkTArray<class SkOpContour, true>* contours) { |
+ SkPathOpsDebug::DumpContourAngles(*contours); |
+} |
+ |
+void DumpAngles(const SkTArray<class SkOpContour* , true>* contours) { |
+ SkPathOpsDebug::DumpContourAngles(*contours); |
+} |
+ |
+void DumpCoin(const SkTArray<class SkOpContour, true>& contours) { |
+ SkPathOpsDebug::DumpCoincidence(contours); |
+} |
+ |
+void DumpCoin(const SkTArray<class SkOpContour* , true>& contours) { |
+ SkPathOpsDebug::DumpCoincidence(contours); |
+} |
+ |
+void DumpCoin(const SkTArray<class SkOpContour, true>* contours) { |
+ SkPathOpsDebug::DumpCoincidence(*contours); |
+} |
+ |
+void DumpCoin(const SkTArray<class SkOpContour* , true>* contours) { |
+ SkPathOpsDebug::DumpCoincidence(*contours); |
+} |
+ |
+void DumpSpans(const SkTArray<class SkOpContour, true>& contours) { |
+ SkPathOpsDebug::DumpContourSpans(contours); |
+} |
+ |
+void DumpSpans(const SkTArray<class SkOpContour* , true>& contours) { |
+ SkPathOpsDebug::DumpContourSpans(contours); |
+} |
+ |
+void DumpSpans(const SkTArray<class SkOpContour, true>* contours) { |
+ SkPathOpsDebug::DumpContourSpans(*contours); |
+} |
+ |
+void DumpSpans(const SkTArray<class SkOpContour* , true>* contours) { |
+ SkPathOpsDebug::DumpContourSpans(*contours); |
+} |
+ |
+void DumpSpan(const SkTArray<class SkOpContour, true>& contours, int segmentID) { |
+ SkPathOpsDebug::DumpContourSpan(contours, segmentID); |
+} |
+ |
+void DumpSpan(const SkTArray<class SkOpContour* , true>& contours, int segmentID) { |
+ SkPathOpsDebug::DumpContourSpan(contours, segmentID); |
+} |
+ |
+void DumpSpan(const SkTArray<class SkOpContour, true>* contours, int segmentID) { |
+ SkPathOpsDebug::DumpContourSpan(*contours, segmentID); |
+} |
+ |
+void DumpSpan(const SkTArray<class SkOpContour* , true>* contours, int segmentID) { |
+ SkPathOpsDebug::DumpContourSpan(*contours, segmentID); |
+} |
+ |
+void DumpPts(const SkTArray<class SkOpContour, true>& contours) { |
+ SkPathOpsDebug::DumpContourPts(contours); |
+} |
+ |
+void DumpPts(const SkTArray<class SkOpContour* , true>& contours) { |
+ SkPathOpsDebug::DumpContourPts(contours); |
+} |
+ |
+void DumpPts(const SkTArray<class SkOpContour, true>* contours) { |
+ SkPathOpsDebug::DumpContourPts(*contours); |
+} |
+ |
+void DumpPts(const SkTArray<class SkOpContour* , true>* contours) { |
+ SkPathOpsDebug::DumpContourPts(*contours); |
+} |
+ |
+void DumpPt(const SkTArray<class SkOpContour, true>& contours, int segmentID) { |
+ SkPathOpsDebug::DumpContourPt(contours, segmentID); |
+} |
+ |
+void DumpPt(const SkTArray<class SkOpContour* , true>& contours, int segmentID) { |
+ SkPathOpsDebug::DumpContourPt(contours, segmentID); |
+} |
+ |
+void DumpPt(const SkTArray<class SkOpContour, true>* contours, int segmentID) { |
+ SkPathOpsDebug::DumpContourPt(*contours, segmentID); |
+} |
+ |
+void DumpPt(const SkTArray<class SkOpContour* , true>* contours, int segmentID) { |
+ SkPathOpsDebug::DumpContourPt(*contours, segmentID); |
+} |
+ |
+static void dumpTestCase(const SkDQuad& quad1, const SkDQuad& quad2, int testNo) { |
+ SkDebugf("<div id=\"quad%d\">\n", testNo); |
+ quad1.dumpComma(","); |
+ quad2.dump(); |
+ SkDebugf("</div>\n\n"); |
+} |
+ |
+static void dumpTestTrailer() { |
+ SkDebugf("</div>\n\n<script type=\"text/javascript\">\n\n"); |
+ SkDebugf(" var testDivs = [\n"); |
+} |
+ |
+static void dumpTestList(int testNo, double min) { |
+ SkDebugf(" quad%d,", testNo); |
+ if (min > 0) { |
+ SkDebugf(" // %1.9g", min); |
} |
SkDebugf("\n"); |
} |
-void SkOpCoincidence::dump() const { |
- SkCoincidentSpans* span = fHead; |
- while (span) { |
- span->dump(); |
- span = span->fNext; |
- } |
-} |
- |
-void SkOpContour::dump() { |
- SkDebugf("contour=%d count=%d\n", this->debugID(), fCount); |
- if (!fCount) { |
- return; |
- } |
- const SkOpSegment* segment = &fHead; |
- PATH_OPS_DEBUG_CODE(fIndent = 0); |
- indentDump(); |
- do { |
- segment->dump(); |
- } while ((segment = segment->next())); |
- outdentDump(); |
-} |
- |
-void SkOpContour::dumpAll() { |
- SkDebugf("contour=%d count=%d\n", this->debugID(), fCount); |
- if (!fCount) { |
- return; |
- } |
- const SkOpSegment* segment = &fHead; |
- PATH_OPS_DEBUG_CODE(fIndent = 0); |
- indentDump(); |
- do { |
- segment->dumpAll(); |
- } while ((segment = segment->next())); |
- outdentDump(); |
-} |
- |
- |
-void SkOpContour::dumpAngles() const { |
- SkDebugf("contour=%d\n", this->debugID()); |
- const SkOpSegment* segment = &fHead; |
- do { |
- SkDebugf(" seg=%d ", segment->debugID()); |
- segment->dumpAngles(); |
- } while ((segment = segment->next())); |
-} |
- |
-void SkOpContour::dumpPt(int index) const { |
- const SkOpSegment* segment = &fHead; |
- do { |
- if (segment->debugID() == index) { |
- segment->dumpPts(); |
- } |
- } while ((segment = segment->next())); |
-} |
- |
-void SkOpContour::dumpPts() const { |
- SkDebugf("contour=%d\n", this->debugID()); |
- const SkOpSegment* segment = &fHead; |
- do { |
- SkDebugf(" seg=%d ", segment->debugID()); |
- segment->dumpPts(); |
- } while ((segment = segment->next())); |
-} |
- |
-void SkOpContour::dumpPtsX() const { |
- if (!this->fCount) { |
- SkDebugf("<empty>\n"); |
- return; |
- } |
- const SkOpSegment* segment = &fHead; |
- do { |
- segment->dumpPts(); |
- } while ((segment = segment->next())); |
-} |
- |
-void SkOpContour::dumpSegment(int index) const { |
- debugSegment(index)->dump(); |
-} |
- |
-void SkOpContour::dumpSegments(SkPathOp op) const { |
- bool firstOp = false; |
- const SkOpContour* c = this; |
- do { |
- if (!firstOp && c->operand()) { |
-#if DEBUG_ACTIVE_OP |
- SkDebugf("op %s\n", SkPathOpsDebug::kPathOpStr[op]); |
-#endif |
- firstOp = true; |
- } |
- c->dumpPtsX(); |
- } while ((c = c->next())); |
-} |
- |
-void SkOpContour::dumpSpan(int index) const { |
- debugSpan(index)->dump(); |
-} |
- |
-void SkOpContour::dumpSpans() const { |
- SkDebugf("contour=%d\n", this->debugID()); |
- const SkOpSegment* segment = &fHead; |
- do { |
- SkDebugf(" seg=%d ", segment->debugID()); |
- segment->dump(); |
- } while ((segment = segment->next())); |
-} |
- |
-#ifdef SK_DEBUG |
-const SkOpAngle* SkOpGlobalState::debugAngle(int id) const { |
- const SkOpContour* contour = fHead; |
- do { |
- const SkOpSegment* segment = contour->first(); |
- while (segment) { |
- const SkOpSpan* span = segment->head(); |
- do { |
- SkOpAngle* angle = span->fromAngle(); |
- if (angle && angle->debugID() == id) { |
- return angle; |
- } |
- angle = span->toAngle(); |
- if (angle && angle->debugID() == id) { |
- return angle; |
- } |
- } while ((span = span->next()->upCastable())); |
- const SkOpSpanBase* tail = segment->tail(); |
- SkOpAngle* angle = tail->fromAngle(); |
- if (angle && angle->debugID() == id) { |
- return angle; |
- } |
- segment = segment->next(); |
- } |
- } while ((contour = contour->next())); |
- return NULL; |
-} |
- |
-SkOpContour* SkOpGlobalState::debugContour(int id) { |
- SkOpContour* contour = fHead; |
- do { |
- if (contour->debugID() == id) { |
- return contour; |
- } |
- } while ((contour = contour->next())); |
- return NULL; |
-} |
- |
-const SkOpPtT* SkOpGlobalState::debugPtT(int id) const { |
- const SkOpContour* contour = fHead; |
- do { |
- const SkOpSegment* segment = contour->first(); |
- while (segment) { |
- const SkOpSpan* span = segment->head(); |
- do { |
- const SkOpPtT* ptT = span->ptT(); |
- if (ptT->debugMatchID(id)) { |
- return ptT; |
- } |
- } while ((span = span->next()->upCastable())); |
- const SkOpSpanBase* tail = segment->tail(); |
- const SkOpPtT* ptT = tail->ptT(); |
- if (ptT->debugMatchID(id)) { |
- return ptT; |
- } |
- segment = segment->next(); |
- } |
- } while ((contour = contour->next())); |
- return NULL; |
-} |
- |
-const SkOpSegment* SkOpGlobalState::debugSegment(int id) const { |
- const SkOpContour* contour = fHead; |
- do { |
- const SkOpSegment* segment = contour->first(); |
- while (segment) { |
- if (segment->debugID() == id) { |
- return segment; |
- } |
- segment = segment->next(); |
- } |
- } while ((contour = contour->next())); |
- return NULL; |
-} |
- |
-const SkOpSpanBase* SkOpGlobalState::debugSpan(int id) const { |
- const SkOpContour* contour = fHead; |
- do { |
- const SkOpSegment* segment = contour->first(); |
- while (segment) { |
- const SkOpSpan* span = segment->head(); |
- do { |
- if (span->debugID() == id) { |
- return span; |
- } |
- } while ((span = span->next()->upCastable())); |
- const SkOpSpanBase* tail = segment->tail(); |
- if (tail->debugID() == id) { |
- return tail; |
- } |
- segment = segment->next(); |
- } |
- } while ((contour = contour->next())); |
- return NULL; |
-} |
-#endif |
- |
-const SkOpAngle* DebugAngle(const SkTArray<SkOpContour*, true>* contours, int id) { |
- return (*contours)[0]->debugAngle(id); |
-} |
- |
-SkOpContour* DumpContour(const SkTArray<SkOpContour*, true>* contours, int id) { |
- return (*contours)[0]->debugContour(id); |
-} |
- |
-const SkOpPtT* DebugPtT(const SkTArray<SkOpContour*, true>* contours, int id) { |
- return (*contours)[0]->debugPtT(id); |
-} |
- |
-const SkOpSegment* DebugSegment(const SkTArray<SkOpContour*, true>* contours, int id) { |
- return (*contours)[0]->debugSegment(id); |
-} |
- |
-const SkOpSpanBase* DebugSpan(const SkTArray<SkOpContour*, true>* contours, int id) { |
- return (*contours)[0]->debugSpan(id); |
-} |
- |
-void Dump(SkTDArray<SkOpContour* >* contours) { |
- SkPathOpsDebug::DumpContours(contours); |
-} |
- |
-void DumpAll(SkTDArray<SkOpContour* >* contours) { |
- SkPathOpsDebug::DumpContoursAll(contours); |
-} |
- |
-void DumpAngles(const SkTDArray<SkOpContour* >* contours) { |
- SkPathOpsDebug::DumpContoursAngles(contours); |
-} |
- |
-void DumpSegment(const SkTDArray<SkOpContour* >* contours, int segmentID) { |
- SkPathOpsDebug::DumpContoursSegment(contours, segmentID); |
-} |
- |
-void DumpSpan(const SkTDArray<SkOpContour* >* contours, int spanID) { |
- SkPathOpsDebug::DumpContoursSpan(contours, spanID); |
-} |
- |
-void DumpSpans(const SkTDArray<SkOpContour* >* contours) { |
- SkPathOpsDebug::DumpContoursSpans(contours); |
-} |
- |
-void DumpPt(const SkTDArray<SkOpContour* >* contours, int segmentID) { |
- SkPathOpsDebug::DumpContoursPt(contours, segmentID); |
-} |
- |
-void DumpPts(const SkTDArray<SkOpContour* >* contours) { |
- SkPathOpsDebug::DumpContoursPts(contours); |
-} |
- |
-#if DEBUG_T_SECT_DUMP > 1 |
-int gDumpTSectNum; |
-#endif |
+void DumpQ(const SkDQuad& quad1, const SkDQuad& quad2, int testNo) { |
+ SkDebugf("\n"); |
+ dumpTestCase(quad1, quad2, testNo); |
+ dumpTestTrailer(); |
+ dumpTestList(testNo, 0); |
+ SkDebugf("\n"); |
+} |
+ |
+void DumpT(const SkDQuad& quad, double t) { |
+ SkDLine line = {{quad.ptAtT(t), quad[0]}}; |
+ line.dump(); |
+} |