SkPMFloat.h revision 0aebf5d0d3a2aef38a71885c85303583fdeaad57
1#ifndef SkPM_DEFINED
2#define SkPM_DEFINED
3
4#include "SkTypes.h"
5#include "SkColor.h"
6#include "Sk4x.h"
7
8// A pre-multiplied color storing each component as a float in the range [0, 255].
9class SK_STRUCT_ALIGN(16) SkPMFloat {
10public:
11    // Normal POD copies and do-nothing initialization.
12    SkPMFloat()                            = default;
13    SkPMFloat(const SkPMFloat&)            = default;
14    SkPMFloat& operator=(const SkPMFloat&) = default;
15
16    // Freely autoconvert between SkPMFloat and Sk4f.
17    /*implicit*/ SkPMFloat(const Sk4f& fs) { fs.storeAligned(fColor); }
18    /*implicit*/ operator Sk4f() const { return Sk4f::LoadAligned(fColor); }
19
20    float a() const { return fColor[SK_A32_SHIFT / 8]; }
21    float r() const { return fColor[SK_R32_SHIFT / 8]; }
22    float g() const { return fColor[SK_G32_SHIFT / 8]; }
23    float b() const { return fColor[SK_B32_SHIFT / 8]; }
24
25    void setA(float val) { fColor[SK_A32_SHIFT / 8] = val; }
26    void setR(float val) { fColor[SK_R32_SHIFT / 8] = val; }
27    void setG(float val) { fColor[SK_G32_SHIFT / 8] = val; }
28    void setB(float val) { fColor[SK_B32_SHIFT / 8] = val; }
29
30    void set(SkPMColor);
31
32    // get() and clamped() round component values to the nearest integer.
33    SkPMColor     get() const;  // May SkASSERT(this->isValid()).  Some implementations may clamp.
34    SkPMColor clamped() const;  // Will clamp all values to [0, 255].  Then may assert isValid().
35
36    bool isValid() const {
37        return this->a() >= 0 && this->a() <= 255
38            && this->r() >= 0 && this->r() <= this->a()
39            && this->g() >= 0 && this->g() <= this->a()
40            && this->b() >= 0 && this->b() <= this->a();
41    }
42
43private:
44    // We mirror SkPMColor order only to make set()/get()/clamped() as fast as possible.
45    float fColor[4];
46};
47
48#if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE2
49    #include "../opts/SkPMFloat_SSE2.h"
50#elif defined(__ARM_NEON__)
51    #include "../opts/SkPMFloat_neon.h"
52#else
53    #include "../opts/SkPMFloat_none.h"
54#endif
55
56#endif//SkPM_DEFINED
57