Index: src/core/SkPath.cpp |
diff --git a/src/core/SkPath.cpp b/src/core/SkPath.cpp |
index 2babe70185d51cabb9059f47c774acd2d1f80d74..738edd9d232c79ea40e9aab40653f5396e971e2f 100644 |
--- a/src/core/SkPath.cpp |
+++ b/src/core/SkPath.cpp |
@@ -2129,7 +2129,8 @@ struct Convexicator { |
: fPtCount(0) |
, fConvexity(SkPath::kConvex_Convexity) |
, fDirection(SkPath::kUnknown_Direction) |
- , fIsFinite(true) { |
+ , fIsFinite(true) |
+ , fIsCurve(false) { |
fExpectedDir = kInvalid_DirChange; |
// warnings |
fLastPt.set(0, 0); |
@@ -2193,6 +2194,10 @@ struct Convexicator { |
return fIsFinite; |
} |
+ void setCurve(bool isCurve) { |
+ fIsCurve = isCurve; |
+ } |
+ |
private: |
void addVec(const SkVector& vec) { |
SkASSERT(vec.fX || vec.fY); |
@@ -2213,6 +2218,10 @@ private: |
case kStraight_DirChange: |
break; |
case kBackwards_DirChange: |
+ if (fIsCurve) { |
+ fConvexity = SkPath::kConcave_Convexity; |
+ fDirection = SkPath::kUnknown_Direction; |
+ } |
fLastVec = vec; |
break; |
case kInvalid_DirChange: |
@@ -2232,6 +2241,7 @@ private: |
SkPath::Direction fDirection; |
int fDx, fDy, fSx, fSy; |
bool fIsFinite; |
+ bool fIsCurve; |
}; |
SkPath::Convexity SkPath::internalGetConvexity() const { |
@@ -2255,13 +2265,23 @@ SkPath::Convexity SkPath::internalGetConvexity() const { |
return kConcave_Convexity; |
} |
pts[1] = pts[0]; |
+ // fall through |
+ case kLine_Verb: |
count = 1; |
+ state.setCurve(false); |
+ break; |
+ case kQuad_Verb: |
+ // fall through |
+ case kConic_Verb: |
+ // fall through |
+ case kCubic_Verb: |
+ count = 2 + (kCubic_Verb == verb); |
+ // As an additional enhancement, this could set curve true only |
+ // if the curve is nonlinear |
+ state.setCurve(true); |
break; |
- case kLine_Verb: count = 1; break; |
- case kQuad_Verb: count = 2; break; |
- case kConic_Verb: count = 2; break; |
- case kCubic_Verb: count = 3; break; |
case kClose_Verb: |
+ state.setCurve(false); |
state.close(); |
count = 0; |
break; |