| 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
|
|
|