diff options
-rw-r--r-- | experimental/Intersection/Simplify.cpp | 41 | ||||
-rw-r--r-- | experimental/Intersection/SimplifyNew_Test.cpp | 27 | ||||
-rw-r--r-- | experimental/Intersection/op.htm | 14 |
3 files changed, 65 insertions, 17 deletions
diff --git a/experimental/Intersection/Simplify.cpp b/experimental/Intersection/Simplify.cpp index c52d722cd6..8cdec8f994 100644 --- a/experimental/Intersection/Simplify.cpp +++ b/experimental/Intersection/Simplify.cpp @@ -42,10 +42,10 @@ #define DEBUG_CROSS 1 #define DEBUG_DUMP 1 #define DEBUG_PATH_CONSTRUCTION 1 -#define DEBUG_ACTIVE_SPANS 0 -#define DEBUG_WINDING 0 +#define DEBUG_ACTIVE_SPANS 01 +#define DEBUG_WINDING 01 #define DEBUG_UNUSED 0 // set to expose unused functions -#define DEBUG_MARK_DONE 0 +#define DEBUG_MARK_DONE 01 #endif @@ -682,23 +682,27 @@ public: bool activeAngleInner(int index, int& done, SkTDArray<Angle>& angles) const { int next = nextSpan(index, 1); if (next > 0) { - addAngle(angles, index, next); const Span& upSpan = fTs[index]; - if (upSpan.fDone) { - done++; - } else if (upSpan.fWindSum != SK_MinS32) { - return true; + if (upSpan.fWindValue) { + addAngle(angles, index, next); + if (upSpan.fDone) { + done++; + } else if (upSpan.fWindSum != SK_MinS32) { + return true; + } } } int prev = nextSpan(index, -1); // edge leading into junction if (prev >= 0) { - addAngle(angles, index, prev); const Span& downSpan = fTs[prev]; - if (downSpan.fDone) { - done++; - } else if (downSpan.fWindSum != SK_MinS32) { - return true; + if (downSpan.fWindValue) { + addAngle(angles, index, prev); + if (downSpan.fDone) { + done++; + } else if (downSpan.fWindSum != SK_MinS32) { + return true; + } } } return false; @@ -1088,12 +1092,12 @@ public: } int crossedSpan(const SkPoint& basePt, SkScalar& bestY, double& hitT) const { - int start = 0; int bestT = -1; SkScalar top = bounds().fTop; SkScalar bottom = bounds().fBottom; - int end; + int end = 0; do { + int start = end; end = nextSpan(start, 1); SkPoint edge[4]; // OPTIMIZE: wrap this so that if start==0 end==fTCount-1 we can @@ -1119,7 +1123,6 @@ public: bestT = foundT < 1 ? start : end; hitT = foundT; } - start = end; } while (fTs[end].fT != 1); return bestT; } @@ -1215,6 +1218,10 @@ public: firstEdge = false; if (!winding) { if (!foundAngle) { +#if 0 + nextAngle->segment()->markWinding( + SkMin32(nextAngle->start(), nextAngle->end()), maxWinding); +#endif foundAngle = nextAngle; } continue; @@ -2831,7 +2838,7 @@ static Segment* findChase(SkTDArray<Span*>& chase, int& tIndex, int& endIndex) { if (firstSign * winding > 0) { winding -= firstSign; } - SkDebugf("%s firstSign=%d\n", __FUNCTION__, firstSign); + // SkDebugf("%s firstSign=%d\n", __FUNCTION__, firstSign); // we care about first sign and whether wind sum indicates this // edge is inside or outside. Maybe need to pass span winding // or first winding or something into this function? diff --git a/experimental/Intersection/SimplifyNew_Test.cpp b/experimental/Intersection/SimplifyNew_Test.cpp index 8bd172b4cd..06b0167ec9 100644 --- a/experimental/Intersection/SimplifyNew_Test.cpp +++ b/experimental/Intersection/SimplifyNew_Test.cpp @@ -372,6 +372,30 @@ static void testLine32() { testSimplifyx(path); } +static void testLine33() { + SkPath path, simple; + path.addRect(0, 0, 20, 20, (SkPath::Direction) 0); + path.addRect(0, 0, 12, 12, (SkPath::Direction) 0); + path.addRect(4, 16, 13, 13, (SkPath::Direction) 0); + testSimplifyx(path); +} + +static void testLine34() { + SkPath path, simple; + path.addRect(0, 0, 20, 20, (SkPath::Direction) 0); + path.addRect(0, 6, 12, 12, (SkPath::Direction) 0); + path.addRect(4, 12, 13, 13, (SkPath::Direction) 0); + testSimplifyx(path); +} + +static void testLine35() { + SkPath path, simple; + path.addRect(0, 0, 20, 20, (SkPath::Direction) 0); + path.addRect(6, 0, 18, 18, (SkPath::Direction) 0); + path.addRect(4, 16, 13, 13, (SkPath::Direction) 0); + testSimplifyx(path); +} + #define TEST(name) { name, #name } static struct { @@ -414,6 +438,9 @@ static struct { TEST(testLine30), TEST(testLine31), TEST(testLine32), + TEST(testLine33), + TEST(testLine34), + TEST(testLine35), }; static const size_t testCount = sizeof(tests) / sizeof(tests[0]); diff --git a/experimental/Intersection/op.htm b/experimental/Intersection/op.htm index 64f7611a1e..04005617af 100644 --- a/experimental/Intersection/op.htm +++ b/experimental/Intersection/op.htm @@ -383,11 +383,25 @@ path.close(); path.addRect(4, 16, 13, 13, (SkPath::Direction) 0); </div> +<div id="testLine34"> + path.addRect(0, 0, 20, 20, (SkPath::Direction) 0); + path.addRect(0, 6, 12, 12, (SkPath::Direction) 0); + path.addRect(4, 12, 13, 13, (SkPath::Direction) 0); +</div> + +<div id="testLine35"> + path.addRect(0, 0, 20, 20, (SkPath::Direction) 0); + path.addRect(6, 0, 18, 18, (SkPath::Direction) 0); + path.addRect(4, 16, 13, 13, (SkPath::Direction) 0); +</div> + </div> <script type="text/javascript"> var testDivs = [ + testLine35, + testLine34, testLine33, testLine9, testLine7, |