• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef UI_GFX_SAFE_INTEGER_CONVERSIONS_H_
6 #define UI_GFX_SAFE_INTEGER_CONVERSIONS_H_
7 
8 #include <cmath>
9 #include <limits>
10 
11 #include "ui/gfx/gfx_export.h"
12 
13 namespace gfx {
14 
ClampToInt(float value)15 inline int ClampToInt(float value) {
16   if (value != value)
17     return 0; // no int NaN.
18   if (value >= std::numeric_limits<int>::max())
19     return std::numeric_limits<int>::max();
20   if (value <= std::numeric_limits<int>::min())
21     return std::numeric_limits<int>::min();
22   return static_cast<int>(value);
23 }
24 
ToFlooredInt(float value)25 inline int ToFlooredInt(float value) {
26   return ClampToInt(std::floor(value));
27 }
28 
ToCeiledInt(float value)29 inline int ToCeiledInt(float value) {
30   return ClampToInt(std::ceil(value));
31 }
32 
ToRoundedInt(float value)33 inline int ToRoundedInt(float value) {
34   float rounded;
35   if (value >= 0.0f)
36     rounded = std::floor(value + 0.5f);
37   else
38     rounded = std::ceil(value - 0.5f);
39   return ClampToInt(rounded);
40 }
41 
IsExpressibleAsInt(float value)42 inline bool IsExpressibleAsInt(float value) {
43   if (value != value)
44     return false; // no int NaN.
45   if (value > std::numeric_limits<int>::max())
46     return false;
47   if (value < std::numeric_limits<int>::min())
48     return false;
49   return true;
50 }
51 
52 }  // namespace gfx
53 
54 #endif  // UI_GFX_SAFE_INTEGER_CONVERSIONS_H_
55