/* * Copyright 2015 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef Sk2x_DEFINED #define Sk2x_DEFINED #include "SkTypes.h" #define SK2X_PREAMBLE 1 #if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE2 #include "../opts/Sk2x_sse.h" #elif defined(__ARM_NEON__) #include "../opts/Sk2x_neon.h" #else #include "../opts/Sk2x_none.h" #endif #undef SK2X_PREAMBLE template class Sk2x; typedef Sk2x Sk2f; typedef Sk2x Sk2d; #if SK_SCALAR_IS_FLOAT typedef Sk2f Sk2s; #elif SK_SCALAR_IS_DOUBLE typedef Sk2d Sk2s; #endif // This API is meant to be manageably small, not comprehensive. // Please talk to mtklein if you find yourself wanting more. template class Sk2x { public: Sk2x(); // Uninitialized; use Sk2x(0) for zero. explicit Sk2x(T); // Same as Sk2x(T,T); Sk2x(T, T); Sk2x(const Sk2x& o) { *this = o; } Sk2x& operator=(const Sk2x&); // These assume no particular alignment. static Sk2x Load(const T[2]); void store(T[2]) const; Sk2x add(const Sk2x&) const; Sk2x subtract(const Sk2x&) const; Sk2x multiply(const Sk2x&) const; Sk2x operator +(const Sk2x& o) const { return this->add(o); } Sk2x operator -(const Sk2x& o) const { return this->subtract(o); } Sk2x operator *(const Sk2x& o) const { return this->multiply(o); } Sk2x& operator +=(const Sk2x& o) { return (*this = *this + o); } Sk2x& operator -=(const Sk2x& o) { return (*this = *this - o); } Sk2x& operator *=(const Sk2x& o) { return (*this = *this * o); } Sk2x rsqrt() const; // Approximate 1/this->sqrt(). Sk2x sqrt() const; // this->multiply(this->rsqrt()) may be faster, but less precise. static Sk2x Min(const Sk2x&, const Sk2x&); static Sk2x Max(const Sk2x&, const Sk2x&); private: #define SK2X_PRIVATE 1 #if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE2 #include "../opts/Sk2x_sse.h" #elif defined(__ARM_NEON__) #include "../opts/Sk2x_neon.h" #else #include "../opts/Sk2x_none.h" #endif #undef SK2X_PRIVATE }; #if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE2 #include "../opts/Sk2x_sse.h" #elif defined(__ARM_NEON__) #include "../opts/Sk2x_neon.h" #else #include "../opts/Sk2x_none.h" #endif #endif//Sk2x_DEFINED