diff options
author | 2015-07-14 11:19:26 -0700 | |
---|---|---|
committer | 2015-07-14 11:19:26 -0700 | |
commit | e8c5666e0387e70bd921e01558e627af3f1411db (patch) | |
tree | 0a4645ac98f44d7f53f94f48ca0cf4e88e52cdbe /src/core | |
parent | 5ca41c1647d241633ee7880c27d10e8d61d77d98 (diff) |
Very tiny paths are subsumed by the Convexicator
and are treated as convex when they are not.
Allow the SkPath::Iter to leave degenerate path
segments unmolested by passing an additional exact
bool to next().
Treat any non-zero length as significant in addPt().
R=reed@google.com,robertphillips@google.com
BUG=493450
Review URL: https://codereview.chromium.org/1228383002
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/SkPath.cpp | 12 | ||||
-rw-r--r-- | src/core/SkStroke.cpp | 2 |
2 files changed, 7 insertions, 7 deletions
diff --git a/src/core/SkPath.cpp b/src/core/SkPath.cpp index 9381f48f3b..05fc7305ce 100644 --- a/src/core/SkPath.cpp +++ b/src/core/SkPath.cpp @@ -1612,7 +1612,7 @@ const SkPoint& SkPath::Iter::cons_moveTo() { } } -void SkPath::Iter::consumeDegenerateSegments() { +void SkPath::Iter::consumeDegenerateSegments(bool exact) { // We need to step over anything that will not move the current draw point // forward before the next move is seen const uint8_t* lastMoveVerb = 0; @@ -1643,7 +1643,7 @@ void SkPath::Iter::consumeDegenerateSegments() { break; case kLine_Verb: - if (!IsLineDegenerate(lastPt, fPts[0])) { + if (!IsLineDegenerate(lastPt, fPts[0], exact)) { if (lastMoveVerb) { fVerbs = lastMoveVerb; fPts = lastMovePt; @@ -1659,7 +1659,7 @@ void SkPath::Iter::consumeDegenerateSegments() { case kConic_Verb: case kQuad_Verb: - if (!IsQuadDegenerate(lastPt, fPts[0], fPts[1])) { + if (!IsQuadDegenerate(lastPt, fPts[0], fPts[1], exact)) { if (lastMoveVerb) { fVerbs = lastMoveVerb; fPts = lastMovePt; @@ -1675,7 +1675,7 @@ void SkPath::Iter::consumeDegenerateSegments() { break; case kCubic_Verb: - if (!IsCubicDegenerate(lastPt, fPts[0], fPts[1], fPts[2])) { + if (!IsCubicDegenerate(lastPt, fPts[0], fPts[1], fPts[2], exact)) { if (lastMoveVerb) { fVerbs = lastMoveVerb; fPts = lastMovePt; @@ -2116,7 +2116,7 @@ struct Convexicator { SkScalar lengthSqd = vec.lengthSqd(); if (!SkScalarIsFinite(lengthSqd)) { fIsFinite = false; - } else if (!SkScalarNearlyZero(lengthSqd, SK_ScalarNearlyZero*SK_ScalarNearlyZero)) { + } else if (lengthSqd) { fPriorPt = fLastPt; fLastPt = fCurrPt; fCurrPt = pt; @@ -2253,7 +2253,7 @@ SkPath::Convexity SkPath::internalGetConvexity() const { if (!isFinite()) { return kUnknown_Convexity; } - while ((verb = iter.next(pts)) != SkPath::kDone_Verb) { + while ((verb = iter.next(pts, true, true)) != SkPath::kDone_Verb) { switch (verb) { case kMove_Verb: if (++contourCount > 1) { diff --git a/src/core/SkStroke.cpp b/src/core/SkStroke.cpp index 86c0571c4b..d21dc96713 100644 --- a/src/core/SkStroke.cpp +++ b/src/core/SkStroke.cpp @@ -356,7 +356,7 @@ void SkPathStroker::line_to(const SkPoint& currPt, const SkVector& normal) { } void SkPathStroker::lineTo(const SkPoint& currPt) { - if (SkPath::IsLineDegenerate(fPrevPt, currPt)) { + if (SkPath::IsLineDegenerate(fPrevPt, currPt, false)) { return; } SkVector normal, unitNormal; |