detect more than one loop in computeconvexity



git-svn-id: http://skia.googlecode.com/svn/trunk@1326 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/core/SkPath.cpp b/src/core/SkPath.cpp
index fa6b3b9..d8e2c4c 100644
--- a/src/core/SkPath.cpp
+++ b/src/core/SkPath.cpp
@@ -1401,12 +1401,16 @@
     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 @@
         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 @@
                     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;
+                }
             }
         }
     }
diff --git a/tests/PathTest.cpp b/tests/PathTest.cpp
index 82f230d..3884308 100644
--- a/tests/PathTest.cpp
+++ b/tests/PathTest.cpp
@@ -86,7 +86,7 @@
     spiral.lineTo(.5,.5);
     spiral.lineTo(.5,.75);
     spiral.close();
-//    check_convexity(reporter, spiral, SkPath::kConcave_Convexity);
+    check_convexity(reporter, spiral, SkPath::kConcave_Convexity);
     
     SkPath dent;
     dent.moveTo(0, 0);
@@ -157,7 +157,7 @@
     } gRec[] = {
         { "0 0", SkPath::kUnknown_Convexity },
         { "0 0 10 10", SkPath::kUnknown_Convexity },
-        { "0 0 10 10 20 20 0 0 10 10", SkPath::kUnknown_Convexity },
+        { "0 0 10 10 20 20 0 0 10 10", SkPath::kConcave_Convexity },
         { "0 0 10 10 10 20", SkPath::kConvex_Convexity },
         { "0 0 10 10 10 0", SkPath::kConvex_Convexity },
         { "0 0 10 10 10 0 0 10", SkPath::kConcave_Convexity },