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