avoid rebuilding pipeline w/ only tricolors

patch_primitive: 2.0 --> 1.4

Bug: skia:
Change-Id: Ia43c31873b9438332c94958232f6367240ba9a62
Reviewed-on: https://skia-review.googlesource.com/18030
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/src/core/SkDraw_vertices.cpp b/src/core/SkDraw_vertices.cpp
index 7720acc..6b6ba9c 100644
--- a/src/core/SkDraw_vertices.cpp
+++ b/src/core/SkDraw_vertices.cpp
@@ -235,29 +235,46 @@
         SkPaint p(paint);
         p.setShader(sk_ref_sp(shader));
 
-        while (vertProc(&state)) {
-            SkSTArenaAlloc<2048> innerAlloc;
+        if (!textures) {    // only tricolor shader
+            SkASSERT(matrix43);
+            auto blitter = SkCreateRasterPipelineBlitter(fDst, p, *fMatrix, &outerAlloc);
+            while (vertProc(&state)) {
+                if (!update_tricolor_matrix(ctmInv, vertices, dstColors,
+                                            state.f0, state.f1, state.f2,
+                                            matrix43)) {
+                    continue;
+                }
 
-            const SkMatrix* ctm = fMatrix;
-            SkMatrix tmpCtm;
-            if (textures) {
-                SkMatrix localM;
-                texture_to_matrix(state, vertices, textures, &localM);
-                tmpCtm = SkMatrix::Concat(*fMatrix, localM);
-                ctm = &tmpCtm;
+                SkPoint tmp[] = {
+                    devVerts[state.f0], devVerts[state.f1], devVerts[state.f2]
+                };
+                SkScan::FillTriangle(tmp, *fRC, blitter);
             }
+        } else {
+            while (vertProc(&state)) {
+                SkSTArenaAlloc<2048> innerAlloc;
 
-            if (matrix43 && !update_tricolor_matrix(ctmInv, vertices, dstColors,
-                                                    state.f0, state.f1, state.f2,
-                                                    matrix43)) {
-                continue;
+                const SkMatrix* ctm = fMatrix;
+                SkMatrix tmpCtm;
+                if (textures) {
+                    SkMatrix localM;
+                    texture_to_matrix(state, vertices, textures, &localM);
+                    tmpCtm = SkMatrix::Concat(*fMatrix, localM);
+                    ctm = &tmpCtm;
+                }
+
+                if (matrix43 && !update_tricolor_matrix(ctmInv, vertices, dstColors,
+                                                        state.f0, state.f1, state.f2,
+                                                        matrix43)) {
+                    continue;
+                }
+
+                SkPoint tmp[] = {
+                    devVerts[state.f0], devVerts[state.f1], devVerts[state.f2]
+                };
+                auto blitter = SkCreateRasterPipelineBlitter(fDst, p, *ctm, &innerAlloc);
+                SkScan::FillTriangle(tmp, *fRC, blitter);
             }
-
-            SkPoint tmp[] = {
-                devVerts[state.f0], devVerts[state.f1], devVerts[state.f2]
-            };
-            auto blitter = SkCreateRasterPipelineBlitter(fDst, p, *ctm, &innerAlloc);
-            SkScan::FillTriangle(tmp, *fRC, blitter);
         }
     } else {
         // no colors[] and no texture, stroke hairlines with paint's color.