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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 SkNi(T a, T b, T c, T d, T e, T f, T g, T h) : fLo(a,b,c,d), fHi(e,f,g,h) {
REQUIRE(N==8); } | 50 SkNi(T a, T b, T c, T d, T e, T f, T g, T h) : fLo(a,b,c,d), fHi(e,f,g,h) {
REQUIRE(N==8); } |
51 SkNi(T a, T b, T c, T d, T e, T f, T g, T h, | 51 SkNi(T a, T b, T c, T d, T e, T f, T g, T h, |
52 T i, T j, T k, T l, T m, T n, T o, T p) | 52 T i, T j, T k, T l, T m, T n, T o, T p) |
53 : fLo(a,b,c,d, e,f,g,h), fHi(i,j,k,l, m,n,o,p) { REQUIRE(N==16); } | 53 : fLo(a,b,c,d, e,f,g,h), fHi(i,j,k,l, m,n,o,p) { REQUIRE(N==16); } |
54 | 54 |
55 void store(T vals[N]) const { | 55 void store(T vals[N]) const { |
56 fLo.store(vals); | 56 fLo.store(vals); |
57 fHi.store(vals+N/2); | 57 fHi.store(vals+N/2); |
58 } | 58 } |
59 | 59 |
| 60 SkNi saturatedAdd(const SkNi& o) const { |
| 61 return SkNi(fLo.saturatedAdd(o.fLo), fHi.saturatedAdd(o.fHi)); |
| 62 } |
| 63 |
60 SkNi operator + (const SkNi& o) const { return SkNi(fLo + o.fLo, fHi + o.fHi
); } | 64 SkNi operator + (const SkNi& o) const { return SkNi(fLo + o.fLo, fHi + o.fHi
); } |
61 SkNi operator - (const SkNi& o) const { return SkNi(fLo - o.fLo, fHi - o.fHi
); } | 65 SkNi operator - (const SkNi& o) const { return SkNi(fLo - o.fLo, fHi - o.fHi
); } |
62 SkNi operator * (const SkNi& o) const { return SkNi(fLo * o.fLo, fHi * o.fHi
); } | 66 SkNi operator * (const SkNi& o) const { return SkNi(fLo * o.fLo, fHi * o.fHi
); } |
63 | 67 |
64 SkNi operator << (int bits) const { return SkNi(fLo << bits, fHi << bits); } | 68 SkNi operator << (int bits) const { return SkNi(fLo << bits, fHi << bits); } |
65 SkNi operator >> (int bits) const { return SkNi(fLo >> bits, fHi >> bits); } | 69 SkNi operator >> (int bits) const { return SkNi(fLo >> bits, fHi >> bits); } |
66 | 70 |
67 // TODO: comparisons, min, max? | 71 // TODO: comparisons, min, max? |
68 | 72 |
69 template <int k> T kth() const { | 73 template <int k> T kth() const { |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 | 163 |
160 template <typename T> | 164 template <typename T> |
161 class SkNi<1,T> { | 165 class SkNi<1,T> { |
162 public: | 166 public: |
163 SkNi() {} | 167 SkNi() {} |
164 explicit SkNi(T val) : fVal(val) {} | 168 explicit SkNi(T val) : fVal(val) {} |
165 static SkNi Load(const T vals[1]) { return SkNi(vals[0]); } | 169 static SkNi Load(const T vals[1]) { return SkNi(vals[0]); } |
166 | 170 |
167 void store(T vals[1]) const { vals[0] = fVal; } | 171 void store(T vals[1]) const { vals[0] = fVal; } |
168 | 172 |
| 173 SkNi saturatedAdd(const SkNi& o) const { |
| 174 SkASSERT((T)(~0) > 0); // TODO: support signed T |
| 175 T sum = fVal + o.fVal; |
| 176 return SkNi(sum > fVal ? sum : (T)(~0)); |
| 177 } |
| 178 |
169 SkNi operator + (const SkNi& o) const { return SkNi(fVal + o.fVal); } | 179 SkNi operator + (const SkNi& o) const { return SkNi(fVal + o.fVal); } |
170 SkNi operator - (const SkNi& o) const { return SkNi(fVal - o.fVal); } | 180 SkNi operator - (const SkNi& o) const { return SkNi(fVal - o.fVal); } |
171 SkNi operator * (const SkNi& o) const { return SkNi(fVal * o.fVal); } | 181 SkNi operator * (const SkNi& o) const { return SkNi(fVal * o.fVal); } |
172 | 182 |
173 SkNi operator << (int bits) const { return SkNi(fVal << bits); } | 183 SkNi operator << (int bits) const { return SkNi(fVal << bits); } |
174 SkNi operator >> (int bits) const { return SkNi(fVal >> bits); } | 184 SkNi operator >> (int bits) const { return SkNi(fVal >> bits); } |
175 | 185 |
176 template <int k> T kth() const { | 186 template <int k> T kth() const { |
177 SkASSERT(0 == k); | 187 SkASSERT(0 == k); |
178 return fVal; | 188 return fVal; |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
269 typedef SkNi<4, uint16_t> Sk4h; | 279 typedef SkNi<4, uint16_t> Sk4h; |
270 typedef SkNi<8, uint16_t> Sk8h; | 280 typedef SkNi<8, uint16_t> Sk8h; |
271 typedef SkNi<16, uint16_t> Sk16h; | 281 typedef SkNi<16, uint16_t> Sk16h; |
272 | 282 |
273 typedef SkNi<16, uint8_t> Sk16b; | 283 typedef SkNi<16, uint8_t> Sk16b; |
274 | 284 |
275 typedef SkNi<4, int32_t> Sk4i; | 285 typedef SkNi<4, int32_t> Sk4i; |
276 typedef SkNi<4, uint32_t> Sk4u; | 286 typedef SkNi<4, uint32_t> Sk4u; |
277 | 287 |
278 #endif//SkNx_DEFINED | 288 #endif//SkNx_DEFINED |
OLD | NEW |