Fix the rendering error of SkDraw::drawVertices in gpu path for solid color.

If both textures and vertex-colors are NULL, drawVertices should stroke hairlines with the paint's color.
This behavior is a useful debugging mode to visualize the mesh.

BUG=skia:2266
R=bsalomon@google.com, reed@google.com

Author: yunchao.he@intel.com

Review URL: https://codereview.chromium.org/189963004

git-svn-id: http://skia.googlecode.com/svn/trunk/include@14985 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/core/SkCanvas.h b/core/SkCanvas.h
index 81dcfe1..f8876e6 100644
--- a/core/SkCanvas.h
+++ b/core/SkCanvas.h
@@ -1002,6 +1002,11 @@
     };
 
     /** Draw the array of vertices, interpreted as triangles (based on mode).
+
+        If both textures and vertex-colors are NULL, it strokes hairlines with
+        the paint's color. This behavior is a useful debugging mode to visualize
+        the mesh.
+
         @param vmode How to interpret the array of vertices
         @param vertexCount The number of points in the vertices array (and
                     corresponding texs and colors arrays if non-null)
diff --git a/core/SkVertState.h b/core/SkVertState.h
new file mode 100644
index 0000000..ecf1773
--- /dev/null
+++ b/core/SkVertState.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SkVertState_DEFINED
+#define SkVertState_DEFINED
+
+#include "SkCanvas.h"
+
+/** \struct VertState
+    This is a helper for drawVertices(). It is used to iterate over the triangles
+    that are to be rendered based on an SkCanvas::VertexMode and (optionally) an
+    index array. It does not copy the index array and the client must ensure it
+    remains valid for the lifetime of the VertState object.
+*/
+
+struct VertState {
+    int f0, f1, f2;
+
+    /**
+     *  Construct a VertState from a vertex count, index array, and index count.
+     *  If the vertices are unindexed pass NULL for indices.
+     */
+    VertState(int vCount, const uint16_t indices[], int indexCount)
+            : fIndices(indices) {
+        fCurrIndex = 0;
+        if (indices) {
+            fCount = indexCount;
+        } else {
+            fCount = vCount;
+        }
+    }
+
+    typedef bool (*Proc)(VertState*);
+
+    /**
+     *  Choose an appropriate function to traverse the vertices.
+     *  @param mode    Specifies the SkCanvas::VertexMode.
+     */
+    Proc chooseProc(SkCanvas::VertexMode mode);
+
+private:
+    int             fCount;
+    int             fCurrIndex;
+    const uint16_t* fIndices;
+
+    static bool Triangles(VertState*);
+    static bool TrianglesX(VertState*);
+    static bool TriangleStrip(VertState*);
+    static bool TriangleStripX(VertState*);
+    static bool TriangleFan(VertState*);
+    static bool TriangleFanX(VertState*);
+};
+
+#endif