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]. 187792dbf7ea089b3bcb81792a3ecda8a6f8b421e7mtkleinclass SkPMFloat : public Sk4f { 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 317792dbf7ea089b3bcb81792a3ecda8a6f8b421e7mtklein : INHERITED(r,g,b,a) {} 32c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein #else 337792dbf7ea089b3bcb81792a3ecda8a6f8b421e7mtklein : INHERITED(b,g,r,a) {} 34c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein #endif 354e644f5d5020a6ec904734a3f521bfad173cb450mtklein 367792dbf7ea089b3bcb81792a3ecda8a6f8b421e7mtklein SkPMFloat(const Sk4f& fs) : INHERITED(fs) {} 37870b9ea38672276a3e8506a0101dc559fa04583amtklein 387792dbf7ea089b3bcb81792a3ecda8a6f8b421e7mtklein float a() const { return this->kth<SK_A32_SHIFT / 8>(); } 397792dbf7ea089b3bcb81792a3ecda8a6f8b421e7mtklein float r() const { return this->kth<SK_R32_SHIFT / 8>(); } 407792dbf7ea089b3bcb81792a3ecda8a6f8b421e7mtklein float g() const { return this->kth<SK_G32_SHIFT / 8>(); } 417792dbf7ea089b3bcb81792a3ecda8a6f8b421e7mtklein float b() const { return this->kth<SK_B32_SHIFT / 8>(); } 42a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein 4307342361a3cda94376230b37d9e863052449653cmtklein // N.B. All methods returning an SkPMColor call SkPMColorAssert on that result before returning. 4407342361a3cda94376230b37d9e863052449653cmtklein 453d626834b4b5ee2d6dda34da365dfe40520253aamtklein // round() and roundClamp() round component values to the nearest integer. 463d626834b4b5ee2d6dda34da365dfe40520253aamtklein SkPMColor round() const; // Assumes all values in [0, 255]. Some implementations may clamp. 473d626834b4b5ee2d6dda34da365dfe40520253aamtklein SkPMColor roundClamp() const; // Will clamp all values to [0, 255]. 48a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein 493d626834b4b5ee2d6dda34da365dfe40520253aamtklein // Like round(), but truncates instead of rounding. 503d4c4a5a9feff961c6ba70443fa40ea1ca0a503emtklein // The domain of this function is (-1.0f, 256.0f). Values in (-1.0f, 0.0f] trunc to a zero. 513d4c4a5a9feff961c6ba70443fa40ea1ca0a503emtklein SkPMColor trunc() const; 523d4c4a5a9feff961c6ba70443fa40ea1ca0a503emtklein 533d626834b4b5ee2d6dda34da365dfe40520253aamtklein // 4-at-a-time versions of round() and roundClamp(). Like From4PMColors(), no alignment assumed. 543d626834b4b5ee2d6dda34da365dfe40520253aamtklein static void RoundTo4PMColors( 5515391ee4acaa092f52742f64968ad8046b74ca81mtklein const SkPMFloat&, const SkPMFloat&, const SkPMFloat&, const SkPMFloat&, SkPMColor[4]); 563d626834b4b5ee2d6dda34da365dfe40520253aamtklein static void RoundClampTo4PMColors( 5715391ee4acaa092f52742f64968ad8046b74ca81mtklein const SkPMFloat&, const SkPMFloat&, const SkPMFloat&, const SkPMFloat&, SkPMColor[4]); 58548bf38b28986fab6770350b72247d7114d98184mtklein 59a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein bool isValid() const { 6060d2a32b2dbbaabf4a0c133c8d3ff5ad888b8e5emtklein return this->a() >= 0 && this->a() <= 255 61a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein && this->r() >= 0 && this->r() <= this->a() 62a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein && this->g() >= 0 && this->g() <= this->a() 63a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein && this->b() >= 0 && this->b() <= this->a(); 64a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein } 657ab42771859145884e1b28c8c45f0a5a728b22acmtklein 667ab42771859145884e1b28c8c45f0a5a728b22acmtkleinprivate: 677792dbf7ea089b3bcb81792a3ecda8a6f8b421e7mtklein typedef Sk4f INHERITED; 68a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein}; 69a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein 70c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein#ifdef SKNX_NO_SIMD 710340df5b3698aff1c9540fcdbc3dafd9d5ddb0b0mtklein // Platform implementations of SkPMFloat assume Sk4f uses SSE or NEON. _none is generic. 72a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein #include "../opts/SkPMFloat_none.h" 73c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein#else 74c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein #if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSSE3 75c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein #include "../opts/SkPMFloat_SSSE3.h" 76c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein #elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE2 77c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein #include "../opts/SkPMFloat_SSE2.h" 78c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein #elif defined(SK_ARM_HAS_NEON) 79c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein #include "../opts/SkPMFloat_neon.h" 80c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein #else 81c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein #include "../opts/SkPMFloat_none.h" 82c9adb05b64fa0bfadf9d1a782afcda470da68c9emtklein #endif 83a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein#endif 84a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein 85a2f4be76a9d453f1fdfd55b0cec6a683f23ffe0fmtklein#endif//SkPM_DEFINED 86