micro simplification/speed-up to walk_edges

- quads (conics) are more common than cubics, so check that first
- don't need to track in_internval, so remove it

Don't expect any pixel differences

Bug: skia:
Change-Id: I6a6ce3f8a0b260da66ba27bb0b0d578fb8478cea
Reviewed-on: https://skia-review.googlesource.com/c/175590
Reviewed-by: Mike Klein <mtklein@google.com>
Commit-Queue: Mike Reed <reed@google.com>
This commit is contained in:
Mike Reed 2018-12-07 13:33:21 -05:00 committed by Skia Commit-Bot
parent 96765960dc
commit 581d637371

View File

@ -109,7 +109,6 @@ static void walk_edges(SkEdge* prevHead, SkPath::FillType fillType,
for (;;) {
int w = 0;
int left SK_INIT_TO_AVOID_WARNING;
bool in_interval = false;
SkEdge* currE = prevHead->fNext;
SkFixed prevX = prevHead->fX;
@ -123,32 +122,34 @@ static void walk_edges(SkEdge* prevHead, SkPath::FillType fillType,
SkASSERT(currE->fLastY >= curr_y);
int x = SkFixedRoundToInt(currE->fX);
if ((w & windingMask) == 0) { // we're starting interval
left = x;
}
w += currE->fWinding;
if ((w & windingMask) == 0) { // we finished an interval
SkASSERT(in_interval);
int width = x - left;
SkASSERT(width >= 0);
if (width)
if (width > 0) {
blitter->blitH(left, curr_y, width);
in_interval = false;
} else if (!in_interval) {
left = x;
in_interval = true;
}
}
SkEdge* next = currE->fNext;
SkFixed newX;
if (currE->fLastY == curr_y) { // are we done with this edge?
if (currE->fCurveCount < 0) {
if (((SkCubicEdge*)currE)->updateCubic()) {
SkASSERT(currE->fFirstY == curr_y + 1);
if (currE->fCurveCount > 0) {
if (((SkQuadraticEdge*)currE)->updateQuadratic()) {
newX = currE->fX;
goto NEXT_X;
}
} else if (currE->fCurveCount > 0) {
if (((SkQuadraticEdge*)currE)->updateQuadratic()) {
} else if (currE->fCurveCount < 0) {
if (((SkCubicEdge*)currE)->updateCubic()) {
SkASSERT(currE->fFirstY == curr_y + 1);
newX = currE->fX;
goto NEXT_X;
}
@ -169,8 +170,7 @@ static void walk_edges(SkEdge* prevHead, SkPath::FillType fillType,
SkASSERT(currE);
}
// was our right-edge culled away?
if (in_interval) {
if ((w & windingMask) != 0) { // was our right-edge culled away?
int width = rightClip - left;
if (width > 0) {
blitter->blitH(left, curr_y, width);
@ -219,14 +219,9 @@ static void walk_convex_edges(SkEdge* prevHead, SkPath::FillType,
SkEdge* riteE = leftE->fNext;
SkEdge* currE = riteE->fNext;
#if 0
int local_top = leftE->fFirstY;
SkASSERT(local_top == riteE->fFirstY);
#else
// our edge choppers for curves can result in the initial edges
// not lining up, so we take the max.
int local_top = SkMax32(leftE->fFirstY, riteE->fFirstY);
#endif
SkASSERT(local_top >= start_y);
for (;;) {