1 /*
2 * Copyright 2001-2012, Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5 #ifndef _RECT_H
6 #define _RECT_H
7
8
9 #include <math.h>
10
11 #include <Point.h>
12 #include <Size.h>
13
14
15 class BRect {
16 public:
17 float left;
18 float top;
19 float right;
20 float bottom;
21
22 BRect();
23 BRect(const BRect& other);
24 BRect(float left, float top, float right,
25 float bottom);
26 BRect(BPoint leftTop, BPoint rightBottom);
27 BRect(BPoint leftTop, BSize size);
28 BRect(float side);
29 BRect(float width, float height);
30
31 BRect& operator=(const BRect& other);
32 void Set(float left, float top, float right,
33 float bottom);
34
35 void PrintToStream() const;
36
37 BPoint LeftTop() const;
38 BPoint RightBottom() const;
39 BPoint LeftBottom() const;
40 BPoint RightTop() const;
41
42 void SetLeftTop(const BPoint point);
43 void SetRightBottom(const BPoint point);
44 void SetLeftBottom(const BPoint point);
45 void SetRightTop(const BPoint point);
46
47 // Transformation
48 void InsetBy(BPoint inset);
49 void InsetBy(float dx, float dy);
50 void OffsetBy(BPoint delta);
51 void OffsetBy(float dx, float dy);
52 void OffsetTo(BPoint offset);
53 void OffsetTo(float x, float y);
54
55 // Expression transformations
56 BRect& InsetBySelf(BPoint inset);
57 BRect& InsetBySelf(float dx, float dy);
58 BRect InsetByCopy(BPoint inset) const;
59 BRect InsetByCopy(float dx, float dy) const;
60 BRect& OffsetBySelf(BPoint offset);
61 BRect& OffsetBySelf(float dx, float dy);
62 BRect OffsetByCopy(BPoint offset) const;
63 BRect OffsetByCopy(float dx, float dy) const;
64 BRect& OffsetToSelf(BPoint offset);
65 BRect& OffsetToSelf(float x, float y);
66 BRect OffsetToCopy(BPoint offset) const;
67 BRect OffsetToCopy(float x, float y) const;
68
69 // Comparison
70 bool operator==(BRect other) const;
71 bool operator!=(BRect other) const;
72
73 // Intersection and union
74 BRect operator&(BRect other) const;
75 BRect operator|(BRect other) const;
76
77 bool IsValid() const;
78 float Width() const;
79 int32 IntegerWidth() const;
80 float Height() const;
81 int32 IntegerHeight() const;
82 BSize Size() const;
83
84 bool Intersects(BRect rect) const;
85 bool Contains(BPoint point) const;
86 bool Contains(BRect rect) const;
87 };
88
89
90 // #pragma mark - inline definitions
91
92 inline BPoint
LeftTop()93 BRect::LeftTop() const
94 {
95 return *(const BPoint*)&left;
96 }
97
98
99 inline BPoint
RightBottom()100 BRect::RightBottom() const
101 {
102 return *(const BPoint*)&right;
103 }
104
105
106 inline BPoint
LeftBottom()107 BRect::LeftBottom() const
108 {
109 return BPoint(left, bottom);
110 }
111
112
113 inline BPoint
RightTop()114 BRect::RightTop() const
115 {
116 return BPoint(right, top);
117 }
118
119
120 inline
BRect()121 BRect::BRect()
122 :
123 left(0),
124 top(0),
125 right(-1),
126 bottom(-1)
127 {
128 }
129
130
131 inline
BRect(float left,float top,float right,float bottom)132 BRect::BRect(float left, float top, float right, float bottom)
133 :
134 left(left),
135 top(top),
136 right(right),
137 bottom(bottom)
138 {
139 }
140
141
142 inline
BRect(const BRect & other)143 BRect::BRect(const BRect& other)
144 :
145 left(other.left),
146 top(other.top),
147 right(other.right),
148 bottom(other.bottom)
149 {
150 }
151
152
153 inline
BRect(BPoint leftTop,BPoint rightBottom)154 BRect::BRect(BPoint leftTop, BPoint rightBottom)
155 :
156 left(leftTop.x),
157 top(leftTop.y),
158 right(rightBottom.x),
159 bottom(rightBottom.y)
160 {
161 }
162
163
164 inline
BRect(BPoint leftTop,BSize size)165 BRect::BRect(BPoint leftTop, BSize size)
166 :
167 left(leftTop.x),
168 top(leftTop.y),
169 right(leftTop.x + size.width),
170 bottom(leftTop.y + size.height)
171 {
172 }
173
174
175 inline
BRect(float side)176 BRect::BRect(float side)
177 :
178 left(0),
179 top(0),
180 right(side - 1),
181 bottom(side - 1)
182 {
183 }
184
185
186 inline
BRect(float width,float height)187 BRect::BRect(float width, float height)
188 :
189 left(0),
190 top(0),
191 right(width),
192 bottom(height)
193 {
194 }
195
196
197 inline BRect&
198 BRect::operator=(const BRect& other)
199 {
200 left = other.left;
201 top = other.top;
202 right = other.right;
203 bottom = other.bottom;
204 return *this;
205 }
206
207
208 inline void
Set(float left,float top,float right,float bottom)209 BRect::Set(float left, float top, float right, float bottom)
210 {
211 this->left = left;
212 this->top = top;
213 this->right = right;
214 this->bottom = bottom;
215 }
216
217
218 inline bool
IsValid()219 BRect::IsValid() const
220 {
221 return left <= right && top <= bottom;
222 }
223
224
225 inline int32
IntegerWidth()226 BRect::IntegerWidth() const
227 {
228 return (int32)ceil(right - left);
229 }
230
231
232 inline float
Width()233 BRect::Width() const
234 {
235 return right - left;
236 }
237
238
239 inline int32
IntegerHeight()240 BRect::IntegerHeight() const
241 {
242 return (int32)ceil(bottom - top);
243 }
244
245
246 inline float
Height()247 BRect::Height() const
248 {
249 return bottom - top;
250 }
251
252
253 inline BSize
Size()254 BRect::Size() const
255 {
256 return BSize(right - left, bottom - top);
257 }
258
259
260 #endif // _RECT_H
261