From 66ca2fba44fe04f3382a3e22096fe73b60ce19d7 Mon Sep 17 00:00:00 2001 From: "caryclark@google.com" Date: Tue, 3 Jul 2012 14:30:08 +0000 Subject: shape ops work in progress git-svn-id: http://skia.googlecode.com/svn/trunk@4446 2bbb7eff-a529-9590-31e7-b0007b416f81 --- experimental/Intersection/Simplify.cpp | 69 ++++++++++++++------------ experimental/Intersection/SimplifyNew_Test.cpp | 2 +- 2 files changed, 37 insertions(+), 34 deletions(-) (limited to 'experimental/Intersection') 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 outsideTs; - SkTDArray 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& 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& 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& 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() { -- cgit v1.2.3