add auto SkPMFloat <-> Sk4f conversion

BUG=skia:

Review URL: https://codereview.chromium.org/954323002
diff --git a/src/core/SkPMFloat.h b/src/core/SkPMFloat.h
index d2d83d0..7c093a6 100644
--- a/src/core/SkPMFloat.h
+++ b/src/core/SkPMFloat.h
@@ -3,11 +3,21 @@
 
 #include "SkTypes.h"
 #include "SkColor.h"
+#include "Sk4x.h"
 
 // A pre-multiplied color in the same order as SkPMColor storing each component as a float.
 struct SK_STRUCT_ALIGN(16) SkPMFloat {
     float fColor[4];
 
+    // Normal POD copies and do-nothing initialization.
+    SkPMFloat()                            = default;
+    SkPMFloat(const SkPMFloat&)            = default;
+    SkPMFloat& operator=(const SkPMFloat&) = default;
+
+    // Freely autoconvert between SkPMFloat and Sk4f.
+    /*implicit*/ SkPMFloat(const Sk4f& fs) { fs.storeAligned(fColor); }
+    /*implicit*/ operator Sk4f() const { return Sk4f::LoadAligned(fColor); }
+
     float a() const { return fColor[SK_A32_SHIFT / 8]; }
     float r() const { return fColor[SK_R32_SHIFT / 8]; }
     float g() const { return fColor[SK_G32_SHIFT / 8]; }
diff --git a/tests/PMFloatTest.cpp b/tests/PMFloatTest.cpp
index 94cd663..f722e80 100644
--- a/tests/PMFloatTest.cpp
+++ b/tests/PMFloatTest.cpp
@@ -2,6 +2,7 @@
 #include "Test.h"
 
 DEF_TEST(SkPMFloat, r) {
+    // Test SkPMColor <-> SkPMFloat
     SkPMColor c = SkPreMultiplyColor(0xFFCC9933);
 
     SkPMFloat pmf;
@@ -13,6 +14,7 @@
 
     REPORTER_ASSERT(r, c == pmf.get());
 
+    // Test clamping.
     SkPMFloat unclamped;
     unclamped.setA(+2.0f);
     unclamped.setR(+0.2f);
@@ -26,4 +28,13 @@
     REPORTER_ASSERT(r, SkScalarNearlyEqual(0.2f, clamped.r()));
     REPORTER_ASSERT(r, SkScalarNearlyEqual(0.0f, clamped.g()));
     REPORTER_ASSERT(r, SkScalarNearlyEqual(0.0f, clamped.b()));
+
+    // Test SkPMFloat <-> Sk4f conversion.
+    Sk4f fs = clamped;
+    SkPMFloat scaled = fs.multiply(Sk4f(4,4,4,4));
+
+    REPORTER_ASSERT(r, SkScalarNearlyEqual(4.0f, scaled.a()));
+    REPORTER_ASSERT(r, SkScalarNearlyEqual(0.8f, scaled.r()));
+    REPORTER_ASSERT(r, SkScalarNearlyEqual(0.0f, scaled.g()));
+    REPORTER_ASSERT(r, SkScalarNearlyEqual(0.0f, scaled.b()));
 }