From a33b43d796f03e2f4b5abd8060272f4f775d7390 Mon Sep 17 00:00:00 2001 From: Yuqian Li Date: Fri, 17 Mar 2017 11:26:29 -0400 Subject: Combine some duplicate code in AA using template BUG=skia: Change-Id: Id048425e8199167feba0268f89f526bbf5b7242b Reviewed-on: https://skia-review.googlesource.com/9832 Reviewed-by: Cary Clark Commit-Queue: Yuqian Li --- src/core/SkScanPriv.h | 39 +++++++++++++++++++++++++++++++++++++++ src/core/SkScan_AAAPath.cpp | 31 ------------------------------- src/core/SkScan_Path.cpp | 38 +------------------------------------- 3 files changed, 40 insertions(+), 68 deletions(-) (limited to 'src/core') diff --git a/src/core/SkScanPriv.h b/src/core/SkScanPriv.h index 606929dcdd..eca3c9c67e 100644 --- a/src/core/SkScanPriv.h +++ b/src/core/SkScanPriv.h @@ -38,4 +38,43 @@ void sk_fill_path(const SkPath& path, const SkIRect& clipRect, void sk_blit_above(SkBlitter*, const SkIRect& avoid, const SkRegion& clip); void sk_blit_below(SkBlitter*, const SkIRect& avoid, const SkRegion& clip); +template +static inline void remove_edge(EdgeType* edge) { + edge->fPrev->fNext = edge->fNext; + edge->fNext->fPrev = edge->fPrev; +} + +template +static inline void insert_edge_after(EdgeType* edge, EdgeType* afterMe) { + edge->fPrev = afterMe; + edge->fNext = afterMe->fNext; + afterMe->fNext->fPrev = edge; + afterMe->fNext = edge; +} + +template +static void backward_insert_edge_based_on_x(EdgeType* edge) { + SkFixed x = edge->fX; + EdgeType* prev = edge->fPrev; + while (prev->fPrev && prev->fX > x) { + prev = prev->fPrev; + } + if (prev->fNext != edge) { + remove_edge(edge); + insert_edge_after(edge, prev); + } +} + +// 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. +template +static EdgeType* backward_insert_start(EdgeType* prev, SkFixed x) { + while (prev->fPrev && prev->fX > x) { + prev = prev->fPrev; + } + return prev; +} + #endif diff --git a/src/core/SkScan_AAAPath.cpp b/src/core/SkScan_AAAPath.cpp index 634a82661c..499408a3e1 100644 --- a/src/core/SkScan_AAAPath.cpp +++ b/src/core/SkScan_AAAPath.cpp @@ -1232,37 +1232,6 @@ END_WALK: /////////////////////////////////////////////////////////////////////////////// -static inline void remove_edge(SkAnalyticEdge* edge) { - edge->fPrev->fNext = edge->fNext; - edge->fNext->fPrev = edge->fPrev; -} - -static inline void insert_edge_after(SkAnalyticEdge* edge, SkAnalyticEdge* afterMe) { - edge->fPrev = afterMe; - edge->fNext = afterMe->fNext; - afterMe->fNext->fPrev = edge; - afterMe->fNext = edge; -} - -static void backward_insert_edge_based_on_x(SkAnalyticEdge* edge) { - SkFixed x = edge->fX; - SkAnalyticEdge* prev = edge->fPrev; - while (prev->fPrev && prev->fX > x) { - prev = prev->fPrev; - } - if (prev->fNext != edge) { - remove_edge(edge); - insert_edge_after(edge, prev); - } -} - -static SkAnalyticEdge* backward_insert_start(SkAnalyticEdge* prev, SkFixed x) { - while (prev->fPrev && prev->fX > x) { - prev = prev->fPrev; - } - return prev; -} - static inline void updateNextNextY(SkFixed y, SkFixed nextY, SkFixed* nextNextY) { *nextNextY = y > nextY && y < *nextNextY ? y : *nextNextY; } diff --git a/src/core/SkScan_Path.cpp b/src/core/SkScan_Path.cpp index 9f81eac1d5..11f9c403c8 100644 --- a/src/core/SkScan_Path.cpp +++ b/src/core/SkScan_Path.cpp @@ -36,42 +36,6 @@ #define validate_sort(edge) #endif -static inline void remove_edge(SkEdge* edge) { - edge->fPrev->fNext = edge->fNext; - 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 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); - } -} - -// 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; -} - static void insert_new_edges(SkEdge* newEdge, int curr_y) { if (newEdge->fFirstY != curr_y) { return; @@ -191,7 +155,7 @@ static void walk_edges(SkEdge* prevHead, SkPath::FillType fillType, currE->fX = newX; NEXT_X: if (newX < prevX) { // ripple currE backwards until it is x-sorted - backward_insert_edge_based_on_x(currE SkPARAM(curr_y)); + backward_insert_edge_based_on_x(currE); } else { prevX = newX; } -- cgit v1.2.3