Reland "Try to avoid vertex colors in Texture/FillRect ops when possible."

This is a reland of e0b989e5e3ab64f3585fe1bf0228e964dad0678c

Original change's description:
> Try to avoid vertex colors in Texture/FillRect ops when possible.
> 
> Avoids unnecessary fragment shader color multiplication.
> 
> Change-Id: I353d3ca91824ce20c9e9af1c5c84ab9953ddd8ab
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/201004
> Commit-Queue: Brian Salomon <bsalomon@google.com>
> Reviewed-by: Michael Ludwig <michaelludwig@google.com>

Change-Id: I22125cb7058f528cb368ff30c3c26e3d55056e66
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/201222
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
diff --git a/src/gpu/ops/GrQuadPerEdgeAA.cpp b/src/gpu/ops/GrQuadPerEdgeAA.cpp
index 4845b55..cdc49b3 100644
--- a/src/gpu/ops/GrQuadPerEdgeAA.cpp
+++ b/src/gpu/ops/GrQuadPerEdgeAA.cpp
@@ -624,9 +624,7 @@
 // Writes four vertices in triangle strip order, including the additional data for local
 // coordinates, domain, color, and coverage as needed to satisfy the vertex spec.
 static void write_quad(GrVertexWriter* vb, const GrQuadPerEdgeAA::VertexSpec& spec,
-                       CoverageMode mode, Sk4f coverage,
-                       SkPMColor4f color4f, bool wideColor,
-                       const SkRect& domain,
+                       CoverageMode mode, Sk4f coverage, SkPMColor4f color4f, const SkRect& domain,
                        const Vertices& quad) {
     static constexpr auto If = GrVertexWriter::If<float>;
 
@@ -639,8 +637,9 @@
 
         // save color
         if (spec.hasVertexColors()) {
+            bool wide = spec.colorType() == GrQuadPerEdgeAA::ColorType::kHalf;
             vb->write(GrVertexColor(
-                    color4f * (mode == CoverageMode::kWithColor ? coverage[i] : 1.f), wideColor));
+                    color4f * (mode == CoverageMode::kWithColor ? coverage[i] : 1.f), wide));
         }
 
         // save local position
@@ -684,12 +683,21 @@
 
 namespace GrQuadPerEdgeAA {
 
+ColorType MinColorType(SkPMColor4f color) {
+    if (color == SK_PMColor4fWHITE) {
+        return ColorType::kNone;
+    } else if (color.fitsInBytes()) {
+        return ColorType::kByte;
+    } else {
+        return ColorType::kHalf;
+    }
+}
+
 ////////////////// Tessellate Implementation
 
 void* Tessellate(void* vertices, const VertexSpec& spec, const GrPerspQuad& deviceQuad,
                  const SkPMColor4f& color4f, const GrPerspQuad& localQuad, const SkRect& domain,
                  GrQuadAAFlags aaFlags) {
-    bool wideColor = GrQuadPerEdgeAA::ColorType::kHalf == spec.colorType();
     CoverageMode mode = get_mode_for_spec(spec);
 
     // Load position data into Sk4fs (always x, y, and load w to avoid branching down the road)
@@ -732,12 +740,12 @@
         // applied a mirror, etc. The current 2D case is already adequately fast.
 
         // Write two quads for inner and outer, inner will use the
-        write_quad(&vb, spec, mode, maxCoverage, color4f, wideColor, domain, inner);
-        write_quad(&vb, spec, mode, 0.f, color4f, wideColor, domain, outer);
+        write_quad(&vb, spec, mode, maxCoverage, color4f, domain, inner);
+        write_quad(&vb, spec, mode, 0.f, color4f, domain, outer);
     } else {
         // No outsetting needed, just write a single quad with full coverage
         SkASSERT(mode == CoverageMode::kNone);
-        write_quad(&vb, spec, mode, 1.f, color4f, wideColor, domain, outer);
+        write_quad(&vb, spec, mode, 1.f, color4f, domain, outer);
     }
 
     return vb.fPtr;