diff options
author | caryclark@google.com <caryclark@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-07-03 14:30:08 +0000 |
---|---|---|
committer | caryclark@google.com <caryclark@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-07-03 14:30:08 +0000 |
commit | 66ca2fba44fe04f3382a3e22096fe73b60ce19d7 (patch) | |
tree | 980815722bc8c9f5c0020504b581eaa1d25e8fe1 | |
parent | 11b2d8b8d2e0230ccacf6d635f7ab0be8b53ca8d (diff) |
shape ops work in progress
git-svn-id: http://skia.googlecode.com/svn/trunk@4446 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r-- | experimental/Intersection/Simplify.cpp | 69 | ||||
-rw-r--r-- | experimental/Intersection/SimplifyNew_Test.cpp | 2 |
2 files changed, 37 insertions, 34 deletions
diff --git a/experimental/Intersection/Simplify.cpp b/experimental/Intersection/Simplify.cpp index 23a0a3dc62..1ab5af48ce 100644 --- a/experimental/Intersection/Simplify.cpp +++ b/experimental/Intersection/Simplify.cpp @@ -43,7 +43,7 @@ #define DEBUG_PATH_CONSTRUCTION 1 #define DEBUG_WINDING 0 #define DEBUG_UNUSED 0 // set to expose unused functions -#define DEBUG_MARK_DONE 01 +#define DEBUG_MARK_DONE 0 #endif @@ -813,21 +813,15 @@ public: SkDEBUGCODE(int testWindValue = test->fWindValue); SkDEBUGCODE(int oTestWindValue = oTest->fWindValue); SkDEBUGCODE(int startIndex = index); - SkTDArray<double> outsideTs; - SkTDArray<double> oOutsideTs; do { bool decrement = test->fWindValue && oTest->fWindValue; Span* end = test; - double startT = end->fT; - double oStartT = oTest->fT; do { SkASSERT(testWindValue == end->fWindValue); if (decrement) { if (--(end->fWindValue) == 0) { end->fDone = true; ++fDoneSpans; - *outsideTs.append() = end->fT; - *outsideTs.append() = oStartT; } } end = &fTs[++index]; @@ -841,8 +835,6 @@ public: if (--(oTestStart->fWindValue) == 0) { oTestStart->fDone = true; ++other.fDoneSpans; - *oOutsideTs.append() = oTestStart->fT; - *oOutsideTs.append() = startT; } } if (!oIndex) { @@ -854,14 +846,6 @@ public: oTest = oTestStart; } while (test->fT < endT - FLT_EPSILON); SkASSERT(!oIndex || oTest->fT <= oStartT - FLT_EPSILON); -#if 0 - if (!done() && outsideTs.count()) { - addTOutsides(outsideTs, &other, oStartT); - } - if (!other.done() && oOutsideTs.count()) { - other.addTOutsides(oOutsideTs, this, startT); - } -#endif } // set spans from start to end to increment the greater by one and decrement @@ -1884,7 +1868,7 @@ public: fSegments.reset(); fBounds.set(SK_ScalarMax, SK_ScalarMax, SK_ScalarMax, SK_ScalarMax); fContainsCurves = fContainsIntercepts = false; - fWindingSum = -1; + fWindingSum = SK_MinS32; } void resolveCoincidence(int winding) { @@ -2240,6 +2224,15 @@ public: fIndex = 0; fLast = contour->segments().count(); } + + bool isAdjacent(const Work& next) { + return fContour == next.fContour && fIndex + 1 == next.fIndex; + } + + bool isFirstLast(const Work& next) { + return fContour == next.fContour && fIndex == 0 + && next.fIndex == fLast - 1; + } SkScalar left() const { return bounds().fLeft; @@ -2529,6 +2522,18 @@ static bool addIntersectTs(Contour* test, Contour* next) { // in addition to recording T values, record matching segment if (pts == 2 && wn.segmentType() <= Work::kLine_Segment && wt.segmentType() <= Work::kLine_Segment) { + if (wt.isAdjacent(wn)) { + int testEndTAt = wt.addT(1, wn); + int nextEndTAt = wn.addT(0, wt); + wt.addOtherT(testEndTAt, 0, nextEndTAt); + wn.addOtherT(nextEndTAt, 1, testEndTAt); + } + if (wt.isFirstLast(wn)) { + int testStartTAt = wt.addT(0, wn); + int nextStartTAt = wn.addT(1, wt); + wt.addOtherT(testStartTAt, 1, nextStartTAt); + wn.addOtherT(nextStartTAt, 0, testStartTAt); + } wt.addCoincident(wn, ts, swap); continue; } @@ -2697,19 +2702,13 @@ static void bridge(SkTDArray<Contour*>& contourList, SkPath& simple) { // follow edges to intersection by changing the index by direction. int index, endIndex; Segment* current = topStart->findTop(index, endIndex); - int winding; - int contourWinding; - if (firstContour) { - topContour->setWinding(0); - contourWinding = 0; - firstContour = false; - winding = 0; - } else { - winding = topContour->winding(); + int winding = 0; + if (!firstContour) { + int contourWinding = topContour->winding(); #if DEBUG_WINDING SkDebugf("%s 1 winding=%d\n", __FUNCTION__, winding); #endif - if (!winding) { + if (contourWinding == SK_MinS32) { const SkPoint& topPoint = current->xyAtT(endIndex); winding = innerContourCheck(contourList, topContour, topPoint); #if DEBUG_WINDING @@ -2719,12 +2718,13 @@ static void bridge(SkTDArray<Contour*>& contourList, SkPath& simple) { } const SkPoint* firstPt = NULL; SkPoint lastPt; - bool active = winding >= -1 && winding <= 1; bool firstTime = true; int spanWinding = current->spanSign(index, endIndex); - #if DEBUG_WINDING - SkDebugf("%s spanWinding=%d\n", __FUNCTION__, startWinding); - #endif + if (firstContour) { + topContour->setWinding(spanWinding); + firstContour = false; + } + bool active = winding * spanWinding <= 0; do { SkASSERT(!current->done()); int nextStart, nextEnd; @@ -2742,6 +2742,9 @@ static void bridge(SkTDArray<Contour*>& contourList, SkPath& simple) { endIndex = nextEnd; spanWinding = SkSign32(spanWinding) * next->windValue( SkMin32(nextStart, nextEnd)); + #if DEBUG_WINDING + SkDebugf("%s spanWinding=%d\n", __FUNCTION__, spanWinding); + #endif firstTime = false; } while (*firstPt != lastPt); if (firstPt) { @@ -2799,9 +2802,9 @@ void simplifyx(const SkPath& path, SkPath& simple) { next = *nextPtr++; } while (addIntersectTs(current, next) && nextPtr != listEnd); } while (currentPtr != listEnd); - fixOtherTIndex(contourList); // eat through coincident edges coincidenceCheck(contourList, winding); + fixOtherTIndex(contourList); // construct closed contours bridge(contourList, simple); } diff --git a/experimental/Intersection/SimplifyNew_Test.cpp b/experimental/Intersection/SimplifyNew_Test.cpp index 022518b8b3..4ef8807926 100644 --- a/experimental/Intersection/SimplifyNew_Test.cpp +++ b/experimental/Intersection/SimplifyNew_Test.cpp @@ -352,7 +352,7 @@ static struct { static const size_t testCount = sizeof(tests) / sizeof(tests[0]); -static void (*firstTest)() = 0; +static void (*firstTest)() = testLine20; static bool skipAll = false; void SimplifyNew_Test() { |