Fix glDrawRangeElements

Adds explicit min/max index value fields to GrMesh. This eliminates the
previous assumption that the index values were within the range
[0..vertexCount-1]. In the pattern case we still maintain this
assumption.

Updates GrMesh to hide its fields and handle its new complexity using a
"helper" interface instead.

Adds a unit test for GrMesh.

Bug: skia:
Change-Id: Ia23de72d510f8827cee56072b727fb70a6e46b8d
Reviewed-on: https://skia-review.googlesource.com/17964
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Chris Dalton <csmartdalton@google.com>
diff --git a/src/gpu/ops/GrMSAAPathRenderer.cpp b/src/gpu/ops/GrMSAAPathRenderer.cpp
index c3a5440..36faf2f 100644
--- a/src/gpu/ops/GrMSAAPathRenderer.cpp
+++ b/src/gpu/ops/GrMSAAPathRenderer.cpp
@@ -411,10 +411,13 @@
             SkASSERT(lineVertexStride == lineGP->getVertexStride());
 
             GrMesh lineMeshes(primitiveType);
-            if (fIsIndexed) {
-                lineMeshes.setIndexed(lineIndexBuffer, lineIndexOffset, firstLineIndex);
+            if (!fIsIndexed) {
+                lineMeshes.setNonIndexed(lineVertexOffset);
+            } else {
+                lineMeshes.setIndexed(lineIndexBuffer, lineIndexOffset, firstLineIndex,
+                                      0, lineVertexOffset - 1);
             }
-            lineMeshes.setVertices(lineVertexBuffer, lineVertexOffset, firstLineVertex);
+            lineMeshes.setVertexData(lineVertexBuffer, firstLineVertex);
 
             // We can get line vertices from path moveTos with no actual segments and thus no index
             // count. We assert that indexed draws contain a positive index count, so bail here in
@@ -435,16 +438,19 @@
                                             &firstQuadVertex);
             memcpy(quadVertices, quads.vertices, quadVertexStride * quadVertexOffset);
             GrMesh quadMeshes(kTriangles_GrPrimitiveType);
-            if (fIsIndexed) {
+            if (!fIsIndexed) {
+                quadMeshes.setNonIndexed(quadVertexOffset);
+            } else {
                 const GrBuffer* quadIndexBuffer;
                 int firstQuadIndex;
                 uint16_t* quadIndices = (uint16_t*) target->makeIndexSpace(quadIndexOffset,
                                                                            &quadIndexBuffer,
                                                                            &firstQuadIndex);
                 memcpy(quadIndices, quads.indices, sizeof(uint16_t) * quadIndexOffset);
-                quadMeshes.setIndexed(quadIndexBuffer, quadIndexOffset, firstQuadIndex);
+                quadMeshes.setIndexed(quadIndexBuffer, quadIndexOffset, firstQuadIndex,
+                                      0, quadVertexOffset - 1);
             }
-            quadMeshes.setVertices(quadVertexBuffer, quadVertexOffset, firstQuadVertex);
+            quadMeshes.setVertexData(quadVertexBuffer, firstQuadVertex);
             target->draw(quadGP.get(), this->pipeline(), quadMeshes);
         }
     }