| Index: ui/gfx/half_float_unittest.cc
|
| diff --git a/ui/gfx/half_float_unittest.cc b/ui/gfx/half_float_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..5e7c61eb6ac4ffdc556f8271c0b336eb0e64ac8c
|
| --- /dev/null
|
| +++ b/ui/gfx/half_float_unittest.cc
|
| @@ -0,0 +1,88 @@
|
| +// Copyright (c) 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include <math.h>
|
| +
|
| +#include "base/macros.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +#include "ui/gfx/half_float.h"
|
| +
|
| +namespace gfx {
|
| +
|
| +class HalfFloatTest : public testing::Test {
|
| + public:
|
| + union FloatUIntUnion {
|
| + // this must come first for the initializations below to work
|
| + uint32_t fUInt;
|
| + float fFloat;
|
| + };
|
| +
|
| + // Convert an IEEE 754 half-float to a float value
|
| + // that we can do math on.
|
| + float FromHalfFloat(HalfFloat half_float) {
|
| + int sign = (half_float & 0x8000) ? -1 : 1;
|
| + int exponent = (half_float >> 10) & 0x1F;
|
| + int fraction = half_float & 0x3FF;
|
| + if (exponent == 0) {
|
| + return powf(2.0f, -24.0f) * fraction;
|
| + } else if (exponent == 0x1F) {
|
| + return sign * 1000000000000.0f;
|
| + } else {
|
| + return pow(2.0f, exponent - 25) * (0x400 + fraction);
|
| + }
|
| + }
|
| +
|
| + HalfFloat ConvertTruth(float f) {
|
| + if (f < 0.0)
|
| + return 0x8000 | ConvertTruth(-f);
|
| + int max = 0x8000;
|
| + int min = 0;
|
| + while (max - min > 1) {
|
| + int mid = (min + max) >> 1;
|
| + if (FromHalfFloat(mid) > f) {
|
| + max = mid;
|
| + } else {
|
| + min = mid;
|
| + }
|
| + }
|
| + float low = FromHalfFloat(min);
|
| + float high = FromHalfFloat(min + 1);
|
| + if (f - low <= high - f) {
|
| + return min;
|
| + } else {
|
| + return min + 1;
|
| + }
|
| + }
|
| +
|
| + HalfFloat Convert(float f) {
|
| + HalfFloat ret;
|
| + FloatToHalfFloat(&f, &ret, 1);
|
| + return ret;
|
| + }
|
| +};
|
| +
|
| +TEST_F(HalfFloatTest, NoCrashTest) {
|
| + Convert(nanf(""));
|
| + Convert(1.0E30f);
|
| + Convert(-1.0E30f);
|
| + Convert(1.0E-30f);
|
| + Convert(-1.0E-30f);
|
| +}
|
| +
|
| +TEST_F(HalfFloatTest, SimpleTest) {
|
| + static float test[] = {
|
| + 0.0f, 1.0f, 10.0f, 1000.0f, 65503.0f,
|
| + 1.0E-3f, 1.0E-6f, 1.0E-20f, 1.0E-44f,
|
| + };
|
| + for (size_t i = 0; i < arraysize(test); i++) {
|
| + EXPECT_EQ(ConvertTruth(test[i]), Convert(test[i])) << " float = "
|
| + << test[i];
|
| + if (test[i] != 0.0) {
|
| + EXPECT_EQ(ConvertTruth(-test[i]), Convert(-test[i])) << " float = "
|
| + << -test[i];
|
| + }
|
| + }
|
| +}
|
| +
|
| +} // namespace
|
|
|