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