Chromium Code Reviews| Index: src/core/SkPM4f.h |
| diff --git a/src/core/SkPM4f.h b/src/core/SkPM4f.h |
| index fb22783dcc44203a8c3931982f645e3de7dde956..bf6c0ef8f069271c0fa2b3b03ae003b6b585cdb8 100644 |
| --- a/src/core/SkPM4f.h |
| +++ b/src/core/SkPM4f.h |
| @@ -9,29 +9,73 @@ |
| #define SkPM4f_DEFINED |
| #include "SkColorPriv.h" |
| +#include "SkNx.h" |
| + |
| +static inline Sk4f swizzle_rb(const Sk4f& x) { |
| + return Sk4f(x[2], x[1], x[0], x[3]); |
|
herb_g
2016/03/07 16:11:04
How about SkNx_shuffle?
return SkNx_shuffle<2, 1,
|
| +} |
| + |
| +static inline Sk4f swizzle_rgba_to_pmorder(const Sk4f& x) { |
| +#ifdef SK_PMCOLOR_IS_BGRA |
| + return Sk4f(x[2], x[1], x[0], x[3]); |
|
herb_g
2016/03/07 16:11:04
Why not call swizzle_rb here?
|
| +#else |
| + return x; |
| +#endif |
| +} |
| + |
| +static inline Sk4f swizzle_pmorder_to_rgba(const Sk4f& x) { |
| +#ifdef SK_PMCOLOR_IS_BGRA |
| + return Sk4f(x[2], x[1], x[0], x[3]); |
| +#else |
| + return x; |
| +#endif |
| +} |
| /* |
| - * The float values are 0...1 premultiplied |
| + * The float values are 0...1 premultiplied in RGBA order (regardless of SkPMColor order) |
| */ |
| struct SkPM4f { |
| enum { |
| +#if 0 |
| A = SK_A32_SHIFT/8, |
|
herb_g
2016/03/07 16:11:04
Remove dead code?
|
| R = SK_R32_SHIFT/8, |
| G = SK_G32_SHIFT/8, |
| B = SK_B32_SHIFT/8, |
| +#else |
| + R, G, B, A, |
| +#endif |
| }; |
| float fVec[4]; |
| float a() const { return fVec[A]; } |
| - SkColor4f unpremul() const; |
| + SkPM4f rgba() const { return *this; } |
| + SkPM4f bgra() const { return{{ fVec[2], fVec[1], fVec[0], fVec[3] }}; } |
| + SkPM4f pmorder() const { |
| +#ifdef SK_PMCOLOR_IS_BGRA |
| + return this->bgra(); |
| +#else |
| + return this->rgba(); |
| +#endif |
| + } |
| + 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); |
| - // half-float routines |
| + 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_rgba_to_pmorder(this->to4f()); } |
| + |
| void toF16(uint16_t[4]) const; |
| uint64_t toF16() const; // 4 float16 values packed into uint64_t |
| - static SkPM4f FromF16(const uint16_t[4]); |
| + |
| + SkColor4f unpremul() const; |
| #ifdef SK_DEBUG |
| void assertIsUnit() const; |
| @@ -42,5 +86,4 @@ struct SkPM4f { |
| typedef SkPM4f (*SkXfermodeProc4f)(const SkPM4f& src, const SkPM4f& dst); |
| - |
| #endif |