Enabling the canvas bit to turn the clip stack into a flat replace exposed around 100 failures when testing the 800K skp set generated from the top 1M web sites.

This fixes all but one of those failures.

Major changes include:
- Replace angle indices with angle pointers. This was motivated by the need to add angles later but not renumber existing angles.
- Aggressive segment chase. When the winding is known on a segment, more aggressively passing that winding to adjacent segments allows fragmented data sets to succeed.
- Line segments with ends nearly the same are treated as coincident first.
- Transfer partial coincidence by observing that if segment A is partially coincident to B and C then B and C may be partially coincident.

TBR=reed

Author: caryclark@google.com

Review URL: https://codereview.chromium.org/272153002
diff --git a/src/pathops/SkOpSpan.h b/src/pathops/SkOpSpan.h
index 1ffdc0e..d9ce44e 100644
--- a/src/pathops/SkOpSpan.h
+++ b/src/pathops/SkOpSpan.h
@@ -9,23 +9,27 @@
 
 #include "SkPoint.h"
 
+class SkOpAngle;
 class SkOpSegment;
 
 struct SkOpSpan {
-    SkOpSegment* fOther;
     SkPoint fPt;  // computed when the curves are intersected
     double fT;
     double fOtherT;  // value at fOther[fOtherIndex].fT
+    SkOpSegment* fOther;
+    SkOpAngle* fFromAngle;  // (if t > 0) index into segment's angle array going negative in t
+    SkOpAngle* fToAngle;  // (if t < 1) index into segment's angle array going positive in t
     int fOtherIndex;  // can't be used during intersection
-    int fFromAngleIndex;  // (if t > 0) index into segment's angle array going negative in t
-    int fToAngleIndex;  // (if t < 1) index into segment's angle array going positive in t
     int fWindSum;  // accumulated from contours surrounding this one.
     int fOppSum;  // for binary operators: the opposite winding sum
     int fWindValue;  // 0 == canceled; 1 == normal; >1 == coincident
     int fOppValue;  // normally 0 -- when binary coincident edges combine, opp value goes here
     bool fChased;  // set after span has been added to chase array
+    bool fCoincident;  // set if span is bumped -- if set additional points aren't inserted
     bool fDone;  // if set, this span to next higher T has been processed
     bool fLoop;  // set when a cubic loops back to this point
+    bool fMultiple;  // set if this is one of mutiple spans with identical t and pt values
+    bool fNear;  // set if opposite end point is near but not equal to this one
     bool fSmall;   // if set, consecutive points are almost equal
     bool fTiny;  // if set, consecutive points are equal but consecutive ts are not precisely equal