Remove all remaining GrColor4f (other than gradients)

This adds SkPMColor4f conversions to/from RGBA bytes (ie GrColor).
I had previously made some free functions that did the same thing.
I'm ambivalent about which option is nicer, but wanted to have one
method, so I converted everything to use the new versions.

Bug: skia:
Change-Id: I4194c44b5bd12228075fd1932a14cf31c8d6a3c1
Reviewed-on: https://skia-review.googlesource.com/c/162560
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
diff --git a/bench/VertexColorSpaceBench.cpp b/bench/VertexColorSpaceBench.cpp
index 02f0920..0d14cc8 100644
--- a/bench/VertexColorSpaceBench.cpp
+++ b/bench/VertexColorSpaceBench.cpp
@@ -141,7 +141,7 @@
         this->setBounds(SkRect::MakeWH(100.f, 100.f), HasAABloat::kNo, IsZeroArea::kNo);
     }
 
-    Op(GrColor4f color4f, Mode mode)
+    Op(const SkColor4f& color4f, Mode mode)
             : INHERITED(ClassID())
             , fMode(mode)
             , fColor4f(color4f) {
@@ -174,7 +174,7 @@
         size_t vertexStride = sizeof(SkPoint);
         switch (fMode) {
             case kFloat_Mode:
-                vertexStride += sizeof(GrColor4f);
+                vertexStride += sizeof(SkColor4f);
                 break;
             case kHalf_Mode:
             case kShort_Mode:
@@ -198,7 +198,7 @@
         if (kFloat_Mode == fMode) {
             struct V {
                 SkPoint fPos;
-                GrColor4f fColor;
+                SkColor4f fColor;
             };
             SkASSERT(sizeof(V) == vertexStride);
             V* v = (V*)verts;
@@ -272,7 +272,7 @@
 
     Mode fMode;
     GrColor fColor;
-    GrColor4f fColor4f;
+    SkColor4f fColor4f;
     sk_sp<GrColorSpaceXform> fColorSpaceXform;
 
     typedef GrMeshDrawOp INHERITED;
@@ -328,7 +328,7 @@
                     case kHalf_Mode:
                     case kShort_Mode:
                     case kFloat_Mode: {
-                        GrColor4f c4f = GrColor4f::FromGrColor(SkColorToUnpremulGrColor(c));
+                        SkColor4f c4f = SkColor4f::FromColor(c);
                         c4f = xform->apply(c4f);
                         op = pool->allocate<Op>(c4f, fMode);
                     }
diff --git a/gm/bigrrectaaeffect.cpp b/gm/bigrrectaaeffect.cpp
index f3f10ae..a45337c 100644
--- a/gm/bigrrectaaeffect.cpp
+++ b/gm/bigrrectaaeffect.cpp
@@ -87,7 +87,7 @@
                 SkASSERT(fp);
                 if (fp) {
                     GrPaint grPaint;
-                    grPaint.setColor4f(GrColor4f(0, 0, 0, 1.f));
+                    grPaint.setColor4f({ 0, 0, 0, 1.f });
                     grPaint.setXPFactory(GrPorterDuffXPFactory::Get(SkBlendMode::kSrc));
                     grPaint.addCoverageFragmentProcessor(std::move(fp));
 
diff --git a/gm/constcolorprocessor.cpp b/gm/constcolorprocessor.cpp
index aefba19..4dd40cf 100644
--- a/gm/constcolorprocessor.cpp
+++ b/gm/constcolorprocessor.cpp
@@ -103,7 +103,7 @@
                                                     skPaint, viewMatrix, &grPaint));
 
                     GrConstColorProcessor::InputMode mode = (GrConstColorProcessor::InputMode) m;
-                    SkPMColor4f color = GrColorToPMColor4f(kColors[procColor]);
+                    SkPMColor4f color = SkPMColor4f::FromBytes_RGBA(kColors[procColor]);
                     auto fp = GrConstColorProcessor::Make(color, mode);
 
                     grPaint.addColorFragmentProcessor(std::move(fp));
diff --git a/gm/convexpolyeffect.cpp b/gm/convexpolyeffect.cpp
index 7854bff..4b8c97f 100644
--- a/gm/convexpolyeffect.cpp
+++ b/gm/convexpolyeffect.cpp
@@ -211,7 +211,7 @@
                 }
 
                 GrPaint grPaint;
-                grPaint.setColor4f(GrColor4f(0, 0, 0, 1.f));
+                grPaint.setColor4f({ 0, 0, 0, 1.f });
                 grPaint.setXPFactory(GrPorterDuffXPFactory::Get(SkBlendMode::kSrc));
                 grPaint.addCoverageFragmentProcessor(std::move(fp));
 
@@ -251,7 +251,7 @@
                 }
 
                 GrPaint grPaint;
-                grPaint.setColor4f(GrColor4f(0, 0, 0, 1.f));
+                grPaint.setColor4f({ 0, 0, 0, 1.f });
                 grPaint.setXPFactory(GrPorterDuffXPFactory::Get(SkBlendMode::kSrc));
                 grPaint.addCoverageFragmentProcessor(std::move(fp));
 
diff --git a/gm/rrects.cpp b/gm/rrects.cpp
index 2fbd3b9..1f9ddeb 100644
--- a/gm/rrects.cpp
+++ b/gm/rrects.cpp
@@ -111,7 +111,7 @@
                             GrPaint grPaint;
                             grPaint.setXPFactory(GrPorterDuffXPFactory::Get(SkBlendMode::kSrc));
                             grPaint.addCoverageFragmentProcessor(std::move(fp));
-                            grPaint.setColor4f(GrColor4f(0, 0, 0, 1.f));
+                            grPaint.setColor4f({ 0, 0, 0, 1.f });
 
                             SkRect bounds = rrect.getBounds();
                             bounds.outset(2.f, 2.f);
diff --git a/gm/windowrectangles.cpp b/gm/windowrectangles.cpp
index 14d10e2..e52a7bf 100644
--- a/gm/windowrectangles.cpp
+++ b/gm/windowrectangles.cpp
@@ -183,10 +183,10 @@
 
     GrPaint paint;
     if (GrFSAAType::kNone == rtc->fsaaType()) {
-        paint.setColor4f(GrColor4f(0, 0.25f, 1, 1));
+        paint.setColor4f({ 0, 0.25f, 1, 1 });
         this->visualizeAlphaMask(ctx, rtc, reducedClip, std::move(paint));
     } else {
-        paint.setColor4f(GrColor4f(1, 0.25f, 0.25f, 1));
+        paint.setColor4f({ 1, 0.25f, 0.25f, 1 });
         this->visualizeStencilMask(ctx, rtc, reducedClip, std::move(paint));
     }
 }
diff --git a/include/core/SkColor.h b/include/core/SkColor.h
index 68ff6f7..98a186b 100644
--- a/include/core/SkColor.h
+++ b/include/core/SkColor.h
@@ -381,6 +381,14 @@
             return { fR * invAlpha, fG * invAlpha, fB * invAlpha, fA };
         }
     }
+
+    // This produces bytes in RGBA order (eg GrColor). Impl. is the same, regardless of kAT
+    uint32_t toBytes_RGBA() const;
+    static SkRGBA4f FromBytes_RGBA(uint32_t color);
+
+    SkRGBA4f makeOpaque() const {
+        return { fR, fG, fB, 1.0f };
+    }
 };
 
 /** \struct SkColor4f
diff --git a/include/private/GrColor.h b/include/private/GrColor.h
index 88f0dbd..c28ace1 100644
--- a/include/private/GrColor.h
+++ b/include/private/GrColor.h
@@ -112,14 +112,6 @@
     rgba[3] = GrColorUnpackA(color) * ONE_OVER_255;
 }
 
-/** Converts a GrColor to an SkPMColor4f */
-static inline SkRGBA4f<kPremul_SkAlphaType> GrColorToPMColor4f(GrColor color) {
-    GrColorIsPMAssert(color);
-    SkRGBA4f<kPremul_SkAlphaType> result;
-    GrColorToRGBAFloat(color, result.vec());
-    return result;
-}
-
 /** Normalizes and coverts an uint8_t to a float. [0, 255] -> [0.0, 1.0] */
 static inline float GrNormalizeByteToFloat(uint8_t value) {
     static const float ONE_OVER_255 = 1.f / 255.f;
diff --git a/src/atlastext/SkAtlasTextTarget.cpp b/src/atlastext/SkAtlasTextTarget.cpp
index 2a59790..fcb489e 100644
--- a/src/atlastext/SkAtlasTextTarget.cpp
+++ b/src/atlastext/SkAtlasTextTarget.cpp
@@ -105,7 +105,7 @@
 
     void makeGrPaint(GrMaskFormat, const SkPaint& skPaint, const SkMatrix&,
                      GrPaint* grPaint) override {
-        grPaint->setColor4f(GrColor4f::FromRGBA4f(skPaint.getColor4f().premul()));
+        grPaint->setColor4f(skPaint.getColor4f().premul());
     }
 
     GrContext* getContext() override {
diff --git a/src/core/SkColor.cpp b/src/core/SkColor.cpp
index 8dc3fdd..337dfed 100644
--- a/src/core/SkColor.cpp
+++ b/src/core/SkColor.cpp
@@ -127,6 +127,18 @@
 }
 
 template <>
+uint32_t SkPMColor4f::toBytes_RGBA() const {
+    return Sk4f_toL32(Sk4f::Load(this->vec()));
+}
+
+template <>
+SkPMColor4f SkPMColor4f::FromBytes_RGBA(uint32_t c) {
+    SkPMColor4f color;
+    Sk4f_fromL32(c).store(&color);
+    return color;
+}
+
+template <>
 SkColor4f SkColor4f::Pin(float r, float g, float b, float a) {
     SkColor4f c4;
     Sk4f::Min(Sk4f::Max(Sk4f(r, g, b, a), Sk4f(0)), Sk4f(1)).store(c4.vec());
diff --git a/src/core/SkGlyphRunPainter.cpp b/src/core/SkGlyphRunPainter.cpp
index 90a8c3d..1d4d7da 100644
--- a/src/core/SkGlyphRunPainter.cpp
+++ b/src/core/SkGlyphRunPainter.cpp
@@ -326,12 +326,15 @@
 #if SK_SUPPORT_GPU
 // -- GrTextContext --------------------------------------------------------------------------------
 GrColor generate_filtered_color(const SkPaint& paint, const GrColorSpaceInfo& colorSpaceInfo) {
-    GrColor4f filteredColor = SkColor4fToUnpremulGrColor4f(paint.getColor4f(), colorSpaceInfo);
-    if (paint.getColorFilter() != nullptr) {
-        filteredColor = GrColor4f::FromRGBA4f(paint.getColorFilter()->filterColor4f(
-                filteredColor.asRGBA4f<kUnpremul_SkAlphaType>(),colorSpaceInfo.colorSpace()));
+    SkColor4f filteredColor = paint.getColor4f();
+    if (auto* xform = colorSpaceInfo.colorSpaceXformFromSRGB()) {
+        filteredColor = xform->apply(filteredColor);
     }
-    return filteredColor.premul().toGrColor();
+    if (paint.getColorFilter() != nullptr) {
+        filteredColor = paint.getColorFilter()->filterColor4f(filteredColor,
+                                                              colorSpaceInfo.colorSpace());
+    }
+    return filteredColor.premul().toBytes_RGBA();
 }
 
 void GrTextContext::drawGlyphRunList(
diff --git a/src/gpu/GrPaint.cpp b/src/gpu/GrPaint.cpp
index deed0d4..32b7016 100644
--- a/src/gpu/GrPaint.cpp
+++ b/src/gpu/GrPaint.cpp
@@ -70,7 +70,7 @@
         return false;
     }
     if (kSrc == fXPFactory || (!fXPFactory && fColor.isOpaque())) {
-        *constantColor = fColor.toGrColor();
+        *constantColor = fColor.toBytes_RGBA();
         return true;
     }
     return false;
diff --git a/src/gpu/GrPaint.h b/src/gpu/GrPaint.h
index 5d87eb0..7f5b035 100644
--- a/src/gpu/GrPaint.h
+++ b/src/gpu/GrPaint.h
@@ -47,13 +47,13 @@
     /**
      * The initial color of the drawn primitive. Defaults to solid white.
      */
-    void setColor4f(const GrColor4f& color) { fColor = color; }
-    const GrColor4f& getColor4f() const { return fColor; }
+    void setColor4f(const SkPMColor4f& color) { fColor = color; }
+    const SkPMColor4f& getColor4f() const { return fColor; }
 
     /**
      * Legacy getter, until all code handles 4f directly.
      */
-    GrColor getColor() const { return fColor.toGrColor(); }
+    GrColor getColor() const { return fColor.toBytes_RGBA(); }
 
     void setXPFactory(const GrXPFactory* xpFactory) {
         fXPFactory = xpFactory;
@@ -132,7 +132,7 @@
     SkSTArray<4, std::unique_ptr<GrFragmentProcessor>> fColorFragmentProcessors;
     SkSTArray<2, std::unique_ptr<GrFragmentProcessor>> fCoverageFragmentProcessors;
     bool fTrivial = true;
-    GrColor4f fColor = GrColor4f::OpaqueWhite();
+    SkPMColor4f fColor = SK_PMColor4fWHITE;
 };
 
 #endif
diff --git a/src/gpu/GrProcessorAnalysis.cpp b/src/gpu/GrProcessorAnalysis.cpp
index 1d58870..6c4ffbd 100644
--- a/src/gpu/GrProcessorAnalysis.cpp
+++ b/src/gpu/GrProcessorAnalysis.cpp
@@ -19,7 +19,7 @@
     fProcessorsToEliminate = 0;
     GrColor color;
     if ((fKnowOutputColor = input.isConstant(&color))) {
-        fLastKnownOutputColor = GrColor4f::FromGrColor(color).asRGBA4f<kPremul_SkAlphaType>();
+        fLastKnownOutputColor = SkPMColor4f::FromBytes_RGBA(color);
     }
     for (int i = 0; i < cnt; ++i) {
         if (fUsesLocalCoords && !fKnowOutputColor && !fCompatibleWithCoverageAsAlpha &&
diff --git a/src/gpu/GrProcessorAnalysis.h b/src/gpu/GrProcessorAnalysis.h
index b7475db..6767941 100644
--- a/src/gpu/GrProcessorAnalysis.h
+++ b/src/gpu/GrProcessorAnalysis.h
@@ -124,7 +124,7 @@
      */
     int initialProcessorsToEliminate(GrColor* newPipelineInputColor) const {
         if (fProcessorsToEliminate > 0) {
-            *newPipelineInputColor = GrColor4f::FromRGBA4f(fLastKnownOutputColor).toGrColor();
+            *newPipelineInputColor = fLastKnownOutputColor.toBytes_RGBA();
         }
         return fProcessorsToEliminate;
     }
@@ -141,7 +141,7 @@
      */
     GrProcessorAnalysisColor outputColor() const {
         if (fKnowOutputColor) {
-            return GrColor4f::FromRGBA4f(fLastKnownOutputColor).toGrColor();
+            return fLastKnownOutputColor.toBytes_RGBA();
         }
         return fIsOpaque ? GrProcessorAnalysisColor::Opaque::kYes
                          : GrProcessorAnalysisColor::Opaque::kNo;
diff --git a/src/gpu/GrRenderTargetContext.cpp b/src/gpu/GrRenderTargetContext.cpp
index 6b9e3d1..44ef3cf 100644
--- a/src/gpu/GrRenderTargetContext.cpp
+++ b/src/gpu/GrRenderTargetContext.cpp
@@ -296,7 +296,7 @@
     // It could be done but will take more finagling.
     if (clearRect && fRenderTargetContext->caps()->performPartialClearsAsDraws()) {
         GrPaint paint;
-        paint.setColor4f(GrColor4f::FromGrColor(color));
+        paint.setColor4f(SkPMColor4f::FromBytes_RGBA(color));
         SkRect scissor = SkRect::Make(rtRect);
         std::unique_ptr<GrDrawOp> op(GrRectOpFactory::MakeNonAAFill(fRenderTargetContext->fContext,
                                                                     std::move(paint), SkMatrix::I(),
@@ -345,7 +345,7 @@
     } else {
         if (this->caps()->performPartialClearsAsDraws()) {
             GrPaint paint;
-            paint.setColor4f(GrColor4f::FromGrColor(color));
+            paint.setColor4f(SkPMColor4f::FromBytes_RGBA(color));
             SkRect scissor = SkRect::Make(clip.scissorRect());
             std::unique_ptr<GrDrawOp> op(GrRectOpFactory::MakeNonAAFill(fContext, std::move(paint),
                                                                         SkMatrix::I(), scissor,
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
index f78ef18..0406aa3 100644
--- a/src/gpu/SkGr.cpp
+++ b/src/gpu/SkGr.cpp
@@ -254,14 +254,6 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
-GrColor4f SkColor4fToUnpremulGrColor4f(SkColor4f c, const GrColorSpaceInfo& colorSpaceInfo) {
-    GrColor4f color = GrColor4f::FromRGBA4f(c);
-    if (auto* xform = colorSpaceInfo.colorSpaceXformFromSRGB()) {
-        color = xform->apply(color);
-    }
-    return color;
-}
-
 SkPMColor4f SkColorToPMColor4f(SkColor c, const GrColorSpaceInfo& colorSpaceInfo) {
     SkColor4f color = SkColor4f::FromColor(c);
     if (auto* xform = colorSpaceInfo.colorSpaceXformFromSRGB()) {
@@ -365,7 +357,10 @@
                                            SkBlendMode* primColorMode,
                                            GrPaint* grPaint) {
     // Convert SkPaint color to 4f format in the destination color space
-    GrColor4f origColor = SkColor4fToUnpremulGrColor4f(skPaint.getColor4f(), colorSpaceInfo);
+    SkColor4f origColor = skPaint.getColor4f();
+    if (auto* xform = colorSpaceInfo.colorSpaceXformFromSRGB()) {
+        origColor = xform->apply(origColor);
+    }
 
     const GrFPArgs fpArgs(context, &viewM, skPaint.getFilterQuality(), &colorSpaceInfo);
 
@@ -396,7 +391,7 @@
             // The geometry processor will insert the primitive color to start the color chain, so
             // the GrPaint color will be ignored.
 
-            SkPMColor4f shaderInput = origColor.opaque().asRGBA4f<kPremul_SkAlphaType>();
+            SkPMColor4f shaderInput = origColor.makeOpaque().premul();
             shaderFP = GrFragmentProcessor::OverrideInput(std::move(shaderFP), shaderInput);
             shaderFP = GrXfermodeFragmentProcessor::MakeFromSrcProcessor(std::move(shaderFP),
                                                                          *primColorMode);
@@ -412,28 +407,29 @@
                 // No gamut conversion - paintAlpha is a (linear) alpha value, splatted to all
                 // color channels. It's value should be treated as the same in ANY color space.
                 grPaint->addColorFragmentProcessor(GrConstColorProcessor::Make(
-                    GrColorToPMColor4f(paintAlpha),
+                    SkPMColor4f::FromBytes_RGBA(paintAlpha),
                     GrConstColorProcessor::InputMode::kModulateRGBA));
             }
         } else {
-            // The shader's FP sees the paint unpremul color
-            grPaint->setColor4f(origColor);
+            // The shader's FP sees the paint *unpremul* color
+            SkPMColor4f origColorAsPM = { origColor.fR, origColor.fG, origColor.fB, origColor.fA };
+            grPaint->setColor4f(origColorAsPM);
             grPaint->addColorFragmentProcessor(std::move(shaderFP));
         }
     } else {
         if (primColorMode) {
             // There is a blend between the primitive color and the paint color. The blend considers
             // the opaque paint color. The paint's alpha is applied to the post-blended color.
-            auto processor = GrConstColorProcessor::Make(
-                    origColor.opaque().asRGBA4f<kPremul_SkAlphaType>(),
-                    GrConstColorProcessor::InputMode::kIgnore);
+            SkPMColor4f opaqueColor = origColor.makeOpaque().premul();
+            auto processor = GrConstColorProcessor::Make(opaqueColor,
+                                                         GrConstColorProcessor::InputMode::kIgnore);
             processor = GrXfermodeFragmentProcessor::MakeFromSrcProcessor(std::move(processor),
                                                                           *primColorMode);
             if (processor) {
                 grPaint->addColorFragmentProcessor(std::move(processor));
             }
 
-            grPaint->setColor4f(origColor.opaque());
+            grPaint->setColor4f(opaqueColor);
 
             // We can ignore origColor here - alpha is unchanged by gamma
             GrColor paintAlpha = GrColorPackA4(skPaint.getAlpha());
@@ -441,7 +437,7 @@
                 // No gamut conversion - paintAlpha is a (linear) alpha value, splatted to all
                 // color channels. It's value should be treated as the same in ANY color space.
                 grPaint->addColorFragmentProcessor(GrConstColorProcessor::Make(
-                    GrColorToPMColor4f(paintAlpha),
+                    SkPMColor4f::FromBytes_RGBA(paintAlpha),
                     GrConstColorProcessor::InputMode::kModulateRGBA));
             }
         } else {
@@ -454,9 +450,8 @@
     SkColorFilter* colorFilter = skPaint.getColorFilter();
     if (colorFilter) {
         if (applyColorFilterToPaintColor) {
-            grPaint->setColor4f(GrColor4f::FromRGBA4f(
-                    colorFilter->filterColor4f(origColor.asRGBA4f<kUnpremul_SkAlphaType>(),
-                                               colorSpaceInfo.colorSpace())).premul());
+            grPaint->setColor4f(
+                    colorFilter->filterColor4f(origColor, colorSpaceInfo.colorSpace()).premul());
         } else {
             auto cfFP = colorFilter->asFragmentProcessor(context, colorSpaceInfo);
             if (cfFP) {
diff --git a/src/gpu/SkGr.h b/src/gpu/SkGr.h
index 2159cd9..d03ac5a 100644
--- a/src/gpu/SkGr.h
+++ b/src/gpu/SkGr.h
@@ -57,10 +57,6 @@
     return GrColorPackRGBA(r, g, b, a);
 }
 
-/** Transform an SkColor (sRGB bytes) or SkColor4f (sRGB floats) to GrColor4f
-    for the specified color space info. */
-GrColor4f SkColor4fToUnpremulGrColor4f(SkColor4f, const GrColorSpaceInfo&);
-
 /** Similar, but using SkPMColor4f. */
 SkPMColor4f SkColorToPMColor4f(SkColor, const GrColorSpaceInfo&);
 
diff --git a/src/gpu/effects/GrConstColorProcessor.cpp b/src/gpu/effects/GrConstColorProcessor.cpp
index 7cf221b..82ef77a 100644
--- a/src/gpu/effects/GrConstColorProcessor.cpp
+++ b/src/gpu/effects/GrConstColorProcessor.cpp
@@ -86,7 +86,7 @@
             uint32_t r = d->fRandom->nextULessThan(a + 1);
             uint32_t g = d->fRandom->nextULessThan(a + 1);
             uint32_t b = d->fRandom->nextULessThan(a + 1);
-            color = GrColorToPMColor4f(GrColorPackRGBA(r, g, b, a));
+            color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(r, g, b, a));
             break;
         }
         case 1:
@@ -94,7 +94,7 @@
             break;
         case 2:
             uint32_t c = d->fRandom->nextULessThan(0x100);
-            color = GrColorToPMColor4f(c | (c << 8) | (c << 16) | (c << 24));
+            color = SkPMColor4f::FromBytes_RGBA(c | (c << 8) | (c << 16) | (c << 24));
             break;
     }
     InputMode mode = static_cast<InputMode>(d->fRandom->nextULessThan(kInputModeCnt));
diff --git a/src/gpu/effects/GrConstColorProcessor.fp b/src/gpu/effects/GrConstColorProcessor.fp
index fd45328..1a301ce 100644
--- a/src/gpu/effects/GrConstColorProcessor.fp
+++ b/src/gpu/effects/GrConstColorProcessor.fp
@@ -71,7 +71,7 @@
             uint32_t r = d->fRandom->nextULessThan(a+1);
             uint32_t g = d->fRandom->nextULessThan(a+1);
             uint32_t b = d->fRandom->nextULessThan(a+1);
-            color = GrColorToPMColor4f(GrColorPackRGBA(r, g, b, a));
+            color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(r, g, b, a));
             break;
         }
         case 1:
@@ -79,7 +79,7 @@
             break;
         case 2:
             uint32_t c = d->fRandom->nextULessThan(0x100);
-            color = GrColorToPMColor4f(c | (c << 8) | (c << 16) | (c << 24));
+            color = SkPMColor4f::FromBytes_RGBA(c | (c << 8) | (c << 16) | (c << 24));
             break;
     }
     InputMode mode = static_cast<InputMode>(d->fRandom->nextULessThan(kInputModeCnt));
diff --git a/src/gpu/mtl/GrMtlGpuCommandBuffer.mm b/src/gpu/mtl/GrMtlGpuCommandBuffer.mm
index 72e5c2e..b982577 100644
--- a/src/gpu/mtl/GrMtlGpuCommandBuffer.mm
+++ b/src/gpu/mtl/GrMtlGpuCommandBuffer.mm
@@ -185,7 +185,8 @@
     // if we end up here from absClear, the clear bounds may be bigger than the RT proxy bounds -
     // but in that case, scissor should be enabled, so this check should still succeed
     SkASSERT(!clip.scissorEnabled() || clip.scissorRect().contains(fBounds));
-    const auto& clear = GrColor4f::FromGrColor(color).fRGBA;
+    float clear[4];
+    GrColorToRGBAFloat(color, clear);
     fRenderPassDesc.colorAttachments[0].clearColor = MTLClearColorMake(clear[0], clear[1], clear[2],
                                                                        clear[3]);
     fRenderPassDesc.colorAttachments[0].loadAction = MTLLoadActionClear;
@@ -241,7 +242,8 @@
             static_cast<GrMtlRenderTarget*>(fRenderTarget)->mtlRenderTexture();
     renderPassDesc.colorAttachments[0].slice = 0;
     renderPassDesc.colorAttachments[0].level = 0;
-    const auto& clearColor = GrColor4f::FromGrColor(fColorLoadAndStoreInfo.fClearColor).fRGBA;
+    float clearColor[4];
+    GrColorToRGBAFloat(fColorLoadAndStoreInfo.fClearColor, clearColor);
     renderPassDesc.colorAttachments[0].clearColor =
             MTLClearColorMake(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);
     renderPassDesc.colorAttachments[0].loadAction =
diff --git a/src/gpu/vk/GrVkGpuCommandBuffer.cpp b/src/gpu/vk/GrVkGpuCommandBuffer.cpp
index e1c795b..edd73fc 100644
--- a/src/gpu/vk/GrVkGpuCommandBuffer.cpp
+++ b/src/gpu/vk/GrVkGpuCommandBuffer.cpp
@@ -99,10 +99,10 @@
                                                                      vkStencilOps);
     }
 
-    cbInfo.fColorClearValue.color.float32[0] = fClearColor.fRGBA[0];
-    cbInfo.fColorClearValue.color.float32[1] = fClearColor.fRGBA[1];
-    cbInfo.fColorClearValue.color.float32[2] = fClearColor.fRGBA[2];
-    cbInfo.fColorClearValue.color.float32[3] = fClearColor.fRGBA[3];
+    cbInfo.fColorClearValue.color.float32[0] = fClearColor[0];
+    cbInfo.fColorClearValue.color.float32[1] = fClearColor[1];
+    cbInfo.fColorClearValue.color.float32[2] = fClearColor[2];
+    cbInfo.fColorClearValue.color.float32[3] = fClearColor[3];
 
     if (VK_ATTACHMENT_LOAD_OP_CLEAR == fVkColorLoadOp) {
         cbInfo.fBounds = SkRect::MakeWH(vkRT->width(), vkRT->height());
@@ -240,7 +240,7 @@
 
     this->INHERITED::set(rt, origin);
 
-    fClearColor = GrColor4f::FromGrColor(colorInfo.fClearColor);
+    GrColorToRGBAFloat(colorInfo.fClearColor, fClearColor);
 
     get_vk_load_store_ops(colorInfo.fLoadOp, colorInfo.fStoreOp,
                           &fVkColorLoadOp, &fVkColorStoreOp);
diff --git a/src/gpu/vk/GrVkGpuCommandBuffer.h b/src/gpu/vk/GrVkGpuCommandBuffer.h
index c00e4ae..6aad0c2 100644
--- a/src/gpu/vk/GrVkGpuCommandBuffer.h
+++ b/src/gpu/vk/GrVkGpuCommandBuffer.h
@@ -199,7 +199,7 @@
     VkAttachmentStoreOp         fVkColorStoreOp;
     VkAttachmentLoadOp          fVkStencilLoadOp;
     VkAttachmentStoreOp         fVkStencilStoreOp;
-    GrColor4f                   fClearColor;
+    float                       fClearColor[4];
     GrVkPipelineState*          fLastPipelineState;
 
     typedef GrGpuRTCommandBuffer INHERITED;
diff --git a/src/shaders/SkPerlinNoiseShader.cpp b/src/shaders/SkPerlinNoiseShader.cpp
index d778448..23b8103 100644
--- a/src/shaders/SkPerlinNoiseShader.cpp
+++ b/src/shaders/SkPerlinNoiseShader.cpp
@@ -1442,7 +1442,7 @@
             // color space of the noise. Either way, this case (and the GLSL) need to convert to
             // the destination.
             auto inner =
-                    GrConstColorProcessor::Make(GrColorToPMColor4f(0x80404040),
+                    GrConstColorProcessor::Make(SkPMColor4f::FromBytes_RGBA(0x80404040),
                                                 GrConstColorProcessor::InputMode::kModulateRGBA);
             return GrFragmentProcessor::MulChildByInputAlpha(std::move(inner));
         }
diff --git a/tests/GrCCPRTest.cpp b/tests/GrCCPRTest.cpp
index 01ba443..6b0e162 100644
--- a/tests/GrCCPRTest.cpp
+++ b/tests/GrCCPRTest.cpp
@@ -83,7 +83,7 @@
         SkASSERT(this->valid());
 
         GrPaint paint;
-        paint.setColor4f(GrColor4f(0, 1, 0, 1));
+        paint.setColor4f({ 0, 1, 0, 1 });
 
         GrNoClip noClip;
         SkIRect clipBounds = SkIRect::MakeWH(kCanvasSize, kCanvasSize);
@@ -105,7 +105,7 @@
                 &clipBounds, &matrix, &shape, GrAAType::kCoverage, false});
     }
 
-    void clipFullscreenRect(SkPath clipPath, GrColor4f color = GrColor4f(0, 1, 0, 1)) {
+    void clipFullscreenRect(SkPath clipPath, SkPMColor4f color = { 0, 1, 0, 1 }) {
         SkASSERT(this->valid());
 
         GrPaint paint;
diff --git a/tests/OnFlushCallbackTest.cpp b/tests/OnFlushCallbackTest.cpp
index 7dae0ed..991a219 100644
--- a/tests/OnFlushCallbackTest.cpp
+++ b/tests/OnFlushCallbackTest.cpp
@@ -369,7 +369,7 @@
                 rtc->clear(&r, op->color(), GrRenderTargetContext::CanClearFullscreen::kNo);
 #else
                 GrPaint paint;
-                paint.setColor4f(GrColor4f::FromGrColor(op->color()));
+                paint.setColor4f(SkPMColor4f::FromBytes_RGBA(op->color()));
                 std::unique_ptr<GrDrawOp> drawOp(NonAARectOp::Make(std::move(paint),
                                                                    SkRect::Make(r)));
                 rtc->priv().testingOnly_addDrawOp(std::move(drawOp));
diff --git a/tests/ProcessorTest.cpp b/tests/ProcessorTest.cpp
index 6b6b6d5..af0de50 100644
--- a/tests/ProcessorTest.cpp
+++ b/tests/ProcessorTest.cpp
@@ -231,16 +231,16 @@
     // Delta must be less than 0.5 to prevent over/underflow issues with the input color
     SkASSERT(delta <= 0.5);
 
-    GrColor color = GrColorPackRGBA((uint8_t)j, (uint8_t)(i + j), (uint8_t)(2 * j - i), (uint8_t)i);
-    GrColor4f color4f = GrColor4f::FromGrColor(color);
+    SkColor color = SkColorSetARGB((uint8_t)i, (uint8_t)j, (uint8_t)(i + j), (uint8_t)(2 * j - i));
+    SkColor4f color4f = SkColor4f::FromColor(color);
     for (int i = 0; i < 4; i++) {
-        if (color4f.fRGBA[i] > 0.5) {
-            color4f.fRGBA[i] -= delta;
+        if (color4f[i] > 0.5) {
+            color4f[i] -= delta;
         } else {
-            color4f.fRGBA[i] += delta;
+            color4f[i] += delta;
         }
     }
-    return color4f.premul().toGrColor();
+    return color4f.premul().toBytes_RGBA();
 }
 
 void test_draw_op(GrContext* context,
@@ -378,12 +378,12 @@
                       const GrColor& out1, const GrColor& out2, const GrColor& out3,
                       bool alphaModulation) {
     // Convert to floating point, which is the number space the FP operates in (more or less)
-    SkPMColor4f in1f = GrColor4f::FromGrColor(in1).asRGBA4f<kPremul_SkAlphaType>();
-    SkPMColor4f in2f = GrColor4f::FromGrColor(in2).asRGBA4f<kPremul_SkAlphaType>();
-    SkPMColor4f in3f = GrColor4f::FromGrColor(in3).asRGBA4f<kPremul_SkAlphaType>();
-    SkPMColor4f out1f = GrColor4f::FromGrColor(out1).asRGBA4f<kPremul_SkAlphaType>();
-    SkPMColor4f out2f = GrColor4f::FromGrColor(out2).asRGBA4f<kPremul_SkAlphaType>();
-    SkPMColor4f out3f = GrColor4f::FromGrColor(out3).asRGBA4f<kPremul_SkAlphaType>();
+    SkPMColor4f in1f = SkPMColor4f::FromBytes_RGBA(in1);
+    SkPMColor4f in2f = SkPMColor4f::FromBytes_RGBA(in2);
+    SkPMColor4f in3f = SkPMColor4f::FromBytes_RGBA(in3);
+    SkPMColor4f out1f = SkPMColor4f::FromBytes_RGBA(out1);
+    SkPMColor4f out2f = SkPMColor4f::FromBytes_RGBA(out2);
+    SkPMColor4f out3f = SkPMColor4f::FromBytes_RGBA(out3);
 
     // Reconstruct the output of the FP before the shader modulated its color with the input value.
     // When the original input is very small, it may cause the final output color to round
@@ -402,19 +402,16 @@
 
     // With reconstructed pre-modulated FP output, derive the expected value of fp * input for each
     // of the transformed input colors.
-    int mR = modulation_index(0, alphaModulation);
-    int mG = modulation_index(1, alphaModulation);
-    int mB = modulation_index(2, alphaModulation);
-    GrColor4f expected1 = GrColor4f(fpPreModulation.fR * in1f[mR], fpPreModulation.fG * in1f[mG],
-                                    fpPreModulation.fB * in1f[mB], fpPreModulation.fA * in1f.fA);
-    GrColor4f expected2 = GrColor4f(fpPreModulation.fR * in2f[mR], fpPreModulation.fG * in2f[mG],
-                                    fpPreModulation.fB * in2f[mB], fpPreModulation.fA * in2f.fA);
-    GrColor4f expected3 = GrColor4f(fpPreModulation.fR * in3f[mR], fpPreModulation.fG * in3f[mG],
-                                    fpPreModulation.fB * in3f[mB], fpPreModulation.fA * in3f.fA);
+    SkPMColor4f expected1 = alphaModulation ? (fpPreModulation * in1f.fA)
+                                            : (fpPreModulation * in1f);
+    SkPMColor4f expected2 = alphaModulation ? (fpPreModulation * in2f.fA)
+                                            : (fpPreModulation * in2f);
+    SkPMColor4f expected3 = alphaModulation ? (fpPreModulation * in3f.fA)
+                                            : (fpPreModulation * in3f);
 
-    return fuzzy_color_equals(out1f, expected1.asRGBA4f<kPremul_SkAlphaType>()) &&
-           fuzzy_color_equals(out2f, expected2.asRGBA4f<kPremul_SkAlphaType>()) &&
-           fuzzy_color_equals(out3f, expected3.asRGBA4f<kPremul_SkAlphaType>());
+    return fuzzy_color_equals(out1f, expected1) &&
+           fuzzy_color_equals(out2f, expected2) &&
+           fuzzy_color_equals(out3f, expected3);
 }
 
 DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(ProcessorOptimizationValidationTest, reporter, ctxInfo) {
@@ -555,15 +552,14 @@
                         }
                     }
 
-                    SkPMColor4f input4f =
-                            GrColor4f::FromGrColor(input).asRGBA4f<kPremul_SkAlphaType>();
-                    GrColor4f output4f = GrColor4f::FromGrColor(output);
+                    SkPMColor4f input4f = SkPMColor4f::FromBytes_RGBA(input);
+                    SkPMColor4f output4f = SkPMColor4f::FromBytes_RGBA(output);
                     SkPMColor4f expected4f;
                     if (fp->hasConstantOutputForConstantInput(input4f, &expected4f)) {
-                        float rDiff = fabsf(output4f.fRGBA[0] - expected4f.fR);
-                        float gDiff = fabsf(output4f.fRGBA[1] - expected4f.fG);
-                        float bDiff = fabsf(output4f.fRGBA[2] - expected4f.fB);
-                        float aDiff = fabsf(output4f.fRGBA[3] - expected4f.fA);
+                        float rDiff = fabsf(output4f.fR - expected4f.fR);
+                        float gDiff = fabsf(output4f.fG - expected4f.fG);
+                        float bDiff = fabsf(output4f.fB - expected4f.fB);
+                        float aDiff = fabsf(output4f.fA - expected4f.fA);
                         static constexpr float kTol = 4 / 255.f;
                         if (rDiff > kTol || gDiff > kTol || bDiff > kTol || aDiff > kTol) {
                             if (constMessage.isEmpty()) {
@@ -575,9 +571,8 @@
                                         "expected(%f, %f, %f, %f)", fp->name(),
                                         SkTMax(rDiff, SkTMax(gDiff, SkTMax(bDiff, aDiff))), kTol,
                                         input4f.fR, input4f.fG, input4f.fB, input4f.fA,
-                                        output4f.fRGBA[0], output4f.fRGBA[1], output4f.fRGBA[2],
-                                        output4f.fRGBA[3], expected4f.fR, expected4f.fG,
-                                        expected4f.fB, expected4f.fA);
+                                        output4f.fR, output4f.fG, output4f.fB, output4f.fA,
+                                        expected4f.fR, expected4f.fG, expected4f.fB, expected4f.fA);
                             }
                         }
                     }