| Index: src/core/SkPath.cpp | 
| diff --git a/src/core/SkPath.cpp b/src/core/SkPath.cpp | 
| index 50789b42eb657f4b4f69cac9e023ee142a37d078..64d3c0d36ed4a2fd4fc95e8f3eb79af415d46f2f 100644 | 
| --- a/src/core/SkPath.cpp | 
| +++ b/src/core/SkPath.cpp | 
| @@ -3292,81 +3292,52 @@ bool SkPathPriv::IsSimpleClosedRect(const SkPath& path, SkRect* rect, SkPath::Di | 
| if (rectPts[0] != rectPts[4]) { | 
| return false; | 
| } | 
| -    int verticalCnt = 0; | 
| -    int horizontalCnt = 0; | 
| -    // dirs are 0 - right, 1 - down, 2 - left, 3 - up. | 
| -    int firstDir = 0; | 
| -    int secondDir = 0; | 
| -    SkRect tempRect; | 
| -    for (int i = 0; i < 4; ++i) { | 
| -        int sameCnt = 0; | 
| -        if (rectPts[i].fX == rectPts[i + 1].fX) { | 
| -            verticalCnt += 1; | 
| -            sameCnt = 1; | 
| -            if (0 == i) { | 
| -                if (rectPts[1].fY > rectPts[0].fY) { | 
| -                    firstDir = 1; | 
| -                    tempRect.fTop = rectPts[0].fY; | 
| -                    tempRect.fBottom = rectPts[1].fY; | 
| -                } else { | 
| -                    firstDir = 3; | 
| -                    tempRect.fTop = rectPts[1].fY; | 
| -                    tempRect.fBottom = rectPts[0].fY; | 
| -                } | 
| -            } else if (1 == i) { | 
| -                if (rectPts[2].fY > rectPts[1].fY) { | 
| -                    secondDir = 1; | 
| -                    tempRect.fTop = rectPts[1].fY; | 
| -                    tempRect.fBottom = rectPts[2].fY; | 
| -                } else { | 
| -                    secondDir = 3; | 
| -                    tempRect.fTop = rectPts[2].fY; | 
| -                    tempRect.fBottom = rectPts[1].fY; | 
| -                } | 
| -            } | 
| -        } | 
| -        if (rectPts[i].fY == rectPts[i + 1].fY) { | 
| -            horizontalCnt += 1; | 
| -            sameCnt += 1; | 
| -            if (0 == i) { | 
| -                if (rectPts[1].fX > rectPts[0].fX) { | 
| -                    firstDir = 0; | 
| -                    tempRect.fLeft = rectPts[0].fX; | 
| -                    tempRect.fRight = rectPts[1].fX; | 
| -                } else { | 
| -                    firstDir = 2; | 
| -                    tempRect.fLeft = rectPts[1].fX; | 
| -                    tempRect.fRight = rectPts[0].fX; | 
| -                } | 
| -            } else if (1 == i) { | 
| -                if (rectPts[2].fX > rectPts[1].fX) { | 
| -                    secondDir = 0; | 
| -                    tempRect.fLeft = rectPts[1].fX; | 
| -                    tempRect.fRight = rectPts[2].fX; | 
| -                } else { | 
| -                    secondDir = 2; | 
| -                    tempRect.fLeft = rectPts[2].fX; | 
| -                    tempRect.fRight = rectPts[1].fX; | 
| -                } | 
| -            } | 
| +    // Check for two cases of rectangles: pts 0 and 3 form a vertical edge or a horizontal edge ( | 
| +    // and pts 1 and 2 the opposite vertical or horizontal edge). | 
| +    bool vec03IsVertical; | 
| +    if (rectPts[0].fX == rectPts[3].fX && rectPts[1].fX == rectPts[2].fX && | 
| +        rectPts[0].fY == rectPts[1].fY && rectPts[3].fY == rectPts[2].fY) { | 
| +        // Make sure it has non-zero width and height | 
| +        if (rectPts[0].fX == rectPts[1].fX || rectPts[0].fY == rectPts[3].fY) { | 
| +            return false; | 
| } | 
| -        if (sameCnt != 1) { | 
| +        vec03IsVertical = true; | 
| +    } else if (rectPts[0].fY == rectPts[3].fY && rectPts[1].fY == rectPts[2].fY && | 
| +               rectPts[0].fX == rectPts[1].fX && rectPts[3].fX == rectPts[2].fX) { | 
| +        // Make sure it has non-zero width and height | 
| +        if (rectPts[0].fY == rectPts[1].fY || rectPts[0].fX == rectPts[3].fX) { | 
| return false; | 
| } | 
| -    } | 
| -    if (2 != horizontalCnt || 2 != verticalCnt) { | 
| +        vec03IsVertical = false; | 
| +    } else { | 
| return false; | 
| } | 
| -    // low bit indicates a vertical dir | 
| -    SkASSERT((firstDir ^ secondDir) & 0b1); | 
| -    if (((firstDir + 1) & 0b11) == secondDir) { | 
| -        *direction = SkPath::kCW_Direction; | 
| -        *start = firstDir; | 
| -    } else { | 
| -        SkASSERT(((secondDir + 1) & 0b11) == firstDir); | 
| -        *direction = SkPath::kCCW_Direction; | 
| -        *start = secondDir; | 
| +    // Set sortFlags so that it has the low bit set if pt index 0 is on right edge and second bit | 
| +    // set if it is on the bottom edge. | 
| +    unsigned sortFlags = | 
| +            ((rectPts[0].fX < rectPts[2].fX) ? 0b00 : 0b01) | | 
| +            ((rectPts[0].fY < rectPts[2].fY) ? 0b00 : 0b10); | 
| +    switch (sortFlags) { | 
| +        case 0b00: | 
| +            rect->set(rectPts[0].fX, rectPts[0].fY, rectPts[2].fX, rectPts[2].fY); | 
| +            *direction = vec03IsVertical ? SkPath::kCW_Direction : SkPath::kCCW_Direction; | 
| +            *start = 0; | 
| +            break; | 
| +        case 0b01: | 
| +            rect->set(rectPts[2].fX, rectPts[0].fY, rectPts[0].fX, rectPts[2].fY); | 
| +            *direction = vec03IsVertical ? SkPath::kCCW_Direction : SkPath::kCW_Direction; | 
| +            *start = 1; | 
| +            break; | 
| +        case 0b10: | 
| +            rect->set(rectPts[0].fX, rectPts[2].fY, rectPts[2].fX, rectPts[0].fY); | 
| +            *direction = vec03IsVertical ? SkPath::kCCW_Direction : SkPath::kCW_Direction; | 
| +            *start = 3; | 
| +            break; | 
| +        case 0b11: | 
| +            rect->set(rectPts[2].fX, rectPts[2].fY, rectPts[0].fX, rectPts[0].fY); | 
| +            *direction = vec03IsVertical ? SkPath::kCW_Direction : SkPath::kCCW_Direction; | 
| +            *start = 2; | 
| +            break; | 
| } | 
| -    *rect = tempRect; | 
| return true; | 
| } | 
|  |