aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-05-15 20:25:17 +0000
committerGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-05-15 20:25:17 +0000
commit85b6e399d56d2421980daa432f30910beda41922 (patch)
tree6a74890fb09b409f66f682ec401c26ed0b093411 /src
parent7c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1b (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.cpp18
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;
+ }
}
}
}