Chromium Code Reviews| 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 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 53 // Ugh. Windows compiler can dive into other .cpp files, and sometimes | 53 // Ugh. Windows compiler can dive into other .cpp files, and sometimes |
| 54 // notices that I will generate an overflow... which is exactly the point | 54 // notices that I will generate an overflow... which is exactly the point |
| 55 // of this test! | 55 // of this test! |
| 56 // | 56 // |
| 57 // To avoid this warning, I need to convince the compiler that I might not | 57 // To avoid this warning, I need to convince the compiler that I might not |
| 58 // use that big value, hence this hacky helper function: reporter is | 58 // use that big value, hence this hacky helper function: reporter is |
| 59 // ALWAYS non-null. (shhhhhh, don't tell the compiler that). | 59 // ALWAYS non-null. (shhhhhh, don't tell the compiler that). |
| 60 template <typename T> T get_value(skiatest::Reporter* reporter, T value) { | 60 template <typename T> T get_value(skiatest::Reporter* reporter, T value) { |
| 61 return reporter ? value : 0; | 61 return reporter ? value : 0; |
| 62 } | 62 } |
| 63 | 63 |
|
robertphillips
2013/05/06 15:42:23
propagate
| |
| 64 // On linux gcc, 32bit, we are seeing the compiler propogate up the value | |
| 65 // of SkPoint::length() as a double (which we use sometimes to avoid overflow | |
| 66 // during the computation), even though the signature says float (SkScalar). | |
| 67 // | |
|
robertphillips
2013/05/06 15:42:23
rm "must"?
| |
| 68 // force_as_float is must meant to capture our latest technique (horrible as | |
| 69 // it is) to force the value to be a float, so we can test whether it was | |
| 70 // finite or not. | |
| 71 static float force_as_float(skiatest::Reporter* reporter, float value) { | |
| 72 uint32_t storage; | |
| 73 memcpy(&storage, &value, 4); | |
| 74 // even the pair of memcpy calls are not sufficient, since those seem to | |
| 75 // be no-op'd, so we add a runtime tests (just like get_value) to force | |
| 76 // the compiler to give us an actual float. | |
| 77 if (NULL == reporter) { | |
| 78 storage = ~storage; | |
| 79 } | |
| 80 memcpy(&value, &storage, 4); | |
| 81 return value; | |
| 82 } | |
| 83 | |
| 64 // 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 |
| 65 // successfully normalize something whose mag overflows a float. | 85 // successfully normalize something whose mag overflows a float. |
| 66 static void test_overflow(skiatest::Reporter* reporter) { | 86 static void test_overflow(skiatest::Reporter* reporter) { |
| 67 SkScalar bigFloat = get_value(reporter, SkFloatToScalar(3.4e38f)); | 87 SkScalar bigFloat = get_value(reporter, SkFloatToScalar(3.4e38f)); |
| 68 SkPoint pt = { bigFloat, bigFloat }; | 88 SkPoint pt = { bigFloat, bigFloat }; |
| 69 | 89 |
| 70 SkScalar length = pt.length(); | 90 SkScalar length = pt.length(); |
| 91 length = force_as_float(reporter, length); | |
| 92 | |
| 71 // 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. |
| 72 if (SkScalarIsFinite(length)) { | 94 if (SkScalarIsFinite(length)) { |
| 73 SkDebugf("length(%g, %g) == %g\n", pt.fX, pt.fY, length); | 95 SkDebugf("length(%g, %g) == %g\n", pt.fX, pt.fY, length); |
| 74 REPORTER_ASSERT(reporter, !SkScalarIsFinite(length)); | 96 REPORTER_ASSERT(reporter, !SkScalarIsFinite(length)); |
| 75 } | 97 } |
| 76 | 98 |
| 77 // this should succeed, even though we can't represent length | 99 // this should succeed, even though we can't represent length |
| 78 REPORTER_ASSERT(reporter, pt.setLength(SK_Scalar1)); | 100 REPORTER_ASSERT(reporter, pt.setLength(SK_Scalar1)); |
| 79 | 101 |
| 80 // now that pt is normalized, we check its length | 102 // now that pt is normalized, we check its length |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 110 for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { | 132 for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { |
| 111 test_length(reporter, gRec[i].fX, gRec[i].fY, gRec[i].fLength); | 133 test_length(reporter, gRec[i].fX, gRec[i].fY, gRec[i].fLength); |
| 112 } | 134 } |
| 113 | 135 |
| 114 test_underflow(reporter); | 136 test_underflow(reporter); |
| 115 test_overflow(reporter); | 137 test_overflow(reporter); |
| 116 } | 138 } |
| 117 | 139 |
| 118 #include "TestClassDef.h" | 140 #include "TestClassDef.h" |
| 119 DEFINE_TESTCLASS("Point", PointTestClass, PointTest) | 141 DEFINE_TESTCLASS("Point", PointTestClass, PointTest) |
| OLD | NEW |