SkPMFloat.h revision 3d626834b4b5ee2d6dda34da365dfe40520253aa
115391ee4acaa092f52742f64968ad8046b74ca81mtklein/* 215391ee4acaa092f52742f64968ad8046b74ca81mtklein * Copyright 2015 Google Inc. 315391ee4acaa092f52742f64968ad8046b74ca81mtklein * 415391ee4acaa092f52742f64968ad8046b74ca81mtklein * Use of this source code is governed by a BSD-style license that can be 515391ee4acaa092f52742f64968ad8046b74ca81mtklein * found in the LICENSE file. 615391ee4acaa092f52742f64968ad8046b74ca81mtklein */ 715391ee4acaa092f52742f64968ad8046b74ca81mtklein 8a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein#ifndef SkPM_DEFINED 9a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein#define SkPM_DEFINED 10a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein 11a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein#include "SkTypes.h" 12a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein#include "SkColor.h" 13f94fa7112f67af6fc5db19f86d8397307ba17105mtklein#include "SkColorPriv.h" 14c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein#include "SkNx.h" 15f94fa7112f67af6fc5db19f86d8397307ba17105mtklein 164e644f5d5020a6ec904734a3f521bfad173cb450mtklein// A pre-multiplied color storing each component in the same order as SkPMColor, 174e644f5d5020a6ec904734a3f521bfad173cb450mtklein// but as a float in the range [0, 255]. 187ab42771859145884e1b28c8c45f0a5a728b22acmtkleinclass SK_STRUCT_ALIGN(16) SkPMFloat { 197ab42771859145884e1b28c8c45f0a5a728b22acmtkleinpublic: 204e644f5d5020a6ec904734a3f521bfad173cb450mtklein static SkPMFloat FromPMColor(SkPMColor c) { return SkPMFloat(c); } 214e644f5d5020a6ec904734a3f521bfad173cb450mtklein static SkPMFloat FromARGB(float a, float r, float g, float b) { return SkPMFloat(a,r,g,b); } 224e644f5d5020a6ec904734a3f521bfad173cb450mtklein 23548bf38b28986fab6770350b72247d7114d98184mtklein // May be more efficient than one at a time. No special alignment assumed for SkPMColors. 2415391ee4acaa092f52742f64968ad8046b74ca81mtklein static void From4PMColors(const SkPMColor[4], SkPMFloat*, SkPMFloat*, SkPMFloat*, SkPMFloat*); 25548bf38b28986fab6770350b72247d7114d98184mtklein 264e644f5d5020a6ec904734a3f521bfad173cb450mtklein // Uninitialized. 274e644f5d5020a6ec904734a3f521bfad173cb450mtklein SkPMFloat() {} 28c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein explicit SkPMFloat(SkPMColor); 29c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein SkPMFloat(float a, float r, float g, float b) 30c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein #ifdef SK_PMCOLOR_IS_RGBA 31c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein : fColors(r,g,b,a) {} 32c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein #else 33c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein : fColors(b,g,r,a) {} 34c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein #endif 354e644f5d5020a6ec904734a3f521bfad173cb450mtklein 36870b9ea38672276a3e8506a0101dc559fa04583amtklein 370340df5b3698aff1c9540fcdbc3dafd9d5ddb0b0mtklein // Freely autoconvert between SkPMFloat and Sk4f. 380340df5b3698aff1c9540fcdbc3dafd9d5ddb0b0mtklein /*implicit*/ SkPMFloat(const Sk4f& fs) { fColors = fs; } 390340df5b3698aff1c9540fcdbc3dafd9d5ddb0b0mtklein /*implicit*/ operator Sk4f() const { return fColors; } 40870b9ea38672276a3e8506a0101dc559fa04583amtklein 41a156a8ffbe1342a9c329e66ad1438934ac309d70mtklein float a() const { return fColors.kth<SK_A32_SHIFT / 8>(); } 42a156a8ffbe1342a9c329e66ad1438934ac309d70mtklein float r() const { return fColors.kth<SK_R32_SHIFT / 8>(); } 43a156a8ffbe1342a9c329e66ad1438934ac309d70mtklein float g() const { return fColors.kth<SK_G32_SHIFT / 8>(); } 44a156a8ffbe1342a9c329e66ad1438934ac309d70mtklein float b() const { return fColors.kth<SK_B32_SHIFT / 8>(); } 45a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein 4607342361a3cda94376230b37d9e863052449653cmtklein // N.B. All methods returning an SkPMColor call SkPMColorAssert on that result before returning. 4707342361a3cda94376230b37d9e863052449653cmtklein 483d626834b4b5ee2d6dda34da365dfe40520253aamtklein // round() and roundClamp() round component values to the nearest integer. 493d626834b4b5ee2d6dda34da365dfe40520253aamtklein SkPMColor round() const; // Assumes all values in [0, 255]. Some implementations may clamp. 503d626834b4b5ee2d6dda34da365dfe40520253aamtklein SkPMColor roundClamp() const; // Will clamp all values to [0, 255]. 51a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein 523d626834b4b5ee2d6dda34da365dfe40520253aamtklein // Like round(), but truncates instead of rounding. 533d4c4a5a9feff961c6ba70443fa40ea1ca0a503emtklein // The domain of this function is (-1.0f, 256.0f). Values in (-1.0f, 0.0f] trunc to a zero. 543d4c4a5a9feff961c6ba70443fa40ea1ca0a503emtklein SkPMColor trunc() const; 553d4c4a5a9feff961c6ba70443fa40ea1ca0a503emtklein 563d626834b4b5ee2d6dda34da365dfe40520253aamtklein // 4-at-a-time versions of round() and roundClamp(). Like From4PMColors(), no alignment assumed. 573d626834b4b5ee2d6dda34da365dfe40520253aamtklein static void RoundTo4PMColors( 5815391ee4acaa092f52742f64968ad8046b74ca81mtklein const SkPMFloat&, const SkPMFloat&, const SkPMFloat&, const SkPMFloat&, SkPMColor[4]); 593d626834b4b5ee2d6dda34da365dfe40520253aamtklein static void RoundClampTo4PMColors( 6015391ee4acaa092f52742f64968ad8046b74ca81mtklein const SkPMFloat&, const SkPMFloat&, const SkPMFloat&, const SkPMFloat&, SkPMColor[4]); 61548bf38b28986fab6770350b72247d7114d98184mtklein 62a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein bool isValid() const { 6360d2a32b2dbbaabf4a0c133c8d3ff5ad888b8e5emtklein return this->a() >= 0 && this->a() <= 255 64a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein && this->r() >= 0 && this->r() <= this->a() 65a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein && this->g() >= 0 && this->g() <= this->a() 66a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein && this->b() >= 0 && this->b() <= this->a(); 67a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein } 687ab42771859145884e1b28c8c45f0a5a728b22acmtklein 697ab42771859145884e1b28c8c45f0a5a728b22acmtkleinprivate: 700340df5b3698aff1c9540fcdbc3dafd9d5ddb0b0mtklein Sk4f fColors; 71a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein}; 72a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein 73c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein#ifdef SKNX_NO_SIMD 740340df5b3698aff1c9540fcdbc3dafd9d5ddb0b0mtklein // Platform implementations of SkPMFloat assume Sk4f uses SSE or NEON. _none is generic. 75a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein #include "../opts/SkPMFloat_none.h" 76c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein#else 77c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein #if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSSE3 78c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein #include "../opts/SkPMFloat_SSSE3.h" 79c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein #elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE2 80c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein #include "../opts/SkPMFloat_SSE2.h" 81c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein #elif defined(SK_ARM_HAS_NEON) 82c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein #include "../opts/SkPMFloat_neon.h" 83c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein #else 84c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein #include "../opts/SkPMFloat_none.h" 85c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein #endif 86a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein#endif 87a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein 88a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein#endif//SkPM_DEFINED 89