aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkScan_Path.cpp
diff options
context:
space:
mode:
authorGravatar reed <reed@chromium.org>2015-02-06 21:08:33 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-02-06 21:08:33 -0800
commit0692c5f2c1df7d1b66c62025200dd666f9ecd311 (patch)
treed19705f00b81f38bb5f47f14a3e3e411a5a1283c /src/core/SkScan_Path.cpp
parent2322115952c15c72a623837879cac1f85894b1b6 (diff)
Revert of Faster edge re-sort, drop trailing edges (patchset #2 id:20001 of https://codereview.chromium.org/907623002/)
Reason for revert: still layout failures Original issue's description: > Faster edge re-sort, drop trailing edges > > (patchset #4 id:60001 of https://codereview.chromium.org/891613003/)" > > This reverts commit c319d075eab86cacfd7aba27859b72bbf8fc0a64. > > BUG=skia: > TBR= > > Committed: https://skia.googlesource.com/skia/+/2322115952c15c72a623837879cac1f85894b1b6 TBR= NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=skia: Review URL: https://codereview.chromium.org/886503010
Diffstat (limited to 'src/core/SkScan_Path.cpp')
-rw-r--r--src/core/SkScan_Path.cpp62
1 files changed, 28 insertions, 34 deletions
diff --git a/src/core/SkScan_Path.cpp b/src/core/SkScan_Path.cpp
index 430cd1d841..5d9e0ca2a6 100644
--- a/src/core/SkScan_Path.cpp
+++ b/src/core/SkScan_Path.cpp
@@ -45,23 +45,34 @@ static inline void remove_edge(SkEdge* edge) {
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 @@ typedef void (*PrePostProc)(SkBlitter* blitter, int y, bool isStartOfScanline);
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 @@ static void walk_edges(SkEdge* prevHead, SkPath::FillType fillType,
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
}
@@ -427,15 +430,13 @@ static SkEdge* sort_edges(SkEdge* list[], int count, SkEdge** last) {
// clipRect (if no null) has already been shifted up
//
void sk_fill_path(const SkPath& path, const SkIRect* clipRect, SkBlitter* blitter,
- int start_y, int stop_y, int shiftEdgesUp, const SkRegion& clipRgn) {
+ int start_y, int stop_y, int shiftEdgesUp,
+ const SkRegion& clipRgn) {
SkASSERT(blitter);
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) {
@@ -502,14 +503,7 @@ void sk_fill_path(const SkPath& path, const SkIRect* clipRect, SkBlitter* blitte
if (path.isConvex() && (NULL == proc)) {
walk_convex_edges(&headEdge, path.getFillType(), blitter, start_y, stop_y, NULL);
} else {
- int rightEdge;
- if (clipRect) {
- rightEdge = clipRect->right();
- } else {
- rightEdge = SkScalarRoundToInt(path.getBounds().right()) << shiftEdgesUp;
- }
-
- walk_edges(&headEdge, path.getFillType(), blitter, start_y, stop_y, proc, rightEdge);
+ walk_edges(&headEdge, path.getFillType(), blitter, start_y, stop_y, proc);
}
}