15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect_conversions.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <cmath> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/safe_integer_conversions.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Rect ToEnclosingRect(const RectF& rect) { 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int min_x = ToFlooredInt(rect.x()); 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int min_y = ToFlooredInt(rect.y()); 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float max_x = rect.right(); 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float max_y = rect.bottom(); 1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int width = rect.width() == 0 ? 0 : std::max(ToCeiledInt(max_x) - min_x, 0); 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int height = rect.height() == 0 ? 0 : std::max(ToCeiledInt(max_y) - min_y, 0); 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Rect(min_x, min_y, width, height); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Rect ToEnclosedRect(const RectF& rect) { 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int min_x = ToCeiledInt(rect.x()); 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int min_y = ToCeiledInt(rect.y()); 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float max_x = rect.right(); 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float max_y = rect.bottom(); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width = std::max(ToFlooredInt(max_x) - min_x, 0); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int height = std::max(ToFlooredInt(max_y) - min_y, 0); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Rect(min_x, min_y, width, height); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Rect ToNearestRect(const RectF& rect) { 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float float_min_x = rect.x(); 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float float_min_y = rect.y(); 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float float_max_x = rect.right(); 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float float_max_y = rect.bottom(); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int min_x = ToRoundedInt(float_min_x); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int min_y = ToRoundedInt(float_min_y); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int max_x = ToRoundedInt(float_max_x); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int max_y = ToRoundedInt(float_max_y); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If these DCHECKs fail, you're using the wrong method, consider using 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ToEnclosingRect or ToEnclosedRect instead. 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(std::abs(min_x - float_min_x) < 0.01f); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(std::abs(min_y - float_min_y) < 0.01f); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(std::abs(max_x - float_max_x) < 0.01f); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(std::abs(max_y - float_max_y) < 0.01f); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Rect(min_x, min_y, max_x - min_x, max_y - min_y); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsNearestRectWithinDistance(const gfx::RectF& rect, float distance) { 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float float_min_x = rect.x(); 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float float_min_y = rect.y(); 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float float_max_x = rect.right(); 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float float_max_y = rect.bottom(); 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int min_x = ToRoundedInt(float_min_x); 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int min_y = ToRoundedInt(float_min_y); 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int max_x = ToRoundedInt(float_max_x); 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int max_y = ToRoundedInt(float_max_y); 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (std::abs(min_x - float_min_x) < distance) && 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (std::abs(min_y - float_min_y) < distance) && 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (std::abs(max_x - float_max_x) < distance) && 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (std::abs(max_y - float_max_y) < distance); 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Rect ToFlooredRectDeprecated(const RectF& rect) { 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return Rect(ToFlooredInt(rect.x()), 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ToFlooredInt(rect.y()), 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ToFlooredInt(rect.width()), 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ToFlooredInt(rect.height())); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gfx 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82