diff options
author | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-05-15 20:25:17 +0000 |
---|---|---|
committer | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-05-15 20:25:17 +0000 |
commit | 85b6e399d56d2421980daa432f30910beda41922 (patch) | |
tree | 6a74890fb09b409f66f682ec401c26ed0b093411 /src | |
parent | 7c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1b (diff) |
detect more than one loop in computeconvexity
git-svn-id: http://skia.googlecode.com/svn/trunk@1326 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkPath.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/core/SkPath.cpp b/src/core/SkPath.cpp index fa6b3b9f66..d8e2c4c0af 100644 --- a/src/core/SkPath.cpp +++ b/src/core/SkPath.cpp @@ -1401,12 +1401,16 @@ static int SkScalarSign(SkScalar value) { return value < 0 ? -1 : (value > 0); } +static int sign(SkScalar x) { return x < 0 ? -1 : 1; } + static int CrossProductSign(const SkVector& a, const SkVector& b) { return SkScalarSign(SkPoint::CrossProduct(a, b)); } // only valid for a single contour struct Convexicator { + int fDx, fDy, fSx, fSy; + Convexicator() : fPtCount(0), fConvexity(SkPath::kUnknown_Convexity) { fSign = 0; // warnings @@ -1414,6 +1418,9 @@ struct Convexicator { fVec0.set(0, 0); fVec1.set(0, 0); fFirstVec.set(0, 0); + + fDx = fDy = 0; + fSx = fSy = 2; } SkPath::Convexity getConvexity() const { return fConvexity; } @@ -1436,6 +1443,17 @@ struct Convexicator { SkASSERT(fPtCount > 2); this->addVec(vec); } + + int sx = sign(vec.fX); + int sy = sign(vec.fY); + fDx += (sx != fSx); + fDy += (sy != fSy); + fSx = sx; + fSy = sy; + + if (fDx > 3 || fDy > 3) { + fConvexity = SkPath::kConcave_Convexity; + } } } } |