#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]; }
#include "Test.h"
DEF_TEST(SkPMFloat, r) {
+ // Test SkPMColor <-> SkPMFloat
SkPMColor c = SkPreMultiplyColor(0xFFCC9933);
SkPMFloat pmf;
REPORTER_ASSERT(r, c == pmf.get());
+ // Test clamping.
SkPMFloat unclamped;
unclamped.setA(+2.0f);
unclamped.setR(+0.2f);
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()));
}