| Index: src/core/SkScan_Path.cpp | 
| diff --git a/src/core/SkScan_Path.cpp b/src/core/SkScan_Path.cpp | 
| index 804148db360c4d93e2dfb7aae4c45e967940c120..077d9a0a24da321d53ac0f7ed1e98045d8af91fb 100644 | 
| --- a/src/core/SkScan_Path.cpp | 
| +++ b/src/core/SkScan_Path.cpp | 
| @@ -61,7 +61,21 @@ static void backward_insert_edge_based_on_x(SkEdge* edge SkDECLAREPARAM(int, cur | 
| } | 
| } | 
|  | 
| +#ifndef SK_SUPPORT_LEGACY_INSERT_NEW_EDGES | 
| +// Start from the right side, searching backwards for the point to begin the new edge list | 
| +// insertion, marching forwards from here. The implementation could have started from the left | 
| +// of the prior insertion, and search to the right, or with some additional caching, binary | 
| +// search the starting point. More work could be done to determine optimal new edge insertion. | 
| +static SkEdge* backward_insert_start(SkEdge* prev, SkFixed x) { | 
| +    while (prev->fX > x) { | 
| +        prev = prev->fPrev; | 
| +    } | 
| +    return prev; | 
| +} | 
| +#endif | 
| + | 
| static void insert_new_edges(SkEdge* newEdge, int curr_y) { | 
| +#ifdef SK_SUPPORT_LEGACY_INSERT_NEW_EDGES | 
| SkASSERT(newEdge->fFirstY >= curr_y); | 
|  | 
| while (newEdge->fFirstY == curr_y) { | 
| @@ -69,6 +83,36 @@ static void insert_new_edges(SkEdge* newEdge, int curr_y) { | 
| backward_insert_edge_based_on_x(newEdge  SkPARAM(curr_y)); | 
| newEdge = next; | 
| } | 
| +#else | 
| +    if (newEdge->fFirstY != curr_y) { | 
| +        return; | 
| +    } | 
| +    SkEdge* prev = newEdge->fPrev; | 
| +    if (prev->fX <= newEdge->fX) { | 
| +        return; | 
| +    } | 
| +    // find first x pos to insert | 
| +    SkEdge* start = backward_insert_start(prev, newEdge->fX); | 
| +    // insert the lot, fixing up the links as we go | 
| +    do { | 
| +        SkEdge* next = newEdge->fNext; | 
| +        do { | 
| +            if (start->fNext == newEdge) { | 
| +                goto nextEdge; | 
| +            } | 
| +            SkEdge* after = start->fNext; | 
| +            if (after->fX >= newEdge->fX) { | 
| +                break; | 
| +            } | 
| +            start = after; | 
| +        } while (true); | 
| +        remove_edge(newEdge); | 
| +        insert_edge_after(newEdge, start); | 
| +nextEdge: | 
| +        start = newEdge; | 
| +        newEdge = next; | 
| +    } while (newEdge->fFirstY == curr_y); | 
| +#endif | 
| } | 
|  | 
| #ifdef SK_DEBUG | 
|  |