| OLD | NEW | 
|---|
| 1 | 1 | 
| 2 /* | 2 /* | 
| 3  * Copyright 2011 Google Inc. | 3  * Copyright 2011 Google Inc. | 
| 4  * | 4  * | 
| 5  * Use of this source code is governed by a BSD-style license that can be | 5  * Use of this source code is governed by a BSD-style license that can be | 
| 6  * found in the LICENSE file. | 6  * found in the LICENSE file. | 
| 7  */ | 7  */ | 
| 8 // Unit tests for src/core/SkPoint.cpp and its header | 8 // Unit tests for src/core/SkPoint.cpp and its header | 
| 9 | 9 | 
| 10 #include "SkPoint.h" | 10 #include "SkPoint.h" | 
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 77     if (NULL == reporter) { | 77     if (NULL == reporter) { | 
| 78         storage = ~storage; | 78         storage = ~storage; | 
| 79     } | 79     } | 
| 80     memcpy(&value, &storage, 4); | 80     memcpy(&value, &storage, 4); | 
| 81     return value; | 81     return value; | 
| 82 } | 82 } | 
| 83 | 83 | 
| 84 // test that we handle very large values correctly. i.e. that we can | 84 // test that we handle very large values correctly. i.e. that we can | 
| 85 // successfully normalize something whose mag overflows a float. | 85 // successfully normalize something whose mag overflows a float. | 
| 86 static void test_overflow(skiatest::Reporter* reporter) { | 86 static void test_overflow(skiatest::Reporter* reporter) { | 
| 87     SkScalar bigFloat = get_value(reporter, SkFloatToScalar(3.4e38f)); | 87     SkScalar bigFloat = get_value(reporter, 3.4e38f); | 
| 88     SkPoint pt = { bigFloat, bigFloat }; | 88     SkPoint pt = { bigFloat, bigFloat }; | 
| 89 | 89 | 
| 90     SkScalar length = pt.length(); | 90     SkScalar length = pt.length(); | 
| 91     length = force_as_float(reporter, length); | 91     length = force_as_float(reporter, length); | 
| 92 | 92 | 
| 93     // expect this to be non-finite, but dump the results if not. | 93     // expect this to be non-finite, but dump the results if not. | 
| 94     if (SkScalarIsFinite(length)) { | 94     if (SkScalarIsFinite(length)) { | 
| 95         SkDebugf("length(%g, %g) == %g\n", pt.fX, pt.fY, length); | 95         SkDebugf("length(%g, %g) == %g\n", pt.fX, pt.fY, length); | 
| 96         REPORTER_ASSERT(reporter, !SkScalarIsFinite(length)); | 96         REPORTER_ASSERT(reporter, !SkScalarIsFinite(length)); | 
| 97     } | 97     } | 
| 98 | 98 | 
| 99     // this should succeed, even though we can't represent length | 99     // this should succeed, even though we can't represent length | 
| 100     REPORTER_ASSERT(reporter, pt.setLength(SK_Scalar1)); | 100     REPORTER_ASSERT(reporter, pt.setLength(SK_Scalar1)); | 
| 101 | 101 | 
| 102     // now that pt is normalized, we check its length | 102     // now that pt is normalized, we check its length | 
| 103     length = pt.length(); | 103     length = pt.length(); | 
| 104     REPORTER_ASSERT(reporter, SkScalarNearlyEqual(length, SK_Scalar1)); | 104     REPORTER_ASSERT(reporter, SkScalarNearlyEqual(length, SK_Scalar1)); | 
| 105 } | 105 } | 
| 106 | 106 | 
| 107 // test that we handle very small values correctly. i.e. that we can | 107 // test that we handle very small values correctly. i.e. that we can | 
| 108 // report failure if we try to normalize them. | 108 // report failure if we try to normalize them. | 
| 109 static void test_underflow(skiatest::Reporter* reporter) { | 109 static void test_underflow(skiatest::Reporter* reporter) { | 
| 110     SkPoint pt = { SkFloatToScalar(1.0e-37f), SkFloatToScalar(1.0e-37f) }; | 110     SkPoint pt = { 1.0e-37f, 1.0e-37f }; | 
| 111     SkPoint copy = pt; | 111     SkPoint copy = pt; | 
| 112 | 112 | 
| 113     REPORTER_ASSERT(reporter, 0 == SkPoint::Normalize(&pt)); | 113     REPORTER_ASSERT(reporter, 0 == SkPoint::Normalize(&pt)); | 
| 114     REPORTER_ASSERT(reporter, pt == copy);  // pt is unchanged | 114     REPORTER_ASSERT(reporter, pt == copy);  // pt is unchanged | 
| 115 | 115 | 
| 116     REPORTER_ASSERT(reporter, !pt.setLength(SK_Scalar1)); | 116     REPORTER_ASSERT(reporter, !pt.setLength(SK_Scalar1)); | 
| 117     REPORTER_ASSERT(reporter, pt == copy);  // pt is unchanged | 117     REPORTER_ASSERT(reporter, pt == copy);  // pt is unchanged | 
| 118 } | 118 } | 
| 119 | 119 | 
| 120 #include "TestClassDef.h" | 120 #include "TestClassDef.h" | 
| 121 DEF_TEST(Point, reporter) { | 121 DEF_TEST(Point, reporter) { | 
| 122     test_casts(reporter); | 122     test_casts(reporter); | 
| 123 | 123 | 
| 124     static const struct { | 124     static const struct { | 
| 125         SkScalar fX; | 125         SkScalar fX; | 
| 126         SkScalar fY; | 126         SkScalar fY; | 
| 127         SkScalar fLength; | 127         SkScalar fLength; | 
| 128     } gRec[] = { | 128     } gRec[] = { | 
| 129         { SkIntToScalar(3), SkIntToScalar(4), SkIntToScalar(5) }, | 129         { SkIntToScalar(3), SkIntToScalar(4), SkIntToScalar(5) }, | 
| 130         { SkFloatToScalar(0.6f), SkFloatToScalar(0.8f), SK_Scalar1 }, | 130         { 0.6f, 0.8f, SK_Scalar1 }, | 
| 131     }; | 131     }; | 
| 132 | 132 | 
| 133     for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { | 133     for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { | 
| 134         test_length(reporter, gRec[i].fX, gRec[i].fY, gRec[i].fLength); | 134         test_length(reporter, gRec[i].fX, gRec[i].fY, gRec[i].fLength); | 
| 135     } | 135     } | 
| 136 | 136 | 
| 137     test_underflow(reporter); | 137     test_underflow(reporter); | 
| 138     test_overflow(reporter); | 138     test_overflow(reporter); | 
| 139 } | 139 } | 
| 140 | 140 | 
| 141 DEF_TEST(Point_setLengthFast, reporter) { | 141 DEF_TEST(Point_setLengthFast, reporter) { | 
| 142     // Scale a (1,1) point to a bunch of different lengths, | 142     // Scale a (1,1) point to a bunch of different lengths, | 
| 143     // making sure the slow and fast paths are within 0.1%. | 143     // making sure the slow and fast paths are within 0.1%. | 
| 144     const float tests[] = { 1.0f, 0.0f, 1.0e-37f, 3.4e38f, 42.0f, 0.00012f }; | 144     const float tests[] = { 1.0f, 0.0f, 1.0e-37f, 3.4e38f, 42.0f, 0.00012f }; | 
| 145 | 145 | 
| 146     const SkPoint kOne = {1.0f, 1.0f}; | 146     const SkPoint kOne = {1.0f, 1.0f}; | 
| 147     for (unsigned i = 0; i < SK_ARRAY_COUNT(tests); i++) { | 147     for (unsigned i = 0; i < SK_ARRAY_COUNT(tests); i++) { | 
| 148         SkPoint slow = kOne, fast = kOne; | 148         SkPoint slow = kOne, fast = kOne; | 
| 149 | 149 | 
| 150         slow.setLength(tests[i]); | 150         slow.setLength(tests[i]); | 
| 151         fast.setLengthFast(tests[i]); | 151         fast.setLengthFast(tests[i]); | 
| 152 | 152 | 
| 153         if (slow.length() < FLT_MIN && fast.length() < FLT_MIN) continue; | 153         if (slow.length() < FLT_MIN && fast.length() < FLT_MIN) continue; | 
| 154 | 154 | 
| 155         SkScalar ratio = slow.length() / fast.length(); | 155         SkScalar ratio = slow.length() / fast.length(); | 
| 156         REPORTER_ASSERT(reporter, ratio > 0.999f); | 156         REPORTER_ASSERT(reporter, ratio > 0.999f); | 
| 157         REPORTER_ASSERT(reporter, ratio < 1.001f); | 157         REPORTER_ASSERT(reporter, ratio < 1.001f); | 
| 158     } | 158     } | 
| 159 } | 159 } | 
| OLD | NEW | 
|---|