diff --git a/include/private/GrColor.h b/include/private/GrColor.h
index ab03ab2..f2f449f 100644
--- a/include/private/GrColor.h
+++ b/include/private/GrColor.h
@@ -11,10 +11,8 @@
 #ifndef GrColor_DEFINED
 #define GrColor_DEFINED
 
-#include "GrTypes.h"
 #include "SkColor.h"
 #include "SkColorPriv.h"
-#include "SkUnPreMultiply.h"
 
 /**
  * GrColor is 4 bytes for R, G, B, A, in a specific order defined below. Whether the color is
@@ -77,23 +75,6 @@
 #define GrColor_ILLEGAL     (~(0xFF << GrColor_SHIFT_A))
 
 #define GrColor_WHITE 0xFFFFFFFF
-#define GrColor_TRANSPARENT_BLACK 0x0
-
-/**
- * Assert in debug builds that a GrColor is premultiplied.
- */
-static inline void GrColorIsPMAssert(GrColor SkDEBUGCODE(c)) {
-#ifdef SK_DEBUG
-    unsigned a = GrColorUnpackA(c);
-    unsigned r = GrColorUnpackR(c);
-    unsigned g = GrColorUnpackG(c);
-    unsigned b = GrColorUnpackB(c);
-
-    SkASSERT(r <= a);
-    SkASSERT(g <= a);
-    SkASSERT(b <= a);
-#endif
-}
 
 static inline GrColor GrColorMul(GrColor c0, GrColor c1) {
     U8CPU r = SkMulDiv255Round(GrColorUnpackR(c0), GrColorUnpackR(c1));
@@ -109,9 +90,4 @@
     return value * ONE_OVER_255;
 }
 
-/** Determines whether the color is opaque or not. */
-static inline bool GrColorIsOpaque(GrColor color) {
-    return (color & (0xFFU << GrColor_SHIFT_A)) == (0xFFU << GrColor_SHIFT_A);
-}
-
 #endif
diff --git a/src/gpu/GrPaint.h b/src/gpu/GrPaint.h
index f6173b7..b900c24 100644
--- a/src/gpu/GrPaint.h
+++ b/src/gpu/GrPaint.h
@@ -50,11 +50,6 @@
     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.toBytes_RGBA(); }
-
     void setXPFactory(const GrXPFactory* xpFactory) {
         fXPFactory = xpFactory;
         fTrivial &= !SkToBool(xpFactory);
diff --git a/src/gpu/GrTestUtils.h b/src/gpu/GrTestUtils.h
index 2e8eb06..79c8540 100644
--- a/src/gpu/GrTestUtils.h
+++ b/src/gpu/GrTestUtils.h
@@ -126,7 +126,6 @@
             break;
         }
     }
-    GrColorIsPMAssert(color);
     return color;
 }
 
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
index 1157ec5..168cce6 100644
--- a/src/gpu/SkGr.cpp
+++ b/src/gpu/SkGr.cpp
@@ -400,12 +400,12 @@
             }
 
             // We can ignore origColor here - alpha is unchanged by gamma
-            GrColor paintAlpha = GrColorPackA4(skPaint.getAlpha());
-            if (GrColor_WHITE != paintAlpha) {
+            float paintAlpha = skPaint.getColor4f().fA;
+            if (1.0f != paintAlpha) {
                 // 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(
-                    SkPMColor4f::FromBytes_RGBA(paintAlpha),
+                    { paintAlpha, paintAlpha, paintAlpha, paintAlpha },
                     GrConstColorProcessor::InputMode::kModulateRGBA));
             }
         } else {
@@ -430,12 +430,12 @@
             grPaint->setColor4f(opaqueColor);
 
             // We can ignore origColor here - alpha is unchanged by gamma
-            GrColor paintAlpha = GrColorPackA4(skPaint.getAlpha());
-            if (GrColor_WHITE != paintAlpha) {
+            float paintAlpha = skPaint.getColor4f().fA;
+            if (1.0f != paintAlpha) {
                 // 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(
-                    SkPMColor4f::FromBytes_RGBA(paintAlpha),
+                    { paintAlpha, paintAlpha, paintAlpha, paintAlpha },
                     GrConstColorProcessor::InputMode::kModulateRGBA));
             }
         } else {
diff --git a/src/gpu/ops/GrShadowRRectOp.cpp b/src/gpu/ops/GrShadowRRectOp.cpp
index d92f2a3..52816cc 100644
--- a/src/gpu/ops/GrShadowRRectOp.cpp
+++ b/src/gpu/ops/GrShadowRRectOp.cpp
@@ -669,7 +669,7 @@
     SkScalar blurWidth = random->nextSScalar1() * 72.f;
     bool isCircle = random->nextBool();
     // This op doesn't use a full GrPaint, just a color.
-    GrColor color = paint.getColor();
+    GrColor color = paint.getColor4f().toBytes_RGBA();
     if (isCircle) {
         SkRect circle = GrTest::TestSquare(random);
         SkRRect rrect = SkRRect::MakeOval(circle);
diff --git a/tests/ProcessorTest.cpp b/tests/ProcessorTest.cpp
index d0da21f..e76099c 100644
--- a/tests/ProcessorTest.cpp
+++ b/tests/ProcessorTest.cpp
@@ -576,8 +576,7 @@
                             }
                         }
                     }
-                    if (GrColorIsOpaque(input) && fp->preservesOpaqueInput() &&
-                        !GrColorIsOpaque(output)) {
+                    if (input4f.isOpaque() && fp->preservesOpaqueInput() && !output4f.isOpaque()) {
                         passing = false;
 
                         if (opaqueMessage.isEmpty()) {
