diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkPath.cpp | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/core/SkPath.cpp b/src/core/SkPath.cpp index 0ff5edf109..ff4208a346 100644 --- a/src/core/SkPath.cpp +++ b/src/core/SkPath.cpp @@ -450,6 +450,7 @@ static int rect_make_dir(SkScalar dx, SkScalar dy) { bool SkPath::isRectContour(bool allowPartial, int* currVerb, const SkPoint** ptsPtr, bool* isClosed, Direction* direction, SkRect* rect) const { int corners = 0; + SkPoint closeXY; // used to determine if final line falls on a diagonal SkPoint lineStart; // used to construct line from previous point const SkPoint* firstPt = nullptr; // first point in the rect (last of first moves) const SkPoint* lastPt = nullptr; // last point in the rect (last of lines or first if closed) @@ -538,6 +539,10 @@ bool SkPath::isRectContour(bool allowPartial, int* currVerb, const SkPoint** pts firstPt = pts; accumulatingRect = true; } else { + closeXY = *firstPt - *lastPt; + if (closeXY.fX && closeXY.fY) { + return false; // we're diagonal, abort + } accumulatingRect = false; } lineStart = *pts++; @@ -555,7 +560,7 @@ addMissingClose: if (corners < 3 || corners > 4) { return false; } - SkPoint closeXY = *firstPt - *lastPt; + closeXY = *firstPt - *lastPt; // If autoClose, check if close generates diagonal bool result = 4 == corners && (closeXY.isZero() || (autoClose && (!closeXY.fX || !closeXY.fY))); if (!result) { @@ -565,9 +570,6 @@ addMissingClose: // 3 sided rectangle // 4 sided but the last edge is not long enough to reach the start // - if (closeXY.fX && closeXY.fY) { - return false; // we're diagonal, abort (can we ever reach this?) - } int closeDirection = rect_make_dir(closeXY.fX, closeXY.fY); // make sure the close-segment doesn't double-back on itself if (3 == corners || (closeDirection ^ directions[1]) == 2) { |