Chromium Code Reviews| Index: trunk/tests/PointTest.cpp |
| =================================================================== |
| --- trunk/tests/PointTest.cpp (revision 9012) |
| +++ trunk/tests/PointTest.cpp (working copy) |
| @@ -61,6 +61,26 @@ |
| return reporter ? value : 0; |
| } |
|
robertphillips
2013/05/06 15:42:23
propagate
|
| +// On linux gcc, 32bit, we are seeing the compiler propogate up the value |
| +// of SkPoint::length() as a double (which we use sometimes to avoid overflow |
| +// during the computation), even though the signature says float (SkScalar). |
| +// |
|
robertphillips
2013/05/06 15:42:23
rm "must"?
|
| +// force_as_float is must meant to capture our latest technique (horrible as |
| +// it is) to force the value to be a float, so we can test whether it was |
| +// finite or not. |
| +static float force_as_float(skiatest::Reporter* reporter, float value) { |
| + uint32_t storage; |
| + memcpy(&storage, &value, 4); |
| + // even the pair of memcpy calls are not sufficient, since those seem to |
| + // be no-op'd, so we add a runtime tests (just like get_value) to force |
| + // the compiler to give us an actual float. |
| + if (NULL == reporter) { |
| + storage = ~storage; |
| + } |
| + memcpy(&value, &storage, 4); |
| + return value; |
| +} |
| + |
| // test that we handle very large values correctly. i.e. that we can |
| // successfully normalize something whose mag overflows a float. |
| static void test_overflow(skiatest::Reporter* reporter) { |
| @@ -68,6 +88,8 @@ |
| SkPoint pt = { bigFloat, bigFloat }; |
| SkScalar length = pt.length(); |
| + length = force_as_float(reporter, length); |
| + |
| // expect this to be non-finite, but dump the results if not. |
| if (SkScalarIsFinite(length)) { |
| SkDebugf("length(%g, %g) == %g\n", pt.fX, pt.fY, length); |