Add refcnt'ed immutable vertices class for SkCanvas::drawVertices.

Change-Id: I44a62f5efc674d0adbbf4a33690c3ded9fab3803
Reviewed-on: https://skia-review.googlesource.com/8040
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 41c5116..eb81bd7 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -49,6 +49,7 @@
 
 #endif
 #include "SkClipOpPriv.h"
+#include "SkVertices.h"
 
 #define RETURN_ON_NULL(ptr)     do { if (nullptr == (ptr)) return; } while (0)
 
@@ -1857,8 +1858,14 @@
 void SkCanvas::drawVertices(VertexMode vmode, int vertexCount, const SkPoint vertices[],
                             const SkPoint texs[], const SkColor colors[], SkBlendMode bmode,
                             const uint16_t indices[], int indexCount, const SkPaint& paint) {
-    this->onDrawVertices(vmode, vertexCount, vertices, texs, colors, bmode,
-                         indices, indexCount, paint);
+    this->onDrawVertices(vmode, vertexCount, std::move(vertices), texs, colors, bmode, indices,
+                         indexCount, paint);
+}
+
+void SkCanvas::drawVertices(sk_sp<SkVertices> vertices, SkBlendMode mode, const SkPaint& paint,
+                            uint32_t flags) {
+    RETURN_ON_NULL(vertices);
+    this->onDrawVerticesObject(std::move(vertices), mode, paint, flags);
 }
 
 void SkCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
@@ -2815,6 +2822,28 @@
     LOOPER_END
 }
 
+void SkCanvas::onDrawVerticesObject(sk_sp<SkVertices> vertices, SkBlendMode bmode,
+                                    const SkPaint& paint, uint32_t flags) {
+    TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawVertices()");
+    LOOPER_BEGIN(paint, SkDrawFilter::kPath_Type, nullptr)
+
+    while (iter.next()) {
+        // In the common case of one iteration we could std::move vertices here.
+        iter.fDevice->drawVerticesObject(iter, vertices, bmode, looper.paint(), flags);
+    }
+
+    LOOPER_END
+}
+
+void SkCanvas::onDrawVerticesObjectFallback(sk_sp<SkVertices> vertices, SkBlendMode mode,
+                                            const SkPaint& paint, uint32_t flags) {
+    const SkPoint* texs =
+            (flags & SkCanvas::kIgnoreTexCoords_VerticesFlag) ? nullptr : vertices->texCoords();
+    const SkColor* colors = (flags & kIgnoreColors_VerticesFlag) ? nullptr : vertices->colors();
+    this->onDrawVertices(vertices->mode(), vertices->vertexCount(), vertices->positions(), texs,
+                         colors, mode, vertices->indices(), vertices->indexCount(), paint);
+}
+
 void SkCanvas::drawPatch(const SkPoint cubics[12], const SkColor colors[4],
                          const SkPoint texCoords[4], SkBlendMode bmode,
                          const SkPaint& paint) {