aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar caryclark <caryclark@google.com>2015-07-14 11:19:26 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-07-14 11:19:26 -0700
commite8c5666e0387e70bd921e01558e627af3f1411db (patch)
tree0a4645ac98f44d7f53f94f48ca0cf4e88e52cdbe /src/core
parent5ca41c1647d241633ee7880c27d10e8d61d77d98 (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.cpp12
-rw-r--r--src/core/SkStroke.cpp2
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;