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 #include "Sk4px.h" | 8 #include "Sk4px.h" |
9 #include "SkNx.h" | 9 #include "SkNx.h" |
10 #include "SkRandom.h" | 10 #include "SkRandom.h" |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 REPORTER_ASSERT(r, Sk16b::Min(aw, bw).kth<0>() == SkTMin(a, b)); | 139 REPORTER_ASSERT(r, Sk16b::Min(aw, bw).kth<0>() == SkTMin(a, b)); |
140 REPORTER_ASSERT(r, !(aw < bw).kth<0>() == !(a < b)); | 140 REPORTER_ASSERT(r, !(aw < bw).kth<0>() == !(a < b)); |
141 }} | 141 }} |
142 | 142 |
143 // Exhausting the 16x16 bit space is kind of slow, so only do that in releas
e builds. | 143 // Exhausting the 16x16 bit space is kind of slow, so only do that in releas
e builds. |
144 #ifdef SK_DEBUG | 144 #ifdef SK_DEBUG |
145 SkRandom rand; | 145 SkRandom rand; |
146 for (int i = 0; i < (1<<16); i++) { | 146 for (int i = 0; i < (1<<16); i++) { |
147 uint16_t a = rand.nextU() >> 16, | 147 uint16_t a = rand.nextU() >> 16, |
148 b = rand.nextU() >> 16; | 148 b = rand.nextU() >> 16; |
149 REPORTER_ASSERT(r, Sk8h::Min(Sk8h(a), Sk8h(b)).kth<0>() == SkTMin(a, b))
; | 149 REPORTER_ASSERT(r, Sk16h::Min(Sk16h(a), Sk16h(b)).kth<0>() == SkTMin(a,
b)); |
150 } | 150 } |
151 #else | 151 #else |
152 for (int a = 0; a < (1<<16); a++) { | 152 for (int a = 0; a < (1<<16); a++) { |
153 for (int b = 0; b < (1<<16); b++) { | 153 for (int b = 0; b < (1<<16); b++) { |
154 REPORTER_ASSERT(r, Sk8h::Min(Sk8h(a), Sk8h(b)).kth<0>() == SkTMin(a, b))
; | 154 REPORTER_ASSERT(r, Sk16h::Min(Sk16h(a), Sk16h(b)).kth<0>() == SkTMin(a,
b)); |
155 }} | 155 }} |
156 #endif | 156 #endif |
157 } | 157 } |
158 | 158 |
159 DEF_TEST(SkNi_saturatedAdd, r) { | 159 DEF_TEST(SkNi_saturatedAdd, r) { |
160 for (int a = 0; a < (1<<8); a++) { | 160 for (int a = 0; a < (1<<8); a++) { |
161 for (int b = 0; b < (1<<8); b++) { | 161 for (int b = 0; b < (1<<8); b++) { |
162 int exact = a+b; | 162 int exact = a+b; |
163 if (exact > 255) { exact = 255; } | 163 if (exact > 255) { exact = 255; } |
164 if (exact < 0) { exact = 0; } | 164 if (exact < 0) { exact = 0; } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 }; | 200 }; |
201 auto packed = Sk4px::Load4(colors); | 201 auto packed = Sk4px::Load4(colors); |
202 | 202 |
203 auto wideLo = packed.widenLo(), | 203 auto wideLo = packed.widenLo(), |
204 wideHi = packed.widenHi(), | 204 wideHi = packed.widenHi(), |
205 wideLoHi = packed.widenLoHi(), | 205 wideLoHi = packed.widenLoHi(), |
206 wideLoHiAlt = wideLo + wideHi; | 206 wideLoHiAlt = wideLo + wideHi; |
207 REPORTER_ASSERT(r, 0 == memcmp(&wideLoHi, &wideLoHiAlt, sizeof(wideLoHi))); | 207 REPORTER_ASSERT(r, 0 == memcmp(&wideLoHi, &wideLoHiAlt, sizeof(wideLoHi))); |
208 } | 208 } |
209 | 209 |
210 DEF_TEST(SkNx_cast, r) { | |
211 Sk4f fs(-1.7f, -1.4f, 0.5f, 1.9f); | |
212 Sk4i is = SkNx_cast<int>(fs); | |
213 | |
214 REPORTER_ASSERT(r, is.kth<0>() == -1); | |
215 REPORTER_ASSERT(r, is.kth<1>() == -1); | |
216 REPORTER_ASSERT(r, is.kth<2>() == 0); | |
217 REPORTER_ASSERT(r, is.kth<3>() == 1); | |
218 } | |
219 | |
220 DEF_TEST(SkNx_abs, r) { | 210 DEF_TEST(SkNx_abs, r) { |
221 auto fs = Sk4f(0.0f, -0.0f, 2.0f, -4.0f).abs(); | 211 auto fs = Sk4f(0.0f, -0.0f, 2.0f, -4.0f).abs(); |
222 REPORTER_ASSERT(r, fs.kth<0>() == 0.0f); | 212 REPORTER_ASSERT(r, fs.kth<0>() == 0.0f); |
223 REPORTER_ASSERT(r, fs.kth<1>() == 0.0f); | 213 REPORTER_ASSERT(r, fs.kth<1>() == 0.0f); |
224 REPORTER_ASSERT(r, fs.kth<2>() == 2.0f); | 214 REPORTER_ASSERT(r, fs.kth<2>() == 2.0f); |
225 REPORTER_ASSERT(r, fs.kth<3>() == 4.0f); | 215 REPORTER_ASSERT(r, fs.kth<3>() == 4.0f); |
226 } | 216 } |
227 | 217 |
| 218 DEF_TEST(SkNx_shuffle, r) { |
| 219 Sk4f f4(0,10,20,30); |
| 220 |
| 221 Sk2f f2 = SkNx_shuffle<2,1>(f4); |
| 222 REPORTER_ASSERT(r, f2[0] == 20); |
| 223 REPORTER_ASSERT(r, f2[1] == 10); |
| 224 |
| 225 f4 = SkNx_shuffle<0,1,1,0>(f2); |
| 226 REPORTER_ASSERT(r, f4[0] == 20); |
| 227 REPORTER_ASSERT(r, f4[1] == 10); |
| 228 REPORTER_ASSERT(r, f4[2] == 10); |
| 229 REPORTER_ASSERT(r, f4[3] == 20); |
| 230 } |
| 231 |
228 #include "SkRandom.h" | 232 #include "SkRandom.h" |
229 | 233 |
230 static void dump(const Sk4f& f4, const Sk4h& h4) { | |
231 SkDebugf("%g %g %g %g --> %d %d %d %d\n", | |
232 f4.kth<0>(), f4.kth<1>(), f4.kth<2>(), f4.kth<3>(), | |
233 h4.kth<0>(), h4.kth<1>(), h4.kth<2>(), h4.kth<3>()); | |
234 } | |
235 | |
236 DEF_TEST(SkNx_u16_float, r) { | 234 DEF_TEST(SkNx_u16_float, r) { |
237 { | 235 { |
238 // u16 --> float | 236 // u16 --> float |
239 auto h4 = Sk4h(15, 17, 257, 65535); | 237 auto h4 = Sk4h(15, 17, 257, 65535); |
240 auto f4 = SkNx_cast<float>(h4); | 238 auto f4 = SkNx_cast<float>(h4); |
241 dump(f4, h4); | |
242 REPORTER_ASSERT(r, f4.kth<0>() == 15.0f); | 239 REPORTER_ASSERT(r, f4.kth<0>() == 15.0f); |
243 REPORTER_ASSERT(r, f4.kth<1>() == 17.0f); | 240 REPORTER_ASSERT(r, f4.kth<1>() == 17.0f); |
244 REPORTER_ASSERT(r, f4.kth<2>() == 257.0f); | 241 REPORTER_ASSERT(r, f4.kth<2>() == 257.0f); |
245 REPORTER_ASSERT(r, f4.kth<3>() == 65535.0f); | 242 REPORTER_ASSERT(r, f4.kth<3>() == 65535.0f); |
246 } | 243 } |
247 { | 244 { |
248 // float -> u16 | 245 // float -> u16 |
249 auto f4 = Sk4f(15, 17, 257, 65535); | 246 auto f4 = Sk4f(15, 17, 257, 65535); |
250 auto h4 = SkNx_cast<uint16_t>(f4); | 247 auto h4 = SkNx_cast<uint16_t>(f4); |
251 dump(f4, h4); | |
252 REPORTER_ASSERT(r, h4.kth<0>() == 15); | 248 REPORTER_ASSERT(r, h4.kth<0>() == 15); |
253 REPORTER_ASSERT(r, h4.kth<1>() == 17); | 249 REPORTER_ASSERT(r, h4.kth<1>() == 17); |
254 REPORTER_ASSERT(r, h4.kth<2>() == 257); | 250 REPORTER_ASSERT(r, h4.kth<2>() == 257); |
255 REPORTER_ASSERT(r, h4.kth<3>() == 65535); | 251 REPORTER_ASSERT(r, h4.kth<3>() == 65535); |
256 } | 252 } |
257 | 253 |
258 // starting with any u16 value, we should be able to have a perfect round-tr
ip in/out of floats | 254 // starting with any u16 value, we should be able to have a perfect round-tr
ip in/out of floats |
259 // | 255 // |
260 SkRandom rand; | 256 SkRandom rand; |
261 for (int i = 0; i < 0; ++i) { | 257 for (int i = 0; i < 10000; ++i) { |
262 const uint16_t s16[4] { | 258 const uint16_t s16[4] { |
263 (uint16_t)rand.nextU16(), (uint16_t)rand.nextU16(), | 259 (uint16_t)rand.nextU16(), (uint16_t)rand.nextU16(), |
264 (uint16_t)rand.nextU16(), (uint16_t)rand.nextU16(), | 260 (uint16_t)rand.nextU16(), (uint16_t)rand.nextU16(), |
265 }; | 261 }; |
266 auto u4_0 = Sk4h::Load(s16); | 262 auto u4_0 = Sk4h::Load(s16); |
267 auto f4 = SkNx_cast<float>(u4_0); | 263 auto f4 = SkNx_cast<float>(u4_0); |
268 auto u4_1 = SkNx_cast<uint16_t>(f4); | 264 auto u4_1 = SkNx_cast<uint16_t>(f4); |
269 uint16_t d16[4]; | 265 uint16_t d16[4]; |
270 u4_1.store(d16); | 266 u4_1.store(d16); |
271 REPORTER_ASSERT(r, !memcmp(s16, d16, sizeof(s16))); | 267 REPORTER_ASSERT(r, !memcmp(s16, d16, sizeof(s16))); |
272 } | 268 } |
273 } | 269 } |
OLD | NEW |