diff options
Diffstat (limited to 'ui')
-rw-r--r-- | ui/gfx/point_conversions.cc | 2 | ||||
-rw-r--r-- | ui/gfx/rect_conversions.cc | 2 | ||||
-rw-r--r-- | ui/gfx/safe_integer_conversions.cc (renamed from ui/gfx/safe_floor_ceil.cc) | 16 | ||||
-rw-r--r-- | ui/gfx/safe_integer_conversions.h (renamed from ui/gfx/safe_floor_ceil.h) | 9 | ||||
-rw-r--r-- | ui/gfx/safe_integer_conversions_unittest.cc | 109 | ||||
-rw-r--r-- | ui/gfx/size_conversions.cc | 2 | ||||
-rw-r--r-- | ui/ui.gyp | 4 | ||||
-rw-r--r-- | ui/ui_unittests.gypi | 1 |
8 files changed, 134 insertions, 11 deletions
diff --git a/ui/gfx/point_conversions.cc b/ui/gfx/point_conversions.cc index 0788ef7..7f85571 100644 --- a/ui/gfx/point_conversions.cc +++ b/ui/gfx/point_conversions.cc @@ -4,7 +4,7 @@ #include "ui/gfx/point_conversions.h" -#include "ui/gfx/safe_floor_ceil.h" +#include "ui/gfx/safe_integer_conversions.h" namespace gfx { diff --git a/ui/gfx/rect_conversions.cc b/ui/gfx/rect_conversions.cc index 0d8fdb5..265915a 100644 --- a/ui/gfx/rect_conversions.cc +++ b/ui/gfx/rect_conversions.cc @@ -4,7 +4,7 @@ #include "ui/gfx/rect_conversions.h" -#include "ui/gfx/safe_floor_ceil.h" +#include "ui/gfx/safe_integer_conversions.h" namespace gfx { diff --git a/ui/gfx/safe_floor_ceil.cc b/ui/gfx/safe_integer_conversions.cc index c8ac9e1..e354353 100644 --- a/ui/gfx/safe_floor_ceil.cc +++ b/ui/gfx/safe_integer_conversions.cc @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "ui/gfx/safe_integer_conversions.h" + #include <cmath> #include <limits> @@ -10,9 +12,9 @@ namespace gfx { int ClampToInt(float value) { if (value != value) return 0; // no int NaN. - if (value > std::numeric_limits<int>::max()) + if (value >= std::numeric_limits<int>::max()) return std::numeric_limits<int>::max(); - if (value < std::numeric_limits<int>::min()) + if (value <= std::numeric_limits<int>::min()) return std::numeric_limits<int>::min(); return static_cast<int>(value); } @@ -25,5 +27,13 @@ int ToCeiledInt(float value) { return ClampToInt(std::ceil(value)); } -} // namespace gfx +int ToRoundedInt(float value) { + float rounded; + if (value >= 0.0f) + rounded = std::floor(value + 0.5f); + else + rounded = std::ceil(value - 0.5f); + return ClampToInt(rounded); +} +} // namespace gfx diff --git a/ui/gfx/safe_floor_ceil.h b/ui/gfx/safe_integer_conversions.h index c2d80c6..1cbfb88 100644 --- a/ui/gfx/safe_floor_ceil.h +++ b/ui/gfx/safe_integer_conversions.h @@ -2,15 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_GFX_SAFE_FLOOR_CEIL_H_ -#define UI_GFX_SAFE_FLOOR_CEIL_H_ +#ifndef UI_GFX_SAFE_INTEGER_CONVERSIONS_H_ +#define UI_GFX_SAFE_INTEGER_CONVERSIONS_H_ + +#include "ui/base/ui_export.h" namespace gfx { UI_EXPORT int ClampToInt(float value); UI_EXPORT int ToFlooredInt(float value); UI_EXPORT int ToCeiledInt(float value); +UI_EXPORT int ToRoundedInt(float value); } // namespace gfx -#endif // UI_GFX_SAFE_FLOOR_CEIL_H_ +#endif // UI_GFX_SAFE_INTEGER_CONVERSIONS_H_ diff --git a/ui/gfx/safe_integer_conversions_unittest.cc b/ui/gfx/safe_integer_conversions_unittest.cc new file mode 100644 index 0000000..b7592be --- /dev/null +++ b/ui/gfx/safe_integer_conversions_unittest.cc @@ -0,0 +1,109 @@ +// Copyright (c) 2012 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 "ui/gfx/safe_integer_conversions.h" + +#include <limits> + +#include "testing/gtest/include/gtest/gtest.h" + +namespace ui { + +TEST(SafeIntegerConversions, ClampToInt) { + EXPECT_EQ(0, gfx::ClampToInt(std::numeric_limits<float>::quiet_NaN())); + + float max = std::numeric_limits<int>::max(); + float min = std::numeric_limits<int>::min(); + + EXPECT_EQ(max, gfx::ClampToInt(std::numeric_limits<float>::infinity())); + EXPECT_EQ(max, gfx::ClampToInt(max)); + EXPECT_EQ(max, gfx::ClampToInt(max + 1)); + EXPECT_EQ(max - 1, gfx::ClampToInt(max - 1)); + + EXPECT_EQ(-100, gfx::ClampToInt(-100.5f)); + EXPECT_EQ(0, gfx::ClampToInt(0)); + EXPECT_EQ(100, gfx::ClampToInt(100.5f)); + + EXPECT_EQ(min, gfx::ClampToInt(-std::numeric_limits<float>::infinity())); + EXPECT_EQ(min, gfx::ClampToInt(min)); + EXPECT_EQ(min, gfx::ClampToInt(min - 1)); + EXPECT_EQ(min + 1, gfx::ClampToInt(min + 1)); +} + +TEST(SafeIntegerConversions, ToFlooredInt) { + EXPECT_EQ(0, gfx::ToFlooredInt(std::numeric_limits<float>::quiet_NaN())); + + float max = std::numeric_limits<int>::max(); + float min = std::numeric_limits<int>::min(); + + EXPECT_EQ(max, gfx::ToFlooredInt(std::numeric_limits<float>::infinity())); + EXPECT_EQ(max, gfx::ToFlooredInt(max)); + EXPECT_EQ(max, gfx::ToFlooredInt(max + 0.5f)); + EXPECT_EQ(max - 1, gfx::ToFlooredInt(max - 0.5f)); + + EXPECT_EQ(-101, gfx::ToFlooredInt(-100.5f)); + EXPECT_EQ(0, gfx::ToFlooredInt(0)); + EXPECT_EQ(100, gfx::ToFlooredInt(100.5f)); + + EXPECT_EQ(min, gfx::ToFlooredInt(-std::numeric_limits<float>::infinity())); + EXPECT_EQ(min, gfx::ToFlooredInt(min)); + EXPECT_EQ(min, gfx::ToFlooredInt(min - 0.5f)); + EXPECT_EQ(min, gfx::ToFlooredInt(min + 0.5f)); +} + +TEST(SafeIntegerConversions, ToCeiledInt) { + EXPECT_EQ(0, gfx::ToCeiledInt(std::numeric_limits<float>::quiet_NaN())); + + float max = std::numeric_limits<int>::max(); + float min = std::numeric_limits<int>::min(); + + EXPECT_EQ(max, gfx::ToCeiledInt(std::numeric_limits<float>::infinity())); + EXPECT_EQ(max, gfx::ToCeiledInt(max)); + EXPECT_EQ(max, gfx::ToCeiledInt(max + 0.5f)); + EXPECT_EQ(max, gfx::ToCeiledInt(max - 0.5f)); + + EXPECT_EQ(-100, gfx::ToCeiledInt(-100.5f)); + EXPECT_EQ(0, gfx::ToCeiledInt(0)); + EXPECT_EQ(101, gfx::ToCeiledInt(100.5f)); + + EXPECT_EQ(min, gfx::ToCeiledInt(-std::numeric_limits<float>::infinity())); + EXPECT_EQ(min, gfx::ToCeiledInt(min)); + EXPECT_EQ(min, gfx::ToCeiledInt(min - 0.5f)); + EXPECT_EQ(min + 1, gfx::ToCeiledInt(min + 0.5f)); +} + +TEST(SafeIntegerConversions, ToRoundedInt) { + EXPECT_EQ(0, gfx::ToRoundedInt(std::numeric_limits<float>::quiet_NaN())); + + float max = std::numeric_limits<int>::max(); + float min = std::numeric_limits<int>::min(); + + EXPECT_EQ(max, gfx::ToRoundedInt(std::numeric_limits<float>::infinity())); + EXPECT_EQ(max, gfx::ToRoundedInt(max)); + EXPECT_EQ(max, gfx::ToRoundedInt(max + 0.1f)); + EXPECT_EQ(max, gfx::ToRoundedInt(max + 0.5f)); + EXPECT_EQ(max, gfx::ToRoundedInt(max + 0.9f)); + EXPECT_EQ(max, gfx::ToRoundedInt(max - 0.1f)); + EXPECT_EQ(max, gfx::ToRoundedInt(max - 0.5f)); + EXPECT_EQ(max - 1, gfx::ToRoundedInt(max - 0.9f)); + + EXPECT_EQ(-100, gfx::ToRoundedInt(-100.1f)); + EXPECT_EQ(-101, gfx::ToRoundedInt(-100.5f)); + EXPECT_EQ(-101, gfx::ToRoundedInt(-100.9f)); + EXPECT_EQ(0, gfx::ToRoundedInt(0)); + EXPECT_EQ(100, gfx::ToRoundedInt(100.1f)); + EXPECT_EQ(101, gfx::ToRoundedInt(100.5f)); + EXPECT_EQ(101, gfx::ToRoundedInt(100.9f)); + + EXPECT_EQ(min, gfx::ToRoundedInt(-std::numeric_limits<float>::infinity())); + EXPECT_EQ(min, gfx::ToRoundedInt(min)); + EXPECT_EQ(min, gfx::ToRoundedInt(min - 0.1f)); + EXPECT_EQ(min, gfx::ToRoundedInt(min - 0.5f)); + EXPECT_EQ(min, gfx::ToRoundedInt(min - 0.9f)); + EXPECT_EQ(min, gfx::ToRoundedInt(min + 0.1f)); + EXPECT_EQ(min + 1, gfx::ToRoundedInt(min + 0.5f)); + EXPECT_EQ(min + 1, gfx::ToRoundedInt(min + 0.9f)); +} + +} // namespace ui diff --git a/ui/gfx/size_conversions.cc b/ui/gfx/size_conversions.cc index 9668aaa..7fb3d24 100644 --- a/ui/gfx/size_conversions.cc +++ b/ui/gfx/size_conversions.cc @@ -4,7 +4,7 @@ #include "ui/gfx/size_conversions.h" -#include "ui/gfx/safe_floor_ceil.h" +#include "ui/gfx/safe_integer_conversions.h" namespace gfx { @@ -152,8 +152,8 @@ 'gfx/rect_conversions.h', 'gfx/rect_f.cc', 'gfx/rect_f.h', - 'gfx/safe_floor_ceil.cc', - 'gfx/safe_floor_ceil.h', + 'gfx/safe_integer_conversions.cc', + 'gfx/safe_integer_conversions.h', 'gfx/scoped_ui_graphics_push_context_ios.h', 'gfx/scoped_ui_graphics_push_context_ios.mm', 'gfx/screen.h', diff --git a/ui/ui_unittests.gypi b/ui/ui_unittests.gypi index b29649a..c87279e 100644 --- a/ui/ui_unittests.gypi +++ b/ui/ui_unittests.gypi @@ -81,6 +81,7 @@ 'gfx/image/image_unittest_util_mac.mm', 'gfx/insets_unittest.cc', 'gfx/rect_unittest.cc', + 'gfx/safe_integer_conversions_unittest.cc', 'gfx/screen_unittest.cc', 'gfx/shadow_value_unittest.cc', 'gfx/skbitmap_operations_unittest.cc', |