OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #ifndef SkNx_DEFINED | 8 #ifndef SkNx_DEFINED |
9 #define SkNx_DEFINED | 9 #define SkNx_DEFINED |
10 | 10 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 fHi.store(vals+N/2); | 43 fHi.store(vals+N/2); |
44 } | 44 } |
45 | 45 |
46 #define OP(op) SkNx operator op(const SkNx& o) const { return {fLo op o.fLo, fHi
op o.fHi}; } | 46 #define OP(op) SkNx operator op(const SkNx& o) const { return {fLo op o.fLo, fHi
op o.fHi}; } |
47 OP(+) OP(-) OP(*) OP(/) | 47 OP(+) OP(-) OP(*) OP(/) |
48 OP(&) OP(|) OP(^) | 48 OP(&) OP(|) OP(^) |
49 OP(==) OP(!=) OP(<) OP(>) OP(<=) OP(>=) | 49 OP(==) OP(!=) OP(<) OP(>) OP(<=) OP(>=) |
50 #undef OP | 50 #undef OP |
51 | 51 |
52 #define OP(op) SkNx op() const { return {fLo.op(), fHi.op()}; } | 52 #define OP(op) SkNx op() const { return {fLo.op(), fHi.op()}; } |
53 OP(abs) OP(floor) | 53 OP(abs) |
54 OP(sqrt) OP(rsqrt0) OP(rsqrt1) OP(rsqrt2) | 54 OP(sqrt) OP(rsqrt0) OP(rsqrt1) OP(rsqrt2) |
55 OP(invert) OP(approxInvert) | 55 OP(invert) OP(approxInvert) |
56 #undef OP | 56 #undef OP |
57 | 57 |
58 SkNx operator << (int bits) const { return SkNx(fLo << bits, fHi << bits); } | 58 SkNx operator << (int bits) const { return SkNx(fLo << bits, fHi << bits); } |
59 SkNx operator >> (int bits) const { return SkNx(fLo >> bits, fHi >> bits); } | 59 SkNx operator >> (int bits) const { return SkNx(fLo >> bits, fHi >> bits); } |
60 | 60 |
61 SkNx saturatedAdd(const SkNx& o) const { | 61 SkNx saturatedAdd(const SkNx& o) const { |
62 return {fLo.saturatedAdd(o.fLo), fHi.saturatedAdd(o.fHi)}; | 62 return {fLo.saturatedAdd(o.fLo), fHi.saturatedAdd(o.fHi)}; |
63 } | 63 } |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 SkNx saturatedAdd(const SkNx& o) const { | 117 SkNx saturatedAdd(const SkNx& o) const { |
118 SkASSERT((T)(~0) > 0); // TODO: support signed T? | 118 SkASSERT((T)(~0) > 0); // TODO: support signed T? |
119 T sum = fVal + o.fVal; | 119 T sum = fVal + o.fVal; |
120 return sum < fVal ? (T)(~0) : sum; | 120 return sum < fVal ? (T)(~0) : sum; |
121 } | 121 } |
122 | 122 |
123 static SkNx Min(const SkNx& a, const SkNx& b) { return SkTMin(a.fVal, b.fVal
); } | 123 static SkNx Min(const SkNx& a, const SkNx& b) { return SkTMin(a.fVal, b.fVal
); } |
124 static SkNx Max(const SkNx& a, const SkNx& b) { return SkTMax(a.fVal, b.fVal
); } | 124 static SkNx Max(const SkNx& a, const SkNx& b) { return SkTMax(a.fVal, b.fVal
); } |
125 | 125 |
126 SkNx abs() const { return SkTAbs(fVal); } | 126 SkNx abs() const { return SkTAbs(fVal); } |
127 SkNx floor() const { return Floor(fVal); } | |
128 | 127 |
129 SkNx sqrt () const { return Sqrt(fVal); } | 128 SkNx sqrt () const { return Sqrt(fVal); } |
130 SkNx rsqrt0() const { return this->sqrt().invert(); } | 129 SkNx rsqrt0() const { return this->sqrt().invert(); } |
131 SkNx rsqrt1() const { return this->rsqrt0(); } | 130 SkNx rsqrt1() const { return this->rsqrt0(); } |
132 SkNx rsqrt2() const { return this->rsqrt1(); } | 131 SkNx rsqrt2() const { return this->rsqrt1(); } |
133 | 132 |
134 SkNx invert() const { return 1 / fVal; } | 133 SkNx invert() const { return 1 / fVal; } |
135 SkNx approxInvert() const { return this->invert(); } | 134 SkNx approxInvert() const { return this->invert(); } |
136 | 135 |
137 T operator[](int k) const { | 136 T operator[](int k) const { |
138 SkASSERT(0 == k); | 137 SkASSERT(0 == k); |
139 return fVal; | 138 return fVal; |
140 } | 139 } |
141 | 140 |
142 template <int k> T kth() const { return (*this)[k]; } | 141 template <int k> T kth() const { return (*this)[k]; } |
143 | 142 |
144 bool allTrue() const { return fVal != 0; } | 143 bool allTrue() const { return fVal != 0; } |
145 bool anyTrue() const { return fVal != 0; } | 144 bool anyTrue() const { return fVal != 0; } |
146 SkNx thenElse(const SkNx& t, const SkNx& e) const { return fVal != 0 ? t : e
; } | 145 SkNx thenElse(const SkNx& t, const SkNx& e) const { return fVal != 0 ? t : e
; } |
147 | 146 |
148 protected: | 147 protected: |
149 static double Floor(double val) { return ::floor (val); } | |
150 static float Floor(float val) { return ::floorf(val); } | |
151 static double Sqrt(double val) { return ::sqrt (val); } | 148 static double Sqrt(double val) { return ::sqrt (val); } |
152 static float Sqrt(float val) { return ::sqrtf(val); } | 149 static float Sqrt(float val) { return ::sqrtf(val); } |
153 | 150 |
154 T fVal; | 151 T fVal; |
155 }; | 152 }; |
156 | 153 |
157 // This generic shuffle can be called to create any valid SkNx<N,T>. | 154 // This generic shuffle can be called to create any valid SkNx<N,T>. |
158 // Sk4f f(a,b,c,d); | 155 // Sk4f f(a,b,c,d); |
159 // Sk2f t = SkNx_shuffle<2,1>(f); // ~~~> Sk2f(c,b) | 156 // Sk2f t = SkNx_shuffle<2,1>(f); // ~~~> Sk2f(c,b) |
160 // f = SkNx_shuffle<0,1,1,0>(t); // ~~~> Sk4f(c,b,b,c) | 157 // f = SkNx_shuffle<0,1,1,0>(t); // ~~~> Sk4f(c,b,b,c) |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 static inline | 205 static inline |
209 void Sk4f_ToBytes(uint8_t p[16], const Sk4f& a, const Sk4f& b, const Sk4f& c
, const Sk4f& d) { | 206 void Sk4f_ToBytes(uint8_t p[16], const Sk4f& a, const Sk4f& b, const Sk4f& c
, const Sk4f& d) { |
210 SkNx_cast<uint8_t>(a).store(p+ 0); | 207 SkNx_cast<uint8_t>(a).store(p+ 0); |
211 SkNx_cast<uint8_t>(b).store(p+ 4); | 208 SkNx_cast<uint8_t>(b).store(p+ 4); |
212 SkNx_cast<uint8_t>(c).store(p+ 8); | 209 SkNx_cast<uint8_t>(c).store(p+ 8); |
213 SkNx_cast<uint8_t>(d).store(p+12); | 210 SkNx_cast<uint8_t>(d).store(p+12); |
214 } | 211 } |
215 #endif | 212 #endif |
216 | 213 |
217 #endif//SkNx_DEFINED | 214 #endif//SkNx_DEFINED |
OLD | NEW |