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()));
}