Revert of faster edge re-sort, drop trailing edges (patchset #4 id:60001 of https://codereview.chromium.org/891613003/)

Reason for revert:
may be breaking layouttests...

Original issue's description:
> faster edge re-sort, drop trailing edges
>
> 1. drop edges that are wholly on the right (in the non-convex walker)
> 2. scan and swap once, instead of swapping as we go during re-sort
>
> BUG=skia:
>
> Committed: https://skia.googlesource.com/skia/+/38f1c00772539dcbeccbfa3c45d94bdc4acf3518

TBR=caryclark@google.com,reed@google.com
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=skia:

Review URL: https://codereview.chromium.org/910493002
diff --git a/src/core/SkEdgeBuilder.cpp b/src/core/SkEdgeBuilder.cpp
index 0081120..8dcc47a 100644
--- a/src/core/SkEdgeBuilder.cpp
+++ b/src/core/SkEdgeBuilder.cpp
@@ -79,8 +79,8 @@
              SkIntToScalar(src.fBottom >> shift));
 }
 
-int SkEdgeBuilder::buildPoly(const SkPath& path, const SkIRect* iclip, int shiftUp,
-                             bool clipToTheRight) {
+int SkEdgeBuilder::buildPoly(const SkPath& path, const SkIRect* iclip,
+                             int shiftUp) {
     SkPath::Iter    iter(path, true);
     SkPoint         pts[4];
     SkPath::Verb    verb;
@@ -115,7 +115,7 @@
                     break;
                 case SkPath::kLine_Verb: {
                     SkPoint lines[SkLineClipper::kMaxPoints];
-                    int lineCount = SkLineClipper::ClipLine(pts, clip, lines, clipToTheRight);
+                    int lineCount = SkLineClipper::ClipLine(pts, clip, lines);
                     SkASSERT(lineCount <= SkLineClipper::kMaxClippedLineSegments);
                     for (int i = 0; i < lineCount; i++) {
                         if (edge->setLine(lines[i], lines[i + 1], shiftUp)) {
@@ -161,14 +161,14 @@
     }
 }
 
-int SkEdgeBuilder::build(const SkPath& path, const SkIRect* iclip, int shiftUp,
-                         bool clipToTheRight) {
+int SkEdgeBuilder::build(const SkPath& path, const SkIRect* iclip,
+                         int shiftUp) {
     fAlloc.reset();
     fList.reset();
     fShiftUp = shiftUp;
 
     if (SkPath::kLine_SegmentMask == path.getSegmentMasks()) {
-        return this->buildPoly(path, iclip, shiftUp, clipToTheRight);
+        return this->buildPoly(path, iclip, shiftUp);
     }
 
     SkAutoConicToQuads quadder;
@@ -192,7 +192,7 @@
                     break;
                 case SkPath::kLine_Verb: {
                     SkPoint lines[SkLineClipper::kMaxPoints];
-                    int lineCount = SkLineClipper::ClipLine(pts, clip, lines, clipToTheRight);
+                    int lineCount = SkLineClipper::ClipLine(pts, clip, lines);
                     for (int i = 0; i < lineCount; i++) {
                         this->addLine(&lines[i]);
                     }
diff --git a/src/core/SkEdgeBuilder.h b/src/core/SkEdgeBuilder.h
index 625465b..f9e5976 100644
--- a/src/core/SkEdgeBuilder.h
+++ b/src/core/SkEdgeBuilder.h
@@ -22,7 +22,7 @@
 
     // returns the number of built edges. The array of those edge pointers
     // is returned from edgeList().
-    int build(const SkPath& path, const SkIRect* clip, int shiftUp, bool clipToTheRight);
+    int build(const SkPath& path, const SkIRect* clip, int shiftUp);
 
     SkEdge** edgeList() { return fEdgeList; }
 
@@ -36,9 +36,9 @@
      *  empty, as we will have preallocated room for the pointers in fAlloc's
      *  block, and fEdgeList will point into that.
      */
-    SkEdge**    fEdgeList;
+    SkEdge**            fEdgeList;
 
-    int         fShiftUp;
+    int                 fShiftUp;
 
 public:
     void addLine(const SkPoint pts[]);
@@ -46,7 +46,7 @@
     void addCubic(const SkPoint pts[]);
     void addClipper(SkEdgeClipper*);
 
-    int buildPoly(const SkPath& path, const SkIRect* clip, int shiftUp, bool clipToTheRight);
+    int buildPoly(const SkPath& path, const SkIRect* clip, int shiftUp);
 };
 
 #endif
diff --git a/src/core/SkLineClipper.cpp b/src/core/SkLineClipper.cpp
index 9d72ea5..1645917 100644
--- a/src/core/SkLineClipper.cpp
+++ b/src/core/SkLineClipper.cpp
@@ -173,7 +173,7 @@
 #endif
 
 int SkLineClipper::ClipLine(const SkPoint pts[], const SkRect& clip,
-                            SkPoint lines[], bool canClipToTheRight) {
+                            SkPoint lines[]) {
 #ifdef SK_DEBUG
     {
         static bool gOnce;
@@ -241,9 +241,6 @@
         result = tmp;
         reverse = false;
     } else if (tmp[index0].fX >= clip.fRight) {    // wholly to the right
-        if (canClipToTheRight) {
-            return 0;
-        }
         tmp[0].fX = tmp[1].fX = clip.fRight;
         result = tmp;
         reverse = false;
diff --git a/src/core/SkLineClipper.h b/src/core/SkLineClipper.h
index d966dbc..8026890 100644
--- a/src/core/SkLineClipper.h
+++ b/src/core/SkLineClipper.h
@@ -30,7 +30,7 @@
             3rd segment: lines[2]..lines[3]
      */
     static int ClipLine(const SkPoint pts[2], const SkRect& clip,
-                        SkPoint lines[kMaxPoints], bool canClipToTheRight);
+                        SkPoint lines[kMaxPoints]);
 
     /*  Intersect the line segment against the rect. If there is a non-empty
         resulting segment, return true and set dst[] to that segment. If not,
diff --git a/src/core/SkScan_Path.cpp b/src/core/SkScan_Path.cpp
index bf56aca..5d9e0ca 100644
--- a/src/core/SkScan_Path.cpp
+++ b/src/core/SkScan_Path.cpp
@@ -45,23 +45,34 @@
     edge->fNext->fPrev = edge->fPrev;
 }
 
-static inline void insert_edge_after(SkEdge* edge, SkEdge* afterMe) {
-    edge->fPrev = afterMe;
-    edge->fNext = afterMe->fNext;
-    afterMe->fNext->fPrev = edge;
-    afterMe->fNext = edge;
+static inline void swap_edges(SkEdge* prev, SkEdge* next) {
+    SkASSERT(prev->fNext == next && next->fPrev == prev);
+
+    // remove prev from the list
+    prev->fPrev->fNext = next;
+    next->fPrev = prev->fPrev;
+
+    // insert prev after next
+    prev->fNext = next->fNext;
+    next->fNext->fPrev = prev;
+    next->fNext = prev;
+    prev->fPrev = next;
 }
 
 static void backward_insert_edge_based_on_x(SkEdge* edge SkDECLAREPARAM(int, curr_y)) {
     SkFixed x = edge->fX;
 
-    SkEdge* prev = edge->fPrev;
-    while (prev->fX > x) {
-        prev = prev->fPrev;
-    }
-    if (prev->fNext != edge) {
-        remove_edge(edge);
-        insert_edge_after(edge, prev);
+    for (;;) {
+        SkEdge* prev = edge->fPrev;
+
+        // add 1 to curr_y since we may have added new edges (built from curves)
+        // that start on the next scanline
+        SkASSERT(prev && prev->fFirstY <= curr_y + 1);
+
+        if (prev->fX <= x) {
+            break;
+        }
+        swap_edges(prev, edge);
     }
 }
 
@@ -102,7 +113,7 @@
 
 static void walk_edges(SkEdge* prevHead, SkPath::FillType fillType,
                        SkBlitter* blitter, int start_y, int stop_y,
-                       PrePostProc proc, int rightClip) {
+                       PrePostProc proc) {
     validate_sort(prevHead->fNext);
 
     int curr_y = start_y;
@@ -172,14 +183,6 @@
             SkASSERT(currE);
         }
 
-        // was our right-edge culled away?
-        if (in_interval) {
-            int width = rightClip - left;
-            if (width > 0) {
-                blitter->blitH(left, curr_y, width);
-            }
-        }
-
         if (proc) {
             proc(blitter, curr_y, PREPOST_END);    // post-proc
         }
@@ -433,10 +436,7 @@
 
     SkEdgeBuilder   builder;
 
-    // If we're convex, then we need both edges, even the right edge is past the clip
-    const bool cullToTheRight = !path.isConvex();
-
-    int count = builder.build(path, clipRect, shiftEdgesUp, cullToTheRight);
+    int count = builder.build(path, clipRect, shiftEdgesUp);
     SkEdge**    list = builder.edgeList();
 
     if (count < 2) {
@@ -500,17 +500,10 @@
         proc = PrePostInverseBlitterProc;
     }
 
-    int rightEdge;
-    if (clipRect) {
-        rightEdge = clipRect->right();
-    } else {
-        rightEdge = SkScalarRoundToInt(path.getBounds().right());
-    }
-
     if (path.isConvex() && (NULL == proc)) {
         walk_convex_edges(&headEdge, path.getFillType(), blitter, start_y, stop_y, NULL);
     } else {
-        walk_edges(&headEdge, path.getFillType(), blitter, start_y, stop_y, proc, rightEdge);
+        walk_edges(&headEdge, path.getFillType(), blitter, start_y, stop_y, proc);
     }
 }