|  | // 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. | 
|  |  | 
|  | #ifndef UI_GFX_GEOMETRY_SAFE_INTEGER_CONVERSIONS_H_ | 
|  | #define UI_GFX_GEOMETRY_SAFE_INTEGER_CONVERSIONS_H_ | 
|  |  | 
|  | #include <cmath> | 
|  | #include <limits> | 
|  |  | 
|  | #include "base/numerics/safe_conversions.h" | 
|  | #include "ui/gfx/gfx_export.h" | 
|  |  | 
|  | namespace gfx { | 
|  |  | 
|  | inline int ToFlooredInt(float value) { | 
|  | return base::saturated_cast<int>(std::floor(value)); | 
|  | } | 
|  |  | 
|  | inline int ToCeiledInt(float value) { | 
|  | return base::saturated_cast<int>(std::ceil(value)); | 
|  | } | 
|  |  | 
|  | inline int ToFlooredInt(double value) { | 
|  | return base::saturated_cast<int>(std::floor(value)); | 
|  | } | 
|  |  | 
|  | inline int ToCeiledInt(double value) { | 
|  | return base::saturated_cast<int>(std::ceil(value)); | 
|  | } | 
|  |  | 
|  | inline int ToRoundedInt(float value) { | 
|  | float rounded; | 
|  | if (value >= 0.0f) | 
|  | rounded = std::floor(value + 0.5f); | 
|  | else | 
|  | rounded = std::ceil(value - 0.5f); | 
|  | return base::saturated_cast<int>(rounded); | 
|  | } | 
|  |  | 
|  | inline int ToRoundedInt(double value) { | 
|  | double rounded; | 
|  | if (value >= 0.0) | 
|  | rounded = std::floor(value + 0.5); | 
|  | else | 
|  | rounded = std::ceil(value - 0.5); | 
|  | return base::saturated_cast<int>(rounded); | 
|  | } | 
|  |  | 
|  | inline bool IsExpressibleAsInt(float value) { | 
|  | if (value != value) | 
|  | return false; // no int NaN. | 
|  | if (value > std::numeric_limits<int>::max()) | 
|  | return false; | 
|  | if (value < std::numeric_limits<int>::min()) | 
|  | return false; | 
|  | return true; | 
|  | } | 
|  |  | 
|  | }  // namespace gfx | 
|  |  | 
|  | #endif  // UI_GFX_GEOMETRY_SAFE_INTEGER_CONVERSIONS_H_ |