OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 "SkColorPriv.h" | 8 #include "SkColorPriv.h" |
9 #include "SkEndian.h" | 9 #include "SkEndian.h" |
10 #include "SkFloatBits.h" | 10 #include "SkFloatBits.h" |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
375 f = SkHalfToFloat(h); | 375 f = SkHalfToFloat(h); |
376 REPORTER_ASSERT(reporter, !SkScalarIsFinite(f) ); | 376 REPORTER_ASSERT(reporter, !SkScalarIsFinite(f) ); |
377 | 377 |
378 static const FloatUnion nan32 = { 255 << 23 | 1 }; | 378 static const FloatUnion nan32 = { 255 << 23 | 1 }; |
379 h = SkFloatToHalf(nan32.fF); | 379 h = SkFloatToHalf(nan32.fF); |
380 f = SkHalfToFloat(h); | 380 f = SkHalfToFloat(h); |
381 REPORTER_ASSERT(reporter, SkScalarIsNaN(f) ); | 381 REPORTER_ASSERT(reporter, SkScalarIsNaN(f) ); |
382 | 382 |
383 } | 383 } |
384 | 384 |
385 static void test_rsqrt(skiatest::Reporter* reporter) { | 385 template <typename RSqrtFn> |
| 386 static void test_rsqrt(skiatest::Reporter* reporter, RSqrtFn rsqrt) { |
386 const float maxRelativeError = 6.50196699e-4f; | 387 const float maxRelativeError = 6.50196699e-4f; |
387 | 388 |
388 // test close to 0 up to 1 | 389 // test close to 0 up to 1 |
389 float input = 0.000001f; | 390 float input = 0.000001f; |
390 for (int i = 0; i < 1000; ++i) { | 391 for (int i = 0; i < 1000; ++i) { |
391 float exact = 1.0f/sk_float_sqrt(input); | 392 float exact = 1.0f/sk_float_sqrt(input); |
392 float estimate = sk_float_rsqrt(input); | 393 float estimate = rsqrt(input); |
393 float relativeError = sk_float_abs(exact - estimate)/exact; | 394 float relativeError = sk_float_abs(exact - estimate)/exact; |
394 REPORTER_ASSERT(reporter, relativeError <= maxRelativeError); | 395 REPORTER_ASSERT(reporter, relativeError <= maxRelativeError); |
395 input += 0.001f; | 396 input += 0.001f; |
396 } | 397 } |
397 | 398 |
398 // test 1 to ~100 | 399 // test 1 to ~100 |
399 input = 1.0f; | 400 input = 1.0f; |
400 for (int i = 0; i < 1000; ++i) { | 401 for (int i = 0; i < 1000; ++i) { |
401 float exact = 1.0f/sk_float_sqrt(input); | 402 float exact = 1.0f/sk_float_sqrt(input); |
402 float estimate = sk_float_rsqrt(input); | 403 float estimate = rsqrt(input); |
403 float relativeError = sk_float_abs(exact - estimate)/exact; | 404 float relativeError = sk_float_abs(exact - estimate)/exact; |
404 REPORTER_ASSERT(reporter, relativeError <= maxRelativeError); | 405 REPORTER_ASSERT(reporter, relativeError <= maxRelativeError); |
405 input += 0.01f; | 406 input += 0.01f; |
406 } | 407 } |
407 | 408 |
408 // test some big numbers | 409 // test some big numbers |
409 input = 1000000.0f; | 410 input = 1000000.0f; |
410 for (int i = 0; i < 100; ++i) { | 411 for (int i = 0; i < 100; ++i) { |
411 float exact = 1.0f/sk_float_sqrt(input); | 412 float exact = 1.0f/sk_float_sqrt(input); |
412 float estimate = sk_float_rsqrt(input); | 413 float estimate = rsqrt(input); |
413 float relativeError = sk_float_abs(exact - estimate)/exact; | 414 float relativeError = sk_float_abs(exact - estimate)/exact; |
414 REPORTER_ASSERT(reporter, relativeError <= maxRelativeError); | 415 REPORTER_ASSERT(reporter, relativeError <= maxRelativeError); |
415 input += 754326.f; | 416 input += 754326.f; |
416 } | 417 } |
417 } | 418 } |
418 | 419 |
419 static void test_muldiv255(skiatest::Reporter* reporter) { | 420 static void test_muldiv255(skiatest::Reporter* reporter) { |
420 for (int a = 0; a <= 255; a++) { | 421 for (int a = 0; a <= 255; a++) { |
421 for (int b = 0; b <= 255; b++) { | 422 for (int b = 0; b <= 255; b++) { |
422 int ab = a * b; | 423 int ab = a * b; |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
548 { | 549 { |
549 SkFixed result = SkFixedDiv(100, 100); | 550 SkFixed result = SkFixedDiv(100, 100); |
550 REPORTER_ASSERT(reporter, result == SK_Fixed1); | 551 REPORTER_ASSERT(reporter, result == SK_Fixed1); |
551 result = SkFixedDiv(1, SK_Fixed1); | 552 result = SkFixedDiv(1, SK_Fixed1); |
552 REPORTER_ASSERT(reporter, result == 1); | 553 REPORTER_ASSERT(reporter, result == 1); |
553 } | 554 } |
554 | 555 |
555 unittest_fastfloat(reporter); | 556 unittest_fastfloat(reporter); |
556 unittest_isfinite(reporter); | 557 unittest_isfinite(reporter); |
557 unittest_half(reporter); | 558 unittest_half(reporter); |
558 test_rsqrt(reporter); | 559 test_rsqrt(reporter, sk_float_rsqrt); |
| 560 test_rsqrt(reporter, sk_float_rsqrt_portable); |
559 | 561 |
560 for (i = 0; i < 10000; i++) { | 562 for (i = 0; i < 10000; i++) { |
561 SkFixed numer = rand.nextS(); | 563 SkFixed numer = rand.nextS(); |
562 SkFixed denom = rand.nextS(); | 564 SkFixed denom = rand.nextS(); |
563 SkFixed result = SkFixedDiv(numer, denom); | 565 SkFixed result = SkFixedDiv(numer, denom); |
564 int64_t check = SkLeftShift((int64_t)numer, 16) / denom; | 566 int64_t check = SkLeftShift((int64_t)numer, 16) / denom; |
565 | 567 |
566 (void)SkCLZ(numer); | 568 (void)SkCLZ(numer); |
567 (void)SkCLZ(denom); | 569 (void)SkCLZ(denom); |
568 | 570 |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
689 test_divmod<int16_t>(r); | 691 test_divmod<int16_t>(r); |
690 } | 692 } |
691 | 693 |
692 DEF_TEST(divmod_s32, r) { | 694 DEF_TEST(divmod_s32, r) { |
693 test_divmod<int32_t>(r); | 695 test_divmod<int32_t>(r); |
694 } | 696 } |
695 | 697 |
696 DEF_TEST(divmod_s64, r) { | 698 DEF_TEST(divmod_s64, r) { |
697 test_divmod<int64_t>(r); | 699 test_divmod<int64_t>(r); |
698 } | 700 } |
OLD | NEW |