| Index: src/core/SkColor.cpp
|
| diff --git a/src/core/SkColor.cpp b/src/core/SkColor.cpp
|
| index a21f0192398f95ba3c4256a41c0d2ff47da4ed64..c9f4a1433dfd9a856c5d7f6bed4725147e0bde89 100644
|
| --- a/src/core/SkColor.cpp
|
| +++ b/src/core/SkColor.cpp
|
| @@ -100,3 +100,37 @@ SkColor SkHSVToColor(U8CPU a, const SkScalar hsv[3]) {
|
| }
|
| return SkColorSetARGB(a, r, g, b);
|
| }
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////////////////////////
|
| +#include "SkNx.h"
|
| +
|
| +SkColor4f SkColor4f::Pin(float a, float r, float g, float b) {
|
| + SkColor4f c4;
|
| + Sk4f::Min(Sk4f::Max(Sk4f(a, r, g, b), Sk4f(0)), Sk4f(1)).store(c4.vec());
|
| + return c4;
|
| +}
|
| +
|
| +SkColor4f SkColor4f::FromColor(SkColor c) {
|
| + Sk4f value = SkNx_shuffle<3,2,1,0>(SkNx_cast<float>(Sk4b::Load((const uint8_t*)&c)));
|
| + SkColor4f c4;
|
| + (value * Sk4f(1.0f / 255)).store(c4.vec());
|
| + return c4;
|
| +}
|
| +
|
| +SkPM4f SkColor4f::premul() const {
|
| + auto src = Sk4f::Load(this->pin().vec());
|
| + float srcAlpha = src.kth<0>(); // need the pinned version of our alpha
|
| + src = src * Sk4f(1, srcAlpha, srcAlpha, srcAlpha);
|
| +
|
| +#ifdef SK_PMCOLOR_IS_BGRA
|
| + // ARGB -> BGRA
|
| + Sk4f dst = SkNx_shuffle<3,2,1,0>(src);
|
| +#else
|
| + // ARGB -> RGBA
|
| + Sk4f dst = SkNx_shuffle<1,2,3,0>(src);
|
| +#endif
|
| +
|
| + SkPM4f pm4;
|
| + dst.store(pm4.fVec);
|
| + return pm4;
|
| +}
|
|
|