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_GEOMETRY_RECT_F_H_ 6#define UI_GFX_GEOMETRY_RECT_F_H_ 7 8#include <iosfwd> 9#include <string> 10 11#include "ui/gfx/geometry/point_f.h" 12#include "ui/gfx/geometry/rect_base.h" 13#include "ui/gfx/geometry/size_f.h" 14#include "ui/gfx/geometry/vector2d_f.h" 15 16namespace gfx { 17 18class InsetsF; 19 20// A floating version of gfx::Rect. 21class GFX_EXPORT RectF 22 : public RectBase<RectF, PointF, SizeF, InsetsF, Vector2dF, float> { 23 public: 24 RectF() 25 : RectBase<RectF, PointF, SizeF, InsetsF, Vector2dF, float> 26 (SizeF()) {} 27 28 RectF(float width, float height) 29 : RectBase<RectF, PointF, SizeF, InsetsF, Vector2dF, float> 30 (SizeF(width, height)) {} 31 32 RectF(float x, float y, float width, float height) 33 : RectBase<RectF, PointF, SizeF, InsetsF, Vector2dF, float> 34 (PointF(x, y), SizeF(width, height)) {} 35 36 explicit RectF(const SizeF& size) 37 : RectBase<RectF, PointF, SizeF, InsetsF, Vector2dF, float> 38 (size) {} 39 40 RectF(const PointF& origin, const SizeF& size) 41 : RectBase<RectF, PointF, SizeF, InsetsF, Vector2dF, float> 42 (origin, size) {} 43 44 ~RectF() {} 45 46 // Scales the rectangle by |scale|. 47 void Scale(float scale) { 48 Scale(scale, scale); 49 } 50 51 void Scale(float x_scale, float y_scale) { 52 set_origin(ScalePoint(origin(), x_scale, y_scale)); 53 set_size(ScaleSize(size(), x_scale, y_scale)); 54 } 55 56 // This method reports if the RectF can be safely converted to an integer 57 // Rect. When it is false, some dimension of the RectF is outside the bounds 58 // of what an integer can represent, and converting it to a Rect will require 59 // clamping. 60 bool IsExpressibleAsRect() const; 61 62 std::string ToString() const; 63}; 64 65inline bool operator==(const RectF& lhs, const RectF& rhs) { 66 return lhs.origin() == rhs.origin() && lhs.size() == rhs.size(); 67} 68 69inline bool operator!=(const RectF& lhs, const RectF& rhs) { 70 return !(lhs == rhs); 71} 72 73inline RectF operator+(const RectF& lhs, const Vector2dF& rhs) { 74 return RectF(lhs.x() + rhs.x(), lhs.y() + rhs.y(), 75 lhs.width(), lhs.height()); 76} 77 78inline RectF operator-(const RectF& lhs, const Vector2dF& rhs) { 79 return RectF(lhs.x() - rhs.x(), lhs.y() - rhs.y(), 80 lhs.width(), lhs.height()); 81} 82 83inline RectF operator+(const Vector2dF& lhs, const RectF& rhs) { 84 return rhs + lhs; 85} 86 87GFX_EXPORT RectF IntersectRects(const RectF& a, const RectF& b); 88GFX_EXPORT RectF UnionRects(const RectF& a, const RectF& b); 89GFX_EXPORT RectF SubtractRects(const RectF& a, const RectF& b); 90 91inline RectF ScaleRect(const RectF& r, float x_scale, float y_scale) { 92 return RectF(r.x() * x_scale, r.y() * y_scale, 93 r.width() * x_scale, r.height() * y_scale); 94} 95 96inline RectF ScaleRect(const RectF& r, float scale) { 97 return ScaleRect(r, scale, scale); 98} 99 100// Constructs a rectangle with |p1| and |p2| as opposite corners. 101// 102// This could also be thought of as "the smallest rect that contains both 103// points", except that we consider points on the right/bottom edges of the 104// rect to be outside the rect. So technically one or both points will not be 105// contained within the rect, because they will appear on one of these edges. 106GFX_EXPORT RectF BoundingRect(const PointF& p1, const PointF& p2); 107 108#if !defined(COMPILER_MSVC) && !defined(__native_client__) 109extern template class RectBase<RectF, PointF, SizeF, InsetsF, Vector2dF, float>; 110#endif 111 112// This is declared here for use in gtest-based unit tests but is defined in 113// the gfx_test_support target. Depend on that to use this in your unit test. 114// This should not be used in production code - call ToString() instead. 115void PrintTo(const RectF& rect, ::std::ostream* os); 116 117} // namespace gfx 118 119#endif // UI_GFX_GEOMETRY_RECT_F_H_ 120