Wide color support in GrGregionOp

Bug: skia:
Change-Id: I80cee450fdc2065b451ed7f7614f8a6f7aadd41e
Reviewed-on: https://skia-review.googlesource.com/c/179992
Reviewed-by: Mike Klein <mtklein@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
diff --git a/src/gpu/ops/GrRegionOp.cpp b/src/gpu/ops/GrRegionOp.cpp
index 7f1ad81..356f3a7 100644
--- a/src/gpu/ops/GrRegionOp.cpp
+++ b/src/gpu/ops/GrRegionOp.cpp
@@ -20,11 +20,13 @@
 static const int kIndicesPerInstance = 6;
 
 static sk_sp<GrGeometryProcessor> make_gp(const GrShaderCaps* shaderCaps,
-                                          const SkMatrix& viewMatrix) {
+                                          const SkMatrix& viewMatrix,
+                                          bool wideColor) {
     using namespace GrDefaultGeoProcFactory;
-    return GrDefaultGeoProcFactory::Make(shaderCaps, Color::kPremulGrColorAttribute_Type,
-                                         Coverage::kSolid_Type, LocalCoords::kUsePosition_Type,
-                                         viewMatrix);
+    Color::Type colorType =
+        wideColor ? Color::kPremulWideColorAttribute_Type : Color::kPremulGrColorAttribute_Type;
+    return GrDefaultGeoProcFactory::Make(shaderCaps, colorType, Coverage::kSolid_Type,
+                                         LocalCoords::kUsePosition_Type, viewMatrix);
 }
 
 namespace {
@@ -58,6 +60,7 @@
 
         SkRect bounds = SkRect::Make(region.getBounds());
         this->setTransformedBounds(bounds, viewMatrix, HasAABloat::kNo, IsZeroArea::kNo);
+        fWideColor = !SkPMColor4fFitsInBytes(color);
     }
 
     const char* name() const override { return "GrRegionOp"; }
@@ -90,7 +93,8 @@
 
 private:
     void onPrepareDraws(Target* target) override {
-        sk_sp<GrGeometryProcessor> gp = make_gp(target->caps().shaderCaps(), fViewMatrix);
+        sk_sp<GrGeometryProcessor> gp = make_gp(target->caps().shaderCaps(), fViewMatrix,
+                                                fWideColor);
         if (!gp) {
             SkDebugf("Couldn't create GrGeometryProcessor\n");
             return;
@@ -115,9 +119,7 @@
         }
 
         for (int i = 0; i < numRegions; i++) {
-            // TODO4F: Preserve float colors
-            GrColor color = fRegions[i].fColor.toBytes_RGBA();
-
+            GrVertexColor color(fRegions[i].fColor, fWideColor);
             SkRegion::Iterator iter(fRegions[i].fRegion);
             while (!iter.done()) {
                 SkRect rect = SkRect::Make(iter.rect());
@@ -140,6 +142,7 @@
         }
 
         fRegions.push_back_n(that->fRegions.count(), that->fRegions.begin());
+        fWideColor |= that->fWideColor;
         return CombineResult::kMerged;
     }
 
@@ -151,6 +154,7 @@
     Helper fHelper;
     SkMatrix fViewMatrix;
     SkSTArray<1, RegionInfo, true> fRegions;
+    bool fWideColor;
 
     typedef GrMeshDrawOp INHERITED;
 };