aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Cary Clark <caryclark@skia.org>2018-07-10 10:57:54 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-07-10 15:25:35 +0000
commit1d314433ffd5a5149438dd82d10c04736325004d (patch)
tree618f7311c51690a0a624be89f8e95bae508691e4
parent3be2e10ce534a9bf8eb008d3704be26b2ba04437 (diff)
fix line intersect divide by zero
Test filinmangust14 exposes two problems: - finding top of contour can expose divide by zero - joining partial contour results can add diagonal The latter makes the test return the wrong result, and has not been seen in other tests. The fix is to join disconnected contours by only following the contours provided as input. Working on that. The former bug is more straight-forward; just don't try to compute axis-aligned intersection if the denominator is zero. All existing tests prior to the new one work with this change. R=caryclark@google.com Bug: skia:8125 Change-Id: Ic878d090066708d9baca8475f27d4d5aba2294cc Reviewed-on: https://skia-review.googlesource.com/140121 Reviewed-by: Cary Clark <caryclark@skia.org> Commit-Queue: Cary Clark <caryclark@skia.org> Auto-Submit: Cary Clark <caryclark@skia.org>
-rw-r--r--src/pathops/SkDLineIntersection.cpp4
-rw-r--r--src/pathops/SkPathOpsCurve.h6
-rw-r--r--src/pathops/SkPathOpsDebug.h1
-rw-r--r--src/pathops/SkPathWriter.cpp16
-rw-r--r--tests/PathOpsOpTest.cpp50
-rw-r--r--tools/pathops_visualizer.htm349
6 files changed, 425 insertions, 1 deletions
diff --git a/src/pathops/SkDLineIntersection.cpp b/src/pathops/SkDLineIntersection.cpp
index 43c37decb8..5dcc067369 100644
--- a/src/pathops/SkDLineIntersection.cpp
+++ b/src/pathops/SkDLineIntersection.cpp
@@ -197,7 +197,8 @@ static int horizontal_coincident(const SkDLine& line, double y) {
}
double SkIntersections::HorizontalIntercept(const SkDLine& line, double y) {
- return SkPinT((y - line[0].fY) / (line[1].fY - line[0].fY));
+ SkASSERT(line[1].fY != line[0].fY);
+ return SkPinT((y - line[0].fY) / (line[1].fY - line[0].fY));
}
int SkIntersections::horizontal(const SkDLine& line, double left, double right,
@@ -274,6 +275,7 @@ static int vertical_coincident(const SkDLine& line, double x) {
}
double SkIntersections::VerticalIntercept(const SkDLine& line, double x) {
+ SkASSERT(line[1].fX != line[0].fX);
return SkPinT((x - line[0].fX) / (line[1].fX - line[0].fX));
}
diff --git a/src/pathops/SkPathOpsCurve.h b/src/pathops/SkPathOpsCurve.h
index 2b50864e5b..7823146d78 100644
--- a/src/pathops/SkPathOpsCurve.h
+++ b/src/pathops/SkPathOpsCurve.h
@@ -358,12 +358,18 @@ static void (* const CurveDIntersectRay[])(const SkDCurve& , const SkDLine& , Sk
};
static int line_intercept_h(const SkPoint a[2], SkScalar , SkScalar y, double* roots) {
+ if (a[0].fY == a[1].fY) {
+ return false;
+ }
SkDLine line;
roots[0] = SkIntersections::HorizontalIntercept(line.set(a), y);
return between(0, roots[0], 1);
}
static int line_intercept_v(const SkPoint a[2], SkScalar , SkScalar x, double* roots) {
+ if (a[0].fX == a[1].fX) {
+ return false;
+ }
SkDLine line;
roots[0] = SkIntersections::VerticalIntercept(line.set(a), x);
return between(0, roots[0], 1);
diff --git a/src/pathops/SkPathOpsDebug.h b/src/pathops/SkPathOpsDebug.h
index 9aec715de1..724713a74a 100644
--- a/src/pathops/SkPathOpsDebug.h
+++ b/src/pathops/SkPathOpsDebug.h
@@ -8,6 +8,7 @@
#define SkPathOpsDebug_DEFINED
#include "SkPathOps.h"
+#include "SkString.h"
#include "SkTypes.h"
#include <stdlib.h>
diff --git a/src/pathops/SkPathWriter.cpp b/src/pathops/SkPathWriter.cpp
index 7291002593..950f8fbce5 100644
--- a/src/pathops/SkPathWriter.cpp
+++ b/src/pathops/SkPathWriter.cpp
@@ -301,6 +301,22 @@ void SkPathWriter::assemble() {
#endif
do {
const SkPath& contour = fPartials[rIndex];
+ if (!first) {
+ SkPoint prior, next;
+ SkAssertResult(fPathPtr->getLastPt(&prior));
+ if (forward) {
+ next = contour.getPoint(0);
+ } else {
+ SkAssertResult(contour.getLastPt(&next));
+ }
+ if (prior != next) {
+ /* TODO: if there is a gap between open path written so far and path to come,
+ connect by following segments from one to the other, rather than introducing
+ a diagonal to connect the two.
+ */
+ SkDebugf("");
+ }
+ }
if (forward) {
fPathPtr->addPath(contour,
first ? SkPath::kAppend_AddPathMode : SkPath::kExtend_AddPathMode);
diff --git a/tests/PathOpsOpTest.cpp b/tests/PathOpsOpTest.cpp
index 52cd8b2a04..950baaf7b3 100644
--- a/tests/PathOpsOpTest.cpp
+++ b/tests/PathOpsOpTest.cpp
@@ -5751,6 +5751,55 @@ static void testRect1_u(skiatest::Reporter* reporter, const char* filename) {
testPathOp(reporter, path, pathB, kUnion_SkPathOp, filename);
}
+// this test fails for now; it generates partial paths that are incorrectly
+// connected to form an area where it should not. The fix is to connect the
+// pieces using only contours that are part of the input data set.
+static void filinmangust14(skiatest::Reporter* reporter, const char* filename) {
+ return;
+SkPath path, path1;
+path.setFillType(SkPath::kWinding_FillType);
+ path.moveTo(SkBits2Float(0x440bc02c), SkBits2Float(0x4409c000)); // 559.003f, 551
+ path.lineTo(SkBits2Float(0x440bc02c), SkBits2Float(0x440e8000)); // 559.003f, 570
+ path.lineTo(SkBits2Float(0x440bbfda), SkBits2Float(0x440e8000)); // 558.998f, 570
+ path.lineTo(SkBits2Float(0x440bbfda), SkBits2Float(0x4409c000)); // 558.998f, 551
+ path.lineTo(SkBits2Float(0x440bc02c), SkBits2Float(0x4409c000)); // 559.003f, 551
+ path.close();
+path1 = path;
+path.reset();
+ path.setFillType(SkPath::kWinding_FillType);
+ path.moveTo(SkBits2Float(0x45582000), SkBits2Float(0x45be9805)); // 3458, 6099
+ path.lineTo(SkBits2Float(0x4554b667), SkBits2Float(0x45be9805)); // 3403.4f, 6099
+ path.lineTo(SkBits2Float(0x4554b667), SkBits2Float(0x45be97fb)); // 3403.4f, 6099
+ path.lineTo(SkBits2Float(0x45582000), SkBits2Float(0x45be97fb)); // 3458, 6099
+ path.lineTo(SkBits2Float(0x45582000), SkBits2Float(0x45be9805)); // 3458, 6099
+ path.close();
+ path.moveTo(SkBits2Float(0x43b60000), SkBits2Float(0x443dffd7)); // 364, 759.997f
+ path.lineTo(SkBits2Float(0x4554b667), SkBits2Float(0x443dffd7)); // 3403.4f, 759.997f
+ path.lineTo(SkBits2Float(0x4554b667), SkBits2Float(0x443e0029)); // 3403.4f, 760.003f
+ path.lineTo(SkBits2Float(0x43b60000), SkBits2Float(0x443e0029)); // 364, 760.003f
+ path.lineTo(SkBits2Float(0x43b60000), SkBits2Float(0x443dffd7)); // 364, 759.997f
+ path.close();
+ path.moveTo(SkBits2Float(0x4554b65d), SkBits2Float(0x45be9800)); // 3403.4f, 6099
+ path.lineTo(SkBits2Float(0x4554b65d), SkBits2Float(0x443e0000)); // 3403.4f, 760
+ path.lineTo(SkBits2Float(0x4554b671), SkBits2Float(0x443e0000)); // 3403.4f, 760
+ path.lineTo(SkBits2Float(0x4554b671), SkBits2Float(0x45be9800)); // 3403.4f, 6099
+ path.lineTo(SkBits2Float(0x4554b65d), SkBits2Float(0x45be9800)); // 3403.4f, 6099
+ path.close();
+ path.moveTo(SkBits2Float(0x449f4000), SkBits2Float(0x43bdffae)); // 1274, 379.997f
+ path.lineTo(SkBits2Float(0x4554b667), SkBits2Float(0x43bdffae)); // 3403.4f, 379.997f
+ path.lineTo(SkBits2Float(0x4554b667), SkBits2Float(0x43be0052)); // 3403.4f, 380.003f
+ path.lineTo(SkBits2Float(0x449f4000), SkBits2Float(0x43be0052)); // 1274, 380.003f
+ path.lineTo(SkBits2Float(0x449f4000), SkBits2Float(0x43bdffae)); // 1274, 379.997f
+ path.close();
+ path.moveTo(SkBits2Float(0x4554b65d), SkBits2Float(0x443e0000)); // 3403.4f, 760
+ path.lineTo(SkBits2Float(0x4554b65d), SkBits2Float(0x43be0000)); // 3403.4f, 380
+ path.lineTo(SkBits2Float(0x4554b671), SkBits2Float(0x43be0000)); // 3403.4f, 380
+ path.lineTo(SkBits2Float(0x4554b671), SkBits2Float(0x443e0000)); // 3403.4f, 760
+ path.lineTo(SkBits2Float(0x4554b65d), SkBits2Float(0x443e0000)); // 3403.4f, 760
+ path.close();
+ testPathOp(reporter, path1, path, kUnion_SkPathOp, filename);
+}
+
static void (*skipTest)(skiatest::Reporter* , const char* filename) = 0;
static void (*firstTest)(skiatest::Reporter* , const char* filename) = 0;
static void (*stopTest)(skiatest::Reporter* , const char* filename) = 0;
@@ -5758,6 +5807,7 @@ static void (*stopTest)(skiatest::Reporter* , const char* filename) = 0;
#define TEST(name) { name, #name }
static struct TestDesc tests[] = {
+ TEST(filinmangust14),
TEST(testRect1_u),
TEST(halbug),
TEST(seanbug),
diff --git a/tools/pathops_visualizer.htm b/tools/pathops_visualizer.htm
index 246a29b162..4c8d52f301 100644
--- a/tools/pathops_visualizer.htm
+++ b/tools/pathops_visualizer.htm
@@ -185,11 +185,360 @@ SkOpSegment::markDone id=7 (580.238281,594.114014 278.657715,594.114014) t=0 [13
SkOpSegment::markDone id=6 (580.238281,155.747314 580.238281,594.114014) t=0 [11] (580.238281,155.747314) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
</div>
+<div id="filinmangust14">
+seg=1 {{{559.002686f, 551}, {559.002686f, 570}}}
+seg=2 {{{559.002686f, 570}, {558.997681f, 570}}}
+seg=3 {{{558.997681f, 570}, {558.997681f, 551}}}
+seg=4 {{{558.997681f, 551}, {559.002686f, 551}}}
+op union
+<empty>
+seg=5 {{{364, 759.997498f}, {3403.40015f, 759.997498f}}}
+seg=6 {{{3403.40015f, 759.997498f}, {3403.40015f, 760.002502f}}}
+seg=7 {{{3403.40015f, 760.002502f}, {364, 760.002502f}}}
+seg=8 {{{364, 760.002502f}, {364, 759.997498f}}}
+seg=9 {{{3403.39771f, 6099}, {3403.39771f, 760}}}
+seg=10 {{{3403.39771f, 760}, {3403.40259f, 760}}}
+seg=11 {{{3403.40259f, 760}, {3403.39771f, 6099}}}
+seg=12 {{{1274, 379.997498f}, {3403.40015f, 379.997498f}}}
+seg=13 {{{3403.40015f, 379.997498f}, {3403.40015f, 380.002502f}}}
+seg=14 {{{3403.40015f, 380.002502f}, {1274, 380.002502f}}}
+seg=15 {{{1274, 380.002502f}, {1274, 379.997498f}}}
+seg=16 {{{3403.39771f, 760}, {3403.39771f, 380}}}
+seg=17 {{{3403.39771f, 380}, {3403.40259f, 380}}}
+seg=18 {{{3403.40259f, 380}, {3403.40259f, 760}}}
+seg=19 {{{3403.40259f, 760}, {3403.39771f, 760}}}
+debugShowLineIntersection wtTs[0]=0 {{{3403.40015,379.997498}, {3403.40015,380.002502}}} {{3403.40015,379.997498}} wnTs[0]=1 {{{1274,379.997498}, {3403.40015,379.997498}}}
+debugShowLineIntersection wtTs[0]=1 {{{1274,380.002502}, {1274,379.997498}}} {{1274,379.997498}} wnTs[0]=0 {{{1274,379.997498}, {3403.40015,379.997498}}}
+debugShowLineIntersection wtTs[0]=0 {{{3403.40015,380.002502}, {1274,380.002502}}} {{3403.40015,380.002502}} wnTs[0]=1 {{{3403.40015,379.997498}, {3403.40015,380.002502}}}
+debugShowLineIntersection wtTs[0]=0 {{{1274,380.002502}, {1274,379.997498}}} {{1274,380.002502}} wnTs[0]=1 {{{3403.40015,380.002502}, {1274,380.002502}}}
+debugShowLineIntersection no intersect {{{3403.39771,760}, {3403.39771,380}}} {{{3403.40015,379.997498}, {3403.40015,380.002502}}}
+debugShowLineIntersection wtTs[0]=0.5 {{{3403.39771,380}, {3403.40259,380}}} {{3403.40015,380}} wnTs[0]=0.5 {{{3403.40015,379.997498}, {3403.40015,380.002502}}}
+debugShowLineIntersection no intersect {{{3403.40259,380}, {3403.40259,760}}} {{{3403.40015,379.997498}, {3403.40015,380.002502}}}
+debugShowLineIntersection wtTs[0]=0.999993415 {{{3403.39771,760}, {3403.39771,380}}} {{3403.39771,380.002502}} wnTs[0]=1.14652e-06 {{{3403.40015,380.002502}, {1274,380.002502}}}
+debugShowLineIntersection no intersect {{{3403.40259,380}, {3403.40259,760}}} {{{3403.40015,380.002502}, {1274,380.002502}}}
+debugShowLineIntersection wtTs[0]=0 {{{3403.39771,380}, {3403.40259,380}}} {{3403.39771,380}} wnTs[0]=1 {{{3403.39771,760}, {3403.39771,380}}}
+SkOpSegment::markDone id=13 (3403.40015,379.997498 3403.40015,380.002502) t=0 [25] (3403.40015,379.997498) tEnd=1 newWindSum=? newOppSum=? oppSum=? windSum=? windValue=1 oppValue=0
+debugShowLineIntersection wtTs[0]=1 {{{3403.40259,760}, {3403.39771,760}}} {{3403.39771,760}} wnTs[0]=0 {{{3403.39771,760}, {3403.39771,380}}}
+debugShowLineIntersection wtTs[0]=0 {{{3403.40259,380}, {3403.40259,760}}} {{3403.40259,380}} wnTs[0]=1 {{{3403.39771,380}, {3403.40259,380}}}
+debugShowLineIntersection wtTs[0]=0 {{{3403.40259,760}, {3403.39771,760}}} {{3403.40259,760}} wnTs[0]=1 {{{3403.40259,380}, {3403.40259,760}}}
+debugShowLineIntersection wtTs[0]=0.999999197 {{{364,759.997498}, {3403.40015,759.997498}}} {{3403.39771,759.997498}} wnTs[0]=6.58537e-06 {{{3403.39771,760}, {3403.39771,380}}}
+debugShowLineIntersection no intersect {{{3403.40015,759.997498}, {3403.40015,760.002502}}} {{{3403.39771,760}, {3403.39771,380}}}
+debugShowLineIntersection no intersect {{{364,759.997498}, {3403.40015,759.997498}}} {{{3403.40259,380}, {3403.40259,760}}}
+debugShowLineIntersection no intersect {{{3403.40015,759.997498}, {3403.40015,760.002502}}} {{{3403.40259,380}, {3403.40259,760}}}
+debugShowLineIntersection wtTs[0]=0.5 {{{3403.40015,759.997498}, {3403.40015,760.002502}}} {{3403.40015,760}} wnTs[0]=0.5 {{{3403.40259,760}, {3403.39771,760}}}
+debugShowLineIntersection wtTs[0]=1 {{{3403.39771,6099}, {3403.39771,760}}} {{3403.39771,760}} wnTs[0]=0 {{{3403.39771,760}, {3403.39771,380}}}
+debugShowLineIntersection wtTs[0]=0 {{{3403.39771,760}, {3403.40259,760}}} {{3403.39771,760}} wnTs[0]=0 {{{3403.39771,760}, {3403.39771,380}}}
+debugShowLineIntersection wtTs[0]=8.36411997e-13 {{{3403.40259,760}, {3403.39771,6099}}} {{3403.39771,760}} wnTs[0]=0 {{{3403.39771,760}, {3403.39771,380}}}
+debugShowLineIntersection wtTs[0]=1 {{{3403.39771,760}, {3403.40259,760}}} {{3403.40259,760}} wnTs[0]=1 {{{3403.40259,380}, {3403.40259,760}}}
+debugShowLineIntersection wtTs[0]=0 {{{3403.40259,760}, {3403.39771,6099}}} {{3403.40259,760}} wnTs[0]=1 {{{3403.40259,380}, {3403.40259,760}}}
+SkOpSegment::markDone id=10 (3403.39771,760 3403.40259,760) t=0 [19] (3403.39771,760) tEnd=1 newWindSum=? newOppSum=? oppSum=? windSum=? windValue=1 oppValue=0
+SkOpSegment::markDone id=19 (3403.40259,760 3403.39771,760) t=0 [37] (3403.40259,760) tEnd=1 newWindSum=? newOppSum=? oppSum=? windSum=? windValue=1 oppValue=0
+debugShowLineIntersection wtTs[0]=1 {{{3403.39771,6099}, {3403.39771,760}}} {{3403.39771,760}} wnTs[0]=1 {{{3403.40259,760}, {3403.39771,760}}}
+debugShowLineIntersection wtTs[0]=0 {{{3403.39771,760}, {3403.40259,760}}} {{3403.39771,760}} wtTs[1]=1 {{3403.40259,760}} wnTs[0]=1 {{{3403.40259,760}, {3403.39771,760}}} wnTs[1]=0
+debugShowLineIntersection wtTs[0]=0 {{{3403.40259,760}, {3403.39771,6099}}} {{3403.40259,760}} wnTs[0]=0 {{{3403.40259,760}, {3403.39771,760}}}
+debugShowLineIntersection wtTs[0]=0 {{{559.002686,570}, {558.997681,570}}} {{559.002686,570}} wnTs[0]=1 {{{559.002686,551}, {559.002686,570}}}
+debugShowLineIntersection wtTs[0]=1 {{{558.997681,551}, {559.002686,551}}} {{559.002686,551}} wnTs[0]=0 {{{559.002686,551}, {559.002686,570}}}
+debugShowLineIntersection wtTs[0]=0 {{{558.997681,570}, {558.997681,551}}} {{558.997681,570}} wnTs[0]=1 {{{559.002686,570}, {558.997681,570}}}
+debugShowLineIntersection wtTs[0]=0 {{{558.997681,551}, {559.002686,551}}} {{558.997681,551}} wnTs[0]=1 {{{558.997681,570}, {558.997681,551}}}
+debugShowLineIntersection wtTs[0]=0 {{{3403.40015,759.997498}, {3403.40015,760.002502}}} {{3403.40015,759.997498}} wnTs[0]=1 {{{364,759.997498}, {3403.40015,759.997498}}}
+debugShowLineIntersection wtTs[0]=1 {{{364,760.002502}, {364,759.997498}}} {{364,759.997498}} wnTs[0]=0 {{{364,759.997498}, {3403.40015,759.997498}}}
+debugShowLineIntersection wtTs[0]=0 {{{3403.40015,760.002502}, {364,760.002502}}} {{3403.40015,760.002502}} wnTs[0]=1 {{{3403.40015,759.997498}, {3403.40015,760.002502}}}
+debugShowLineIntersection wtTs[0]=0 {{{364,760.002502}, {364,759.997498}}} {{364,760.002502}} wnTs[0]=1 {{{3403.40015,760.002502}, {364,760.002502}}}
+debugShowLineIntersection no intersect {{{3403.39771,6099}, {3403.39771,760}}} {{{3403.40015,759.997498}, {3403.40015,760.002502}}}
+debugShowLineIntersection wtTs[0]=0.5 {{{3403.39771,760}, {3403.40259,760}}} {{3403.40015,760}} wnTs[0]=0.5 {{{3403.40015,759.997498}, {3403.40015,760.002502}}}
+debugShowLineIntersection wtTs[0]=4.68710178e-07 {{{3403.40259,760}, {3403.39771,6099}}} {{3403.40015,760.002502}} wnTs[0]=1 {{{3403.40015,759.997498}, {3403.40015,760.002502}}}
+SkOpSegment::markDone id=6 (3403.40015,759.997498 3403.40015,760.002502) t=0 [11] (3403.40015,759.997498) tEnd=1 newWindSum=? newOppSum=? oppSum=? windSum=? windValue=1 oppValue=0
+debugShowLineIntersection wtTs[0]=0.999999531 {{{3403.39771,6099}, {3403.39771,760}}} {{3403.39771,760.002502}} wnTs[0]=8.03253e-07 {{{3403.40015,760.002502}, {364,760.002502}}}
+debugShowLineIntersection wtTs[0]=4.68710178e-07 {{{3403.40259,760}, {3403.39771,6099}}} {{3403.40015,760.002502}} wnTs[0]=0 {{{3403.40015,760.002502}, {364,760.002502}}}
+debugShowLineIntersection wtTs[0]=0 {{{3403.39771,760}, {3403.40259,760}}} {{3403.39771,760}} wnTs[0]=1 {{{3403.39771,6099}, {3403.39771,760}}}
+debugShowLineIntersection wtTs[0]=8.36411997e-13 {{{3403.40259,760}, {3403.39771,6099}}} {{3403.39771,760}} wtTs[1]=1 {{3403.39771,6099}} wnTs[0]=1 {{{3403.39771,6099}, {3403.39771,760}}} wnTs[1]=0
+debugShowLineIntersection wtTs[0]=0 {{{3403.40259,760}, {3403.39771,6099}}} {{3403.40259,760}} wnTs[0]=1 {{{3403.39771,760}, {3403.40259,760}}}
+------------------x--x------x--------- addExpanded
+00: segment=13 MoveNearbyClearAll2
+01: segment=17 MoveNearbyClearAll2
+02: segment=19 MoveNearbyClearAll2
+03: segment=6 MoveNearbyClearAll2
+04: segment=10 MoveNearbyClearAll2
+05: seg/base=9/17 seg/base=11/21 MarkCoinStart
+06: seg/base=9/18 seg/base=11/22 MarkCoinEnd
+SkOpSegment::debugShowActiveSpans id=12 (1274,379.997498 3403.40015,379.997498) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=14 (3403.40015,380.002502 1274,380.002502) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=15 (1274,380.002502 1274,379.997498) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=16 (3403.39771,760 3403.39771,380) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=17 (3403.39771,380 3403.40259,380) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=18 (3403.40259,380 3403.40259,760) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=1 (559.002686,551 559.002686,570) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=2 (559.002686,570 558.997681,570) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=3 (558.997681,570 558.997681,551) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=4 (558.997681,551 559.002686,551) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=5 (364,759.997498 3403.40015,759.997498) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=7 (3403.40015,760.002502 364,760.002502) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=8 (364,760.002502 364,759.997498) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=9 (3403.39771,6099 3403.39771,760) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=11 (3403.40259,760 3403.39771,6099) t=0 tEnd=1 windSum=? windValue=1
+------------------x--x------x--------- move_multiples
+00: segment=13 MoveNearbyClearAll2
+01: segment=17 MoveNearbyClearAll2
+02: segment=19 MoveNearbyClearAll2
+03: segment=6 MoveNearbyClearAll2
+04: segment=10 MoveNearbyClearAll2
+05: seg/base=9/17 seg/base=11/21 MarkCoinStart
+06: seg/base=9/18 seg/base=11/22 MarkCoinEnd
+------------------x--x------x--------- move_nearby
+00: segment=13 MoveNearbyClearAll2
+01: segment=17 MoveNearbyClearAll2
+02: segment=19 MoveNearbyClearAll2
+03: segment=6 MoveNearbyClearAll2
+04: segment=10 MoveNearbyClearAll2
+05: seg/base=9/17 seg/base=11/21 MarkCoinStart
+06: seg/base=9/18 seg/base=11/22 MarkCoinEnd
+SkOpSegment::markDone id=17 (3403.39771,380 3403.40259,380) t=0 [33] (3403.39771,380) tEnd=1 newWindSum=? newOppSum=? oppSum=? windSum=? windValue=0 oppValue=0
+------------------x--x------x--------- correctEnds
+00: segment=13 MoveNearbyClearAll2
+01: segment=17 MoveNearbyClearAll2
+02: segment=19 MoveNearbyClearAll2
+03: segment=6 MoveNearbyClearAll2
+04: segment=10 MoveNearbyClearAll2
+05: seg/base=9/17 seg/base=11/21 MarkCoinStart
+06: seg/base=9/18 seg/base=11/22 MarkCoinEnd
+SkOpSegment::debugShowActiveSpans id=12 (1274,379.997498 3403.40015,379.997498) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=14 (3403.40015,380.002502 1274,380.002502) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=15 (1274,380.002502 1274,379.997498) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=16 (3403.39771,760 3403.39771,380) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=18 (3403.40259,380 3403.40259,760) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=1 (559.002686,551 559.002686,570) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=2 (559.002686,570 558.997681,570) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=3 (558.997681,570 558.997681,551) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=4 (558.997681,551 559.002686,551) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=5 (364,759.997498 3403.40015,759.997498) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=7 (3403.40015,760.002502 364,760.002502) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=8 (364,760.002502 364,759.997498) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=9 (3403.39771,6099 3403.39771,760) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=11 (3403.40259,760 3403.39771,6099) t=0 tEnd=1 windSum=? windValue=1
+------------------x--x------x--------- addEndMovedSpans
+00: segment=13 MoveNearbyClearAll2
+01: segment=17 MoveNearbyClearAll2
+02: segment=19 MoveNearbyClearAll2
+03: segment=6 MoveNearbyClearAll2
+04: segment=10 MoveNearbyClearAll2
+05: seg/base=9/17 seg/base=11/21 MarkCoinStart
+06: seg/base=9/18 seg/base=11/22 MarkCoinEnd
+------------------x--x------x--------- expand
+00: segment=13 MoveNearbyClearAll2
+01: segment=17 MoveNearbyClearAll2
+02: segment=19 MoveNearbyClearAll2
+03: segment=6 MoveNearbyClearAll2
+04: segment=10 MoveNearbyClearAll2
+05: seg/base=9/17 seg/base=11/21 MarkCoinStart
+06: seg/base=9/18 seg/base=11/22 MarkCoinEnd
+------------------x--x------x--------- addExpanded
+00: segment=13 MoveNearbyClearAll2
+01: segment=17 MoveNearbyClearAll2
+02: segment=19 MoveNearbyClearAll2
+03: segment=6 MoveNearbyClearAll2
+04: segment=10 MoveNearbyClearAll2
+05: seg/base=9/17 seg/base=11/21 MarkCoinStart
+06: seg/base=9/18 seg/base=11/22 MarkCoinEnd
+------------------x--x------x--------- mark
+00: segment=13 MoveNearbyClearAll2
+01: segment=17 MoveNearbyClearAll2
+02: segment=19 MoveNearbyClearAll2
+03: segment=6 MoveNearbyClearAll2
+04: segment=10 MoveNearbyClearAll2
+05: seg/base=9/17 seg/base=11/21 MarkCoinStart
+06: seg/base=9/18 seg/base=11/22 MarkCoinEnd
+----------------------------x--------- missing_coincidence
+00: segment=13 MoveNearbyClearAll2
+01: segment=17 MoveNearbyClearAll2
+02: segment=19 MoveNearbyClearAll2
+03: segment=6 MoveNearbyClearAll2
+04: segment=10 MoveNearbyClearAll2
+----------------------------x--------- expand
+00: segment=13 MoveNearbyClearAll2
+01: segment=17 MoveNearbyClearAll2
+02: segment=19 MoveNearbyClearAll2
+03: segment=6 MoveNearbyClearAll2
+04: segment=10 MoveNearbyClearAll2
+----------------------------x--------- expand
+00: segment=13 MoveNearbyClearAll2
+01: segment=17 MoveNearbyClearAll2
+02: segment=19 MoveNearbyClearAll2
+03: segment=6 MoveNearbyClearAll2
+04: segment=10 MoveNearbyClearAll2
+----------------------------x--------- apply
+00: segment=13 MoveNearbyClearAll2
+01: segment=17 MoveNearbyClearAll2
+02: segment=19 MoveNearbyClearAll2
+03: segment=6 MoveNearbyClearAll2
+04: segment=10 MoveNearbyClearAll2
+SkOpSegment::markDone id=9 (3403.39771,6099 3403.39771,760) t=0 [17] (3403.39771,6099) tEnd=1 newWindSum=? newOppSum=? oppSum=? windSum=? windValue=0 oppValue=0
+SkOpSegment::markDone id=11 (3403.40259,760 3403.39771,6099) t=0 [21] (3403.40259,760) tEnd=1 newWindSum=? newOppSum=? oppSum=? windSum=? windValue=0 oppValue=0
+----------------------------x--------- findOverlaps
+00: segment=13 MoveNearbyClearAll2
+01: segment=17 MoveNearbyClearAll2
+02: segment=19 MoveNearbyClearAll2
+03: segment=6 MoveNearbyClearAll2
+04: segment=10 MoveNearbyClearAll2
+SkOpSegment::debugShowActiveSpans id=12 (1274,379.997498 3403.40015,379.997498) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=14 (3403.40015,380.002502 1274,380.002502) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=15 (1274,380.002502 1274,379.997498) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=16 (3403.39771,760 3403.39771,380) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=18 (3403.40259,380 3403.40259,760) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=1 (559.002686,551 559.002686,570) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=2 (559.002686,570 558.997681,570) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=3 (558.997681,570 558.997681,551) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=4 (558.997681,551 559.002686,551) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=5 (364,759.997498 3403.40015,759.997498) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=7 (3403.40015,760.002502 364,760.002502) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=8 (364,760.002502 364,759.997498) t=0 tEnd=1 windSum=? windValue=1
+----------------------------x--------- calc_angles
+00: segment=13 MoveNearbyClearAll2
+01: segment=17 MoveNearbyClearAll2
+02: segment=19 MoveNearbyClearAll2
+03: segment=6 MoveNearbyClearAll2
+04: segment=10 MoveNearbyClearAll2
+SkOpSegment::sortAngles [12] tStart=1 [24]
+SkOpAngle::after [12/1] 15/15 tStart=1 tEnd=0 < [16/4] 23/23 tStart=1 tEnd=0 < [14/2] 15/15 tStart=0 tEnd=1 F 5
+SkOpAngle::afterPart {{{3403.39771,380}, {1273.99756,380}}} id=12
+SkOpAngle::afterPart {{{3403.39771,380}, {3403.39771,760}}} id=16
+SkOpAngle::afterPart {{{3403.39771,380}, {1273.99756,380}}} id=14
+SkOpSegment::sortAngles [14] tStart=0 [27]
+SkOpSegment::sortAngles [16] tStart=0 [31]
+SkOpAngle::after [16/3] 7/7 tStart=0 tEnd=1 < [7/7] 15/15 tStart=0 tEnd=1 < [18/5] 7/7 tStart=1 tEnd=0 F 5
+SkOpAngle::afterPart {{{3403.40015,760.002502}, {3403.40015,380.002502}}} id=16
+SkOpAngle::afterPart {{{3403.40015,760.002502}, {364,760.002502}}} id=7
+SkOpAngle::afterPart {{{3403.40015,760.002502}, {3403.40015,380.002502}}} id=18
+SkOpAngle::after [16/3] 7/7 tStart=0 tEnd=1 < [5/6] 15/15 tStart=1 tEnd=0 < [18/5] 7/7 tStart=1 tEnd=0 F 5
+SkOpAngle::afterPart {{{3403.40015,759.997498}, {3403.40015,379.997498}}} id=16
+SkOpAngle::afterPart {{{3403.40015,759.997498}, {364,759.997498}}} id=5
+SkOpAngle::afterPart {{{3403.40015,759.997498}, {3403.40015,379.997498}}} id=18
+SkOpAngle::after [18/5] 7/7 tStart=1 tEnd=0 < [5/6] 15/15 tStart=1 tEnd=0 < [7/7] 15/15 tStart=0 tEnd=1 T 7
+SkOpAngle::afterPart {{{3403.40015,759.997498}, {3403.40015,379.997498}}} id=18
+SkOpAngle::afterPart {{{3403.40015,759.997498}, {364,759.997498}}} id=5
+SkOpAngle::afterPart {{{3403.40015,759.997498}, {364,759.997498}}} id=7
+SkOpSegment::sortAngles [16] tStart=1 [32]
+SkOpSegment::sortAngles [18] tStart=1 [36]
+SkOpSegment::sortAngles [5] tStart=1 [10]
+SkOpSegment::sortAngles [7] tStart=0 [13]
+coinSpan - id=9 t=0 tEnd=1
+coinSpan + id=11 t=1 tEnd=0
+SkOpSpan::sortableTop dir=kTop seg=12 t=0.5 pt=(2338.7002,379.997498)
+SkOpSpan::sortableTop [0] valid=1 operand=1 span=23 ccw=1 seg=12 {{{1274, 379.997498f}, {3403.40015f, 379.997498f}}} t=0.5 pt=(2338.7002,379.997498) slope=(2129.40015,0)
+SkOpSegment::markWinding id=12 (1274,379.997498 3403.40015,379.997498) t=0 [23] (1274,379.997498) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
+SkOpSegment::markWinding id=12 (1274,379.997498 3403.40015,379.997498) t=0 [23] (1274,379.997498) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
+SkOpSegment::markWinding id=15 (1274,380.002502 1274,379.997498) t=0 [29] (1274,380.002502) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=? windSum=? windValue=1 oppValue=0
+SkOpSegment::markWinding id=14 (3403.40015,380.002502 1274,380.002502) t=0 [27] (3403.40015,380.002502) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=? windSum=? windValue=1 oppValue=0
+SkOpSegment::activeOp id=12 t=1 tEnd=0 op=union miFrom=0 miTo=0 suFrom=0 suTo=1 result=1
+SkOpSegment::findNextOp simple
+SkOpSegment::markDone id=12 (1274,379.997498 3403.40015,379.997498) t=0 [23] (1274,379.997498) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
+bridgeOp current id=12 from=(3403.40015,379.997498) to=(1274,379.997498)
+SkOpSegment::findNextOp simple
+SkOpSegment::markDone id=15 (1274,380.002502 1274,379.997498) t=0 [29] (1274,380.002502) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
+bridgeOp current id=15 from=(1274,379.997498) to=(1274,380.002502)
+path.moveTo(3403.40015,379.997498);
+path.lineTo(1274,379.997498);
+SkOpSegment::markDone id=14 (3403.40015,380.002502 1274,380.002502) t=0 [27] (3403.40015,380.002502) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
+path.lineTo(1274,380.002502);
+SkOpSegment::debugShowActiveSpans id=16 (3403.39771,760 3403.39771,380) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=18 (3403.40259,380 3403.40259,760) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=1 (559.002686,551 559.002686,570) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=2 (559.002686,570 558.997681,570) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=3 (558.997681,570 558.997681,551) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=4 (558.997681,551 559.002686,551) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=5 (364,759.997498 3403.40015,759.997498) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=7 (3403.40015,760.002502 364,760.002502) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=8 (364,760.002502 364,759.997498) t=0 tEnd=1 windSum=? windValue=1
+SkOpSpan::sortableTop dir=kLeft seg=16 t=0.5 pt=(3403.39771,570)
+SkOpSpan::sortableTop [0] valid=0 operand=0 span=5 ccw=1 seg=3 {{{558.997681f, 570}, {558.997681f, 551}}} t=0 pt=(558.997681,570) slope=(0,0)
+SkOpSpan::sortableTop [1] valid=0 operand=0 span=-1 ccw=1 t=1 pt=(559.002686,570) slope=(0,0)
+SkOpSpan::sortableTop [2] valid=1 operand=1 span=31 ccw=1 seg=16 {{{3403.39771f, 760}, {3403.39771f, 380}}} t=0.5 pt=(3403.39771,570) slope=(0,-380)
+SkOpSpan::sortableTop dir=kLeft seg=18 t=0.5 pt=(3403.40259,570)
+SkOpSpan::sortableTop [0] valid=0 operand=0 span=5 ccw=1 seg=3 {{{558.997681f, 570}, {558.997681f, 551}}} t=0 pt=(558.997681,570) slope=(0,0)
+SkOpSpan::sortableTop [1] valid=0 operand=0 span=-1 ccw=1 t=1 pt=(559.002686,570) slope=(0,0)
+SkOpSpan::sortableTop [2] valid=1 operand=1 span=31 ccw=1 seg=16 {{{3403.39771f, 760}, {3403.39771f, 380}}} t=0.5 pt=(3403.39771,570) slope=(0,-380)
+SkOpSpan::sortableTop [3] valid=1 operand=1 span=35 ccw=0 seg=18 {{{3403.40259f, 380}, {3403.40259f, 760}}} t=0.5 pt=(3403.40259,570) slope=(0,380)
+SkOpSpan::sortableTop dir=kLeft seg=1 t=0.5 pt=(559.002686,560.5)
+SkOpSpan::sortableTop [0] valid=1 operand=0 span=5 ccw=1 seg=3 {{{558.997681f, 570}, {558.997681f, 551}}} t=0.5 pt=(558.997681,560.5) slope=(0,-19)
+SkOpSpan::sortableTop [1] valid=1 operand=0 span=1 ccw=0 seg=1 {{{559.002686f, 551}, {559.002686f, 570}}} t=0.5 pt=(559.002686,560.5) slope=(0,19)
+SkOpSegment::markWinding id=3 (558.997681,570 558.997681,551) t=0 [5] (558.997681,570) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
+SkOpSegment::markWinding id=4 (558.997681,551 559.002686,551) t=0 [7] (558.997681,551) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=? windSum=? windValue=1 oppValue=0
+SkOpSegment::markWinding id=1 (559.002686,551 559.002686,570) t=0 [1] (559.002686,551) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=? windSum=? windValue=1 oppValue=0
+SkOpSegment::markWinding id=2 (559.002686,570 558.997681,570) t=0 [3] (559.002686,570) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=? windSum=? windValue=1 oppValue=0
+SkOpSegment::markWinding id=3 (558.997681,570 558.997681,551) t=0 [5] (558.997681,570) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
+SkOpSegment::activeOp id=1 t=1 tEnd=0 op=union miFrom=0 miTo=1 suFrom=0 suTo=0 result=1
+SkOpSegment::findNextOp simple
+SkOpSegment::markDone id=1 (559.002686,551 559.002686,570) t=0 [1] (559.002686,551) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
+bridgeOp current id=1 from=(559.002686,570) to=(559.002686,551)
+SkOpSegment::findNextOp simple
+SkOpSegment::markDone id=4 (558.997681,551 559.002686,551) t=0 [7] (558.997681,551) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
+bridgeOp current id=4 from=(559.002686,551) to=(558.997681,551)
+path.moveTo(559.002686,570);
+path.lineTo(559.002686,551);
+SkOpSegment::findNextOp simple
+SkOpSegment::markDone id=3 (558.997681,570 558.997681,551) t=0 [5] (558.997681,570) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
+bridgeOp current id=3 from=(558.997681,551) to=(558.997681,570)
+path.lineTo(558.997681,551);
+SkOpSegment::findNextOp simple
+SkOpSegment::markDone id=2 (559.002686,570 558.997681,570) t=0 [3] (559.002686,570) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
+bridgeOp current id=2 from=(558.997681,570) to=(559.002686,570)
+path.lineTo(558.997681,570);
+path.lineTo(559.002686,570);
+path.close();
+SkOpSegment::debugShowActiveSpans id=16 (3403.39771,760 3403.39771,380) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=18 (3403.40259,380 3403.40259,760) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=5 (364,759.997498 3403.40015,759.997498) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=7 (3403.40015,760.002502 364,760.002502) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=8 (364,760.002502 364,759.997498) t=0 tEnd=1 windSum=? windValue=1
+SkOpSpan::sortableTop dir=kTop seg=16 t=0.5 pt=(3403.39771,570)
+SkOpSpan::sortableTop [0] valid=1 operand=1 span=23 ccw=1 seg=12 {{{1274, 379.997498f}, {3403.40015f, 379.997498f}}} t=0.999998853 pt=(3403.39771,379.997498) slope=(2129.40015,0)
+SkOpSpan::sortableTop [1] valid=1 operand=1 span=27 ccw=0 seg=14 {{{3403.40015f, 380.002502f}, {1274, 380.002502f}}} t=1.146523e-06 pt=(3403.39771,380.002502) slope=(-2129.40015,0)
+SkOpSpan::sortableTop [2] valid=1 operand=1 span=31 ccw=0 seg=16 {{{3403.39771f, 760}, {3403.39771f, 380}}} t=0.5 pt=(3403.39771,570) slope=(0,-380)
+SkOpSegment::markWinding id=16 (3403.39771,760 3403.39771,380) t=0 [31] (3403.39771,760) tEnd=1 newWindSum=1 newOppSum=0 oppSum=0 windSum=1 windValue=1 oppValue=0
+SkOpSegment::markWinding id=16 (3403.39771,760 3403.39771,380) t=0 [31] (3403.39771,760) tEnd=1 newWindSum=1 newOppSum=0 oppSum=0 windSum=1 windValue=1 oppValue=0
+SkOpSegment::activeOp id=16 t=1 tEnd=0 op=union miFrom=0 miTo=0 suFrom=1 suTo=0 result=1
+SkOpSegment::markDone id=16 (3403.39771,760 3403.39771,380) t=0 [31] (3403.39771,760) tEnd=1 newWindSum=1 newOppSum=0 oppSum=0 windSum=1 windValue=1 oppValue=0
+SkOpSegment::debugShowActiveSpans id=18 (3403.40259,380 3403.40259,760) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=5 (364,759.997498 3403.40015,759.997498) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=7 (3403.40015,760.002502 364,760.002502) t=0 tEnd=1 windSum=? windValue=1
+SkOpSegment::debugShowActiveSpans id=8 (364,760.002502 364,759.997498) t=0 tEnd=1 windSum=? windValue=1
+SkOpSpan::sortableTop dir=kTop seg=18 t=0.5 pt=(3403.40259,570)
+SkOpSpan::sortableTop [0] valid=0 operand=0 span=-1 ccw=0 t=1 pt=(3403.40259,380) slope=(0,0)
+SkOpSpan::sortableTop [1] valid=1 operand=1 span=35 ccw=0 seg=18 {{{3403.40259f, 380}, {3403.40259f, 760}}} t=0.5 pt=(3403.40259,570) slope=(0,380)
+SkOpSpan::sortableTop dir=kTop seg=5 t=0.5 pt=(1883.70007,759.997498)
+SkOpSpan::sortableTop [0] valid=1 operand=1 span=23 ccw=1 seg=12 {{{1274, 379.997498f}, {3403.40015f, 379.997498f}}} t=0.286324801 pt=(1883.70007,379.997498) slope=(2129.40015,0)
+SkOpSpan::sortableTop [1] valid=1 operand=1 span=27 ccw=0 seg=14 {{{3403.40015f, 380.002502f}, {1274, 380.002502f}}} t=0.713675199 pt=(1883.70007,380.002502) slope=(-2129.40015,0)
+SkOpSpan::sortableTop [2] valid=1 operand=1 span=9 ccw=1 seg=5 {{{364, 759.997498f}, {3403.40015f, 759.997498f}}} t=0.5 pt=(1883.70007,759.997498) slope=(3039.40015,0)
+SkOpSegment::markWinding id=5 (364,759.997498 3403.40015,759.997498) t=0 [9] (364,759.997498) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
+SkOpSegment::markWinding id=5 (364,759.997498 3403.40015,759.997498) t=0 [9] (364,759.997498) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
+SkOpSegment::markWinding id=8 (364,760.002502 364,759.997498) t=0 [15] (364,760.002502) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=? windSum=? windValue=1 oppValue=0
+SkOpSegment::markWinding id=7 (3403.40015,760.002502 364,760.002502) t=0 [13] (3403.40015,760.002502) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=? windSum=? windValue=1 oppValue=0
+SkOpSegment::activeOp id=5 t=1 tEnd=0 op=union miFrom=0 miTo=0 suFrom=0 suTo=1 result=1
+SkOpSegment::findNextOp simple
+SkOpSegment::markDone id=5 (364,759.997498 3403.40015,759.997498) t=0 [9] (364,759.997498) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
+bridgeOp current id=5 from=(3403.40015,759.997498) to=(364,759.997498)
+SkOpSegment::findNextOp simple
+SkOpSegment::markDone id=8 (364,760.002502 364,759.997498) t=0 [15] (364,760.002502) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
+bridgeOp current id=8 from=(364,759.997498) to=(364,760.002502)
+path.moveTo(3403.40015,759.997498);
+path.lineTo(364,759.997498);
+SkOpSegment::markDone id=7 (3403.40015,760.002502 364,760.002502) t=0 [13] (3403.40015,760.002502) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
+path.lineTo(364,760.002502);
+SkOpSegment::debugShowActiveSpans id=18 (3403.40259,380 3403.40259,760) t=0 tEnd=1 windSum=? windValue=1
+SkOpSpan::sortableTop dir=kLeft seg=18 t=0.25 pt=(3403.40259,475)
+SkOpSpan::sortableTop [0] valid=1 operand=1 span=31 ccw=1 seg=16 {{{3403.39771f, 760}, {3403.39771f, 380}}} t=0.75 pt=(3403.39771,475) slope=(0,-380)
+SkOpSpan::sortableTop [1] valid=1 operand=1 span=35 ccw=0 seg=18 {{{3403.40259f, 380}, {3403.40259f, 760}}} t=0.25 pt=(3403.40259,475) slope=(0,380)
+SkOpSegment::markWinding id=18 (3403.40259,380 3403.40259,760) t=0 [35] (3403.40259,380) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
+SkOpSegment::markWinding id=18 (3403.40259,380 3403.40259,760) t=0 [35] (3403.40259,380) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
+SkOpSegment::activeOp id=18 t=1 tEnd=0 op=union miFrom=0 miTo=0 suFrom=0 suTo=1 result=1
+SkOpSegment::markDone id=18 (3403.40259,380 3403.40259,760) t=0 [35] (3403.40259,380) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
+</div>
+
</div>
<script type="text/javascript">
var testDivs = [
+ filinmangust14,
halbug,
];