Introduce SkRGBA4f, templated on SkAlphaType

Most functionality is shared, but this lets us get type safety.
SkColor4f = SkRGBA4f<kUnpremul>
SkPMColor4f = SkRGBA4f<kPremul>

Change-Id: I27408565dc92e722f42a185cecbf7af15d1dde3f
Reviewed-on: https://skia-review.googlesource.com/156243
Commit-Queue: Brian Osman <brianosman@google.com>
Commit-Queue: Mike Klein <mtklein@google.com>
Reviewed-by: Mike Klein <mtklein@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Auto-Submit: Mike Klein <mtklein@google.com>
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
index b79f01f..358a932 100644
--- a/src/gpu/SkGr.cpp
+++ b/src/gpu/SkGr.cpp
@@ -261,11 +261,11 @@
 }
 
 GrColor4f SkColor4fToPremulGrColor4fLegacy(SkColor4f c) {
-    return GrColor4f::FromSkColor4f(c).premul();
+    return GrColor4f::FromRGBA4f(c.premul());
 }
 
 GrColor4f SkColor4fToUnpremulGrColor4f(SkColor4f c, const GrColorSpaceInfo& colorSpaceInfo) {
-    GrColor4f color = GrColor4f::FromSkColor4f(c);
+    GrColor4f color = GrColor4f::FromRGBA4f(c);
     if (auto* xform = colorSpaceInfo.colorSpaceXformFromSRGB()) {
         color = xform->apply(color);
     }
@@ -455,8 +455,8 @@
     SkColorFilter* colorFilter = skPaint.getColorFilter();
     if (colorFilter) {
         if (applyColorFilterToPaintColor) {
-            grPaint->setColor4f(GrColor4f::FromSkColor4f(
-                    colorFilter->filterColor4f(origColor.toSkColor4f(),
+            grPaint->setColor4f(GrColor4f::FromRGBA4f(
+                    colorFilter->filterColor4f(origColor.asRGBA4f<kUnpremul_SkAlphaType>(),
                                                colorSpaceInfo.colorSpace())).premul());
         } else {
             auto cfFP = colorFilter->asFragmentProcessor(context, colorSpaceInfo);
diff --git a/src/gpu/effects/GrXfermodeFragmentProcessor.cpp b/src/gpu/effects/GrXfermodeFragmentProcessor.cpp
index b5e3d13..9014114 100644
--- a/src/gpu/effects/GrXfermodeFragmentProcessor.cpp
+++ b/src/gpu/effects/GrXfermodeFragmentProcessor.cpp
@@ -151,10 +151,10 @@
         input = input.opaque();
         GrColor4f srcColor = ConstantOutputForConstantInput(this->childProcessor(0), input);
         GrColor4f dstColor = ConstantOutputForConstantInput(this->childProcessor(1), input);
-        SkColor4f src = srcColor.toSkColor4f();
-        SkColor4f dst = dstColor.toSkColor4f();
-        SkColor4f res = SkBlendMode_Apply(fMode, src, dst);
-        return GrColor4f::FromSkColor4f(res).mulByScalar(alpha);
+        SkPMColor4f src = srcColor.asRGBA4f<kPremul_SkAlphaType>();
+        SkPMColor4f dst = dstColor.asRGBA4f<kPremul_SkAlphaType>();
+        SkPMColor4f res = SkBlendMode_Apply(fMode, src, dst);
+        return GrColor4f::FromRGBA4f(res).mulByScalar(alpha);
     }
 
     GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
@@ -406,16 +406,16 @@
     GrColor4f constantOutputForConstantInput(GrColor4f inputColor) const override {
         GrColor4f childColor =
                 ConstantOutputForConstantInput(this->childProcessor(0), GrColor4f::OpaqueWhite());
-        SkColor4f src, dst;
+        SkPMColor4f src, dst;
         if (kSrc_Child == fChild) {
-            src = childColor.toSkColor4f();
-            dst = inputColor.toSkColor4f();
+            src = childColor.asRGBA4f<kPremul_SkAlphaType>();
+            dst = inputColor.asRGBA4f<kPremul_SkAlphaType>();
         } else {
-            src = inputColor.toSkColor4f();
-            dst = childColor.toSkColor4f();
+            src = inputColor.asRGBA4f<kPremul_SkAlphaType>();
+            dst = childColor.asRGBA4f<kPremul_SkAlphaType>();
         }
-        SkColor4f res = SkBlendMode_Apply(fMode, src, dst);
-        return GrColor4f::FromSkColor4f(res);
+        SkPMColor4f res = SkBlendMode_Apply(fMode, src, dst);
+        return GrColor4f::FromRGBA4f(res);
     }
 
 private:
diff --git a/src/gpu/gradients/GrGradientShader.cpp b/src/gpu/gradients/GrGradientShader.cpp
index 4dbadef..12b9270 100644
--- a/src/gpu/gradients/GrGradientShader.cpp
+++ b/src/gpu/gradients/GrGradientShader.cpp
@@ -120,7 +120,7 @@
     SkColor4fXformer xformedColors(shader.fOrigColors4f, shader.fColorCount,
             shader.fColorSpace.get(), args.fDstColorSpaceInfo->colorSpace());
     for (int i = 0; i < shader.fColorCount; i++) {
-        colors[i] = GrColor4f::FromSkColor4f(xformedColors.fColors[i]);
+        colors[i] = GrColor4f::FromRGBA4f(xformedColors.fColors[i]);
         if (inputPremul) {
             colors[i] = colors[i].premul();
         }