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.
5 #ifndef UI_GFX_GEOMETRY_RECT_F_H_
6 #define UI_GFX_GEOMETRY_RECT_F_H_
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"
20 // A floating version of gfx::Rect.
21 class GFX_EXPORT RectF
22 : public RectBase
<RectF
, PointF
, SizeF
, InsetsF
, Vector2dF
, float> {
25 : RectBase
<RectF
, PointF
, SizeF
, InsetsF
, Vector2dF
, float>
28 RectF(float width
, float height
)
29 : RectBase
<RectF
, PointF
, SizeF
, InsetsF
, Vector2dF
, float>
30 (SizeF(width
, height
)) {}
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
)) {}
36 explicit RectF(const SizeF
& size
)
37 : RectBase
<RectF
, PointF
, SizeF
, InsetsF
, Vector2dF
, float>
40 RectF(const PointF
& origin
, const SizeF
& size
)
41 : RectBase
<RectF
, PointF
, SizeF
, InsetsF
, Vector2dF
, float>
46 // Scales the rectangle by |scale|.
47 void Scale(float scale
) {
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
));
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
60 bool IsExpressibleAsRect() const;
62 std::string
ToString() const;
65 inline bool operator==(const RectF
& lhs
, const RectF
& rhs
) {
66 return lhs
.origin() == rhs
.origin() && lhs
.size() == rhs
.size();
69 inline bool operator!=(const RectF
& lhs
, const RectF
& rhs
) {
73 inline RectF
operator+(const RectF
& lhs
, const Vector2dF
& rhs
) {
74 return RectF(lhs
.x() + rhs
.x(), lhs
.y() + rhs
.y(),
75 lhs
.width(), lhs
.height());
78 inline RectF
operator-(const RectF
& lhs
, const Vector2dF
& rhs
) {
79 return RectF(lhs
.x() - rhs
.x(), lhs
.y() - rhs
.y(),
80 lhs
.width(), lhs
.height());
83 inline RectF
operator+(const Vector2dF
& lhs
, const RectF
& rhs
) {
87 GFX_EXPORT RectF
IntersectRects(const RectF
& a
, const RectF
& b
);
88 GFX_EXPORT RectF
UnionRects(const RectF
& a
, const RectF
& b
);
89 GFX_EXPORT RectF
SubtractRects(const RectF
& a
, const RectF
& b
);
91 inline 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
);
96 inline RectF
ScaleRect(const RectF
& r
, float scale
) {
97 return ScaleRect(r
, scale
, scale
);
100 // Constructs a rectangle with |p1| and |p2| as opposite corners.
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.
106 GFX_EXPORT RectF
BoundingRect(const PointF
& p1
, const PointF
& p2
);
108 #if !defined(COMPILER_MSVC)
109 extern template class RectBase
<RectF
, PointF
, SizeF
, InsetsF
, Vector2dF
, float>;
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.
115 void PrintTo(const RectF
& rect
, ::std::ostream
* os
);
119 #endif // UI_GFX_GEOMETRY_RECT_F_H_