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>
diff --git a/tools/pathops_visualizer.htm b/tools/pathops_visualizer.htm
index 246a29b..4c8d52f 100644
--- a/tools/pathops_visualizer.htm
+++ b/tools/pathops_visualizer.htm
@@ -185,11 +185,360 @@
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,
];