From 85b6e399d56d2421980daa432f30910beda41922 Mon Sep 17 00:00:00 2001 From: "reed@google.com" Date: Sun, 15 May 2011 20:25:17 +0000 Subject: detect more than one loop in computeconvexity git-svn-id: http://skia.googlecode.com/svn/trunk@1326 2bbb7eff-a529-9590-31e7-b0007b416f81 --- src/core/SkPath.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'src') 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; + } } } } -- cgit v1.2.3