Work toward removing SkPM4f

Added SkColor4f premul/unpremul that just return SkColor4f.
Renamed existing premul to toPM4f. For many uses of SkPM4f,
conversion to pure SkColor4f code was simple. In all other
cases, continue to use SkPM4f for now.

Also convert usage of one-off SkRGBAf class in SkPatchUtils,
and delete that class, along with some truly tautological
unit tests that were the only thing keeping some PM4f API
around.

Bug: skia:
Change-Id: I344c3290ee7af6bbe86c3ff74a2df2f5e87afa38
Reviewed-on: https://skia-review.googlesource.com/156005
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Mike Klein <mtklein@google.com>
diff --git a/src/core/SkBlendMode.cpp b/src/core/SkBlendMode.cpp
index 661ade6..ad7e535 100644
--- a/src/core/SkBlendMode.cpp
+++ b/src/core/SkBlendMode.cpp
@@ -121,20 +121,22 @@
     p->append(stage);
 }
 
-SkPM4f SkBlendMode_Apply(SkBlendMode mode, const SkPM4f& src, const SkPM4f& dst) {
+SkColor4f SkBlendMode_Apply(SkBlendMode mode, const SkColor4f& src, const SkColor4f& dst) {
     // special-case simple/common modes...
     switch (mode) {
-        case SkBlendMode::kClear:   return {{ 0, 0, 0, 0 }};
+        case SkBlendMode::kClear:   return { 0, 0, 0, 0 };
         case SkBlendMode::kSrc:     return src;
         case SkBlendMode::kDst:     return dst;
-        case SkBlendMode::kSrcOver:
-            return SkPM4f::From4f(src.to4f() + dst.to4f() * Sk4f(1 - src.a()));
+        case SkBlendMode::kSrcOver: {
+            Sk4f r = Sk4f::Load(src.vec()) + Sk4f::Load(dst.vec()) * Sk4f(1 - src.fA);
+            return { r[0], r[1], r[2], r[3] };
+        }
         default:
             break;
     }
 
     SkRasterPipeline_<256> p;
-    SkPM4f                 src_storage = src,
+    SkColor4f              src_storage = src,
                            dst_storage = dst,
                            res_storage;
     SkJumper_MemoryCtx src_ctx = { &src_storage, 0 },
diff --git a/src/core/SkBlendModePriv.h b/src/core/SkBlendModePriv.h
index 8d04e09..7b7b300 100644
--- a/src/core/SkBlendModePriv.h
+++ b/src/core/SkBlendModePriv.h
@@ -9,9 +9,9 @@
 #define SkBlendModePriv_DEFINED
 
 #include "SkBlendMode.h"
-#include "SkPM4f.h"
 
 class SkRasterPipeline;
+struct SkColor4f;
 
 bool SkBlendMode_SupportsCoverageAsAlpha(SkBlendMode);
 
@@ -39,7 +39,7 @@
 
 bool SkBlendMode_AsCoeff(SkBlendMode mode, SkBlendModeCoeff* src, SkBlendModeCoeff* dst);
 
-SkPM4f SkBlendMode_Apply(SkBlendMode, const SkPM4f& src, const SkPM4f& dst);
+SkColor4f SkBlendMode_Apply(SkBlendMode, const SkColor4f& src, const SkColor4f& dst);
 
 #if SK_SUPPORT_GPU
 #include "GrXferProcessor.h"
diff --git a/src/core/SkColor.cpp b/src/core/SkColor.cpp
index aa00b19..19dd2c1 100644
--- a/src/core/SkColor.cpp
+++ b/src/core/SkColor.cpp
@@ -133,22 +133,6 @@
     return value;
 }
 
-SkPM4f SkPM4f::FromF16(const uint16_t half[4]) {
-    return {{
-        SkHalfToFloat(half[0]),
-        SkHalfToFloat(half[1]),
-        SkHalfToFloat(half[2]),
-        SkHalfToFloat(half[3])
-    }};
-}
-
-#ifdef SK_DEBUG
-void SkPM4f::assertIsUnit() const {
-    auto c4 = Sk4f::Load(fVec);
-    SkASSERT((c4 >= Sk4f(0)).allTrue() && (c4 <= Sk4f(1)).allTrue());
-}
-#endif
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 SkColor4f SkColor4f::FromColor(SkColor bgra) {
@@ -167,7 +151,7 @@
     return c4;
 }
 
-SkPM4f SkColor4f::premul() const {
+SkPM4f SkColor4f::toPM4f() const {
     auto rgba = Sk4f::Load(this->vec());
     return SkPM4f::From4f(rgba * Sk4f(rgba[3], rgba[3], rgba[3], 1));
 }
diff --git a/src/core/SkColorFilter.cpp b/src/core/SkColorFilter.cpp
index 5360299..3e8c6e9 100644
--- a/src/core/SkColorFilter.cpp
+++ b/src/core/SkColorFilter.cpp
@@ -9,7 +9,6 @@
 #include "SkColorFilter.h"
 #include "SkColorSpaceXformer.h"
 #include "SkNx.h"
-#include "SkPM4f.h"
 #include "SkRasterPipeline.h"
 #include "SkReadBuffer.h"
 #include "SkRefCnt.h"
@@ -65,7 +64,7 @@
 
 #include "SkRasterPipeline.h"
 SkColor4f SkColorFilter::filterColor4f(const SkColor4f& c, SkColorSpace* colorSpace) const {
-    SkPM4f dst, src = c.premul();
+    SkColor4f dst, src = c.premul();
 
     SkSTArenaAlloc<128> alloc;
     SkRasterPipeline    pipeline(&alloc);
diff --git a/src/core/SkDraw_vertices.cpp b/src/core/SkDraw_vertices.cpp
index b9320d4..939d616 100644
--- a/src/core/SkDraw_vertices.cpp
+++ b/src/core/SkDraw_vertices.cpp
@@ -10,7 +10,6 @@
 #include "SkComposeShader.h"
 #include "SkDraw.h"
 #include "SkNx.h"
-#include "SkPM4fPriv.h"
 #include "SkRasterClip.h"
 #include "SkScan.h"
 #include "SkShaderBase.h"
@@ -98,7 +97,7 @@
 };
 
 static bool SK_WARN_UNUSED_RESULT
-update_tricolor_matrix(const SkMatrix& ctmInv, const SkPoint pts[], const SkPM4f colors[],
+update_tricolor_matrix(const SkMatrix& ctmInv, const SkPoint pts[], const SkColor4f colors[],
                        int index0, int index1, int index2, Matrix43* result) {
     SkMatrix m, im;
     m.reset();
@@ -115,9 +114,9 @@
     SkMatrix dstToUnit;
     dstToUnit.setConcat(im, ctmInv);
 
-    Sk4f c0 = colors[index0].to4f(),
-         c1 = colors[index1].to4f(),
-         c2 = colors[index2].to4f();
+    Sk4f c0 = Sk4f::Load(colors[index0].vec()),
+         c1 = Sk4f::Load(colors[index1].vec()),
+         c2 = Sk4f::Load(colors[index2].vec());
 
     Matrix43 colorm;
     (c1 - c0).store(&colorm.fMat[0]);
@@ -136,14 +135,12 @@
 // - convert colors into dst colorspace before interpolation (matches gradients)
 // - apply per-color alpha before interpolation (matches old version of vertices)
 //
-static SkPM4f* convert_colors(const SkColor src[], int count, SkColorSpace* deviceCS,
-                              SkArenaAlloc* alloc) {
-    SkPM4f* dst = alloc->makeArray<SkPM4f>(count);
+static SkColor4f* convert_colors(const SkColor src[], int count, SkColorSpace* deviceCS,
+                                 SkArenaAlloc* alloc) {
+    SkColor4f* dst = alloc->makeArray<SkColor4f>(count);
     if (!deviceCS) {
         for (int i = 0; i < count; ++i) {
-            SkColor4f color4f;
-            swizzle_rb(Sk4f_fromL32(src[i])).store(&color4f);
-            dst[i] = color4f.premul();
+            dst[i] = SkColor4f::FromColor(src[i]).premul();
         }
     } else {
         auto srcCS = SkColorSpace::MakeSRGB();
@@ -210,7 +207,7 @@
     constexpr size_t kDefVertexCount = 16;
     constexpr size_t kOuterSize = sizeof(SkTriColorShader) +
                                  sizeof(SkComposeShader) +
-                                 (2 * sizeof(SkPoint) + sizeof(SkPM4f)) * kDefVertexCount;
+                                 (2 * sizeof(SkPoint) + sizeof(SkColor4f)) * kDefVertexCount;
     SkSTArenaAlloc<kOuterSize> outerAlloc;
 
     // deform vertices using the skeleton if it is passed in
@@ -271,7 +268,7 @@
     VertState::Proc vertProc = state.chooseProc(vmode);
 
     if (colors || textures) {
-        SkPM4f*     dstColors = nullptr;
+        SkColor4f*  dstColors = nullptr;
         Matrix43*   matrix43 = nullptr;
 
         if (colors) {
diff --git a/src/core/SkPM4f.h b/src/core/SkPM4f.h
index f949857..f2720a0 100644
--- a/src/core/SkPM4f.h
+++ b/src/core/SkPM4f.h
@@ -58,42 +58,20 @@
     float b() const { return fVec[B]; }
     float a() const { return fVec[A]; }
 
-    static SkPM4f FromPremulRGBA(float r, float g, float b, float a) {
-        SkPM4f p;
-        p.fVec[R] = r;
-        p.fVec[G] = g;
-        p.fVec[B] = b;
-        p.fVec[A] = a;
-        return p;
-    }
-
     static SkPM4f From4f(const Sk4f& x) {
         SkPM4f pm;
         x.store(pm.fVec);
         return pm;
     }
-    static SkPM4f FromF16(const uint16_t[4]);
     static SkPM4f FromPMColor(SkPMColor);
 
     Sk4f to4f() const { return Sk4f::Load(fVec); }
-    Sk4f to4f_rgba() const { return this->to4f(); }
-    Sk4f to4f_bgra() const { return swizzle_rb(this->to4f()); }
     Sk4f to4f_pmorder() const { return swizzle_rb_if_bgra(this->to4f()); }
 
-    SkPMColor toPMColor() const {
-        return Sk4f_toL32(swizzle_rb_if_bgra(this->to4f()));
-    }
-
     void toF16(uint16_t[4]) const;
     uint64_t toF16() const; // 4 float16 values packed into uint64_t
 
     SkColor4f unpremul() const;
-
-#ifdef SK_DEBUG
-    void assertIsUnit() const;
-#else
-    void assertIsUnit() const {}
-#endif
 };
 
 #endif
diff --git a/src/core/SkPM4fPriv.h b/src/core/SkPM4fPriv.h
index 06007b7..3170eb1 100644
--- a/src/core/SkPM4fPriv.h
+++ b/src/core/SkPM4fPriv.h
@@ -14,26 +14,19 @@
 
 // This file is mostly helper routines for doing color space management.
 // It probably wants a new name, and they likely don't need to be inline.
-//
-// There are two generations of routines in here, the old ones that assumed linear blending,
-// and the new ones assuming as-encoded blending.  We're trying to move to the new as-encoded
-// ones and will hopefully eventually remove all the linear routines.
-//
-// We'll start with the new as-encoded routines first,
-// and shove all the old broken routines towards the bottom.
 
-static inline SkPM4f premul_in_dst_colorspace(SkColor4f color4f,
-                                              SkColorSpace* srcCS, SkColorSpace* dstCS) {
+static inline SkColor4f premul_in_dst_colorspace(SkColor4f color4f,
+                                                 SkColorSpace* srcCS, SkColorSpace* dstCS) {
     // TODO: In the very common case of srcCS being sRGB,
     // can we precompute an sRGB -> dstCS SkColorSpaceXformSteps for each device and use it here?
     SkColorSpaceXformSteps(srcCS, kUnpremul_SkAlphaType,
                            dstCS, kPremul_SkAlphaType)
         .apply(color4f.vec());
 
-    return {{color4f.fR, color4f.fG, color4f.fB, color4f.fA}};
+    return color4f;
 }
 
-static inline SkPM4f premul_in_dst_colorspace(SkColor c, SkColorSpace* dstCS) {
+static inline SkColor4f premul_in_dst_colorspace(SkColor c, SkColorSpace* dstCS) {
     SkColor4f color4f;
     swizzle_rb(Sk4f_fromL32(c)).store(color4f.vec());
 
diff --git a/src/core/SkPixmap.cpp b/src/core/SkPixmap.cpp
index f842afd..4a55504 100644
--- a/src/core/SkPixmap.cpp
+++ b/src/core/SkPixmap.cpp
@@ -17,7 +17,6 @@
 #include "SkImageShader.h"
 #include "SkMask.h"
 #include "SkNx.h"
-#include "SkPM4f.h"
 #include "SkPixmapPriv.h"
 #include "SkReadPixelsRec.h"
 #include "SkSurface.h"
@@ -255,7 +254,8 @@
     const SkColor4f color = origColor.pin();
 
     if (pm.colorType() == kRGBA_F16_SkColorType) {
-        const uint64_t half4 = color.premul().toF16();
+        uint64_t half4;
+        SkFloatToHalf_finite_ftz(Sk4f::Load(color.premul().vec())).store(&half4);
         for (int y = 0; y < pm.height(); ++y) {
             sk_memset64(pm.writable_addr64(0, y), half4, pm.width());
         }
@@ -263,14 +263,14 @@
     }
 
     if (pm.colorType() == kRGBA_F32_SkColorType) {
-        const SkPM4f rgba = color.premul();
+        const SkColor4f rgba = color.premul();
         for (int y = 0; y < pm.height(); ++y) {
             auto row = (float*)pm.writable_addr(0, y);
             for (int x = 0; x < pm.width(); ++x) {
-                row[4*x+0] = rgba.r();
-                row[4*x+1] = rgba.g();
-                row[4*x+2] = rgba.b();
-                row[4*x+3] = rgba.a();
+                row[4*x+0] = rgba.fR;
+                row[4*x+1] = rgba.fG;
+                row[4*x+2] = rgba.fB;
+                row[4*x+3] = rgba.fA;
             }
         }
         return true;
diff --git a/src/core/SkRasterPipeline.h b/src/core/SkRasterPipeline.h
index 5af46f3..4650581 100644
--- a/src/core/SkRasterPipeline.h
+++ b/src/core/SkRasterPipeline.h
@@ -9,9 +9,9 @@
 #define SkRasterPipeline_DEFINED
 
 #include "SkArenaAlloc.h"
+#include "SkColor.h"
 #include "SkImageInfo.h"
 #include "SkNx.h"
-#include "SkPM4f.h"
 #include "SkTArray.h"
 #include "SkTypes.h"
 #include <functional>
@@ -141,9 +141,6 @@
     // Tries to optimize the stage based on the color.
     void append_constant_color(SkArenaAlloc*, const float rgba[4]);
 
-    void append_constant_color(SkArenaAlloc* alloc, const SkPM4f& color) {
-        this->append_constant_color(alloc, color.fVec);
-    }
     void append_constant_color(SkArenaAlloc* alloc, const SkColor4f& color) {
         this->append_constant_color(alloc, color.vec());
     }
diff --git a/src/core/SkRasterPipelineBlitter.cpp b/src/core/SkRasterPipelineBlitter.cpp
index 0761c1b..e53b673 100644
--- a/src/core/SkRasterPipelineBlitter.cpp
+++ b/src/core/SkRasterPipelineBlitter.cpp
@@ -113,7 +113,7 @@
 #else
     SkColorSpace* dstCS = dst.colorSpace();
 #endif
-    SkPM4f paintColor = premul_in_dst_colorspace(paint.getColor4f(), sk_srgb_singleton(), dstCS);
+    SkColor4f paintColor = premul_in_dst_colorspace(paint.getColor4f(), sk_srgb_singleton(), dstCS);
 
     auto shader = as_SB(paint.getShader());
 
@@ -121,14 +121,14 @@
     if (!shader) {
         // Having no shader makes things nice and easy... just use the paint color.
         shaderPipeline.append_constant_color(alloc, paintColor);
-        bool is_opaque    = paintColor.a() == 1.0f,
+        bool is_opaque    = paintColor.fA == 1.0f,
              is_constant  = true;
         return SkRasterPipelineBlitter::Create(dst, paint, alloc,
                                                shaderPipeline, nullptr,
                                                is_opaque, is_constant);
     }
 
-    bool is_opaque    = shader->isOpaque() && paintColor.a() == 1.0f;
+    bool is_opaque    = shader->isOpaque() && paintColor.fA == 1.0f;
     bool is_constant  = shader->isConstant();
 
     // Check whether the shader prefers to run in burst mode.
@@ -140,9 +140,9 @@
     }
 
     if (shader->appendStages({&shaderPipeline, alloc, dstCS, paint, nullptr, ctm})) {
-        if (paintColor.a() != 1.0f) {
+        if (paintColor.fA != 1.0f) {
             shaderPipeline.append(SkRasterPipeline::scale_1_float,
-                                  alloc->make<float>(paintColor.a()));
+                                  alloc->make<float>(paintColor.fA));
         }
         return SkRasterPipelineBlitter::Create(dst, paint, alloc, shaderPipeline, nullptr,
                                                is_opaque, is_constant);
@@ -216,14 +216,14 @@
 
     // A pipeline that's still constant here can collapse back into a constant color.
     if (is_constant) {
-        SkPM4f constantColor;
+        SkColor4f constantColor;
         SkJumper_MemoryCtx constantColorPtr = { &constantColor, 0 };
         colorPipeline->append(SkRasterPipeline::store_f32, &constantColorPtr);
         colorPipeline->run(0,0,1,1);
         colorPipeline->reset();
         colorPipeline->append_constant_color(alloc, constantColor);
 
-        is_opaque = constantColor.a() == 1.0f;
+        is_opaque = constantColor.fA == 1.0f;
     }
 
     // We can strength-reduce SrcOver into Src when opaque.