From fcc9ca09a56cd43015cc990898a55978bc2bf23d Mon Sep 17 00:00:00 2001 From: "reed@google.com" Date: Mon, 6 May 2013 15:59:51 +0000 Subject: by hook or by crook, force gcc to return the value of SkPoint::length() to actually be a float instead of a double. Otherwise we can't properly test for overflow with large values. R=robertphillips@google.com Review URL: https://codereview.chromium.org/14884011 git-svn-id: http://skia.googlecode.com/svn/trunk@9015 2bbb7eff-a529-9590-31e7-b0007b416f81 --- tests/PointTest.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'tests/PointTest.cpp') diff --git a/tests/PointTest.cpp b/tests/PointTest.cpp index 0b183c245e..1255a8c65d 100644 --- a/tests/PointTest.cpp +++ b/tests/PointTest.cpp @@ -61,6 +61,26 @@ template T get_value(skiatest::Reporter* reporter, T value) { return reporter ? value : 0; } +// On linux gcc, 32bit, we are seeing the compiler propagate 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). +// +// force_as_float is 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 @@ static void test_overflow(skiatest::Reporter* reporter) { 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); -- cgit v1.2.3