master chld/haikuprg / decor / MacDecorator / includes / IntRect.h
  1/*
  2 * Copyright 2001-2006, Haiku, Inc. All Rights Reserved.
  3 * Distributed under the terms of the MIT License.
  4 *
  5 * Authors:
  6 *		Frans van Nispen
  7 *		Stephan Aßmus <superstippi@gmx.de>
  8 */
  9
 10#ifndef	INT_RECT_H
 11#define	INT_RECT_H
 12
 13
 14#include <Region.h>
 15
 16#include "IntPoint.h"
 17
 18class IntRect {
 19 public:
 20			int32				left;
 21			int32				top;
 22			int32				right;
 23			int32				bottom;
 24	
 25								IntRect();
 26								IntRect(const IntRect& r);
 27								IntRect(const BRect& r);
 28								IntRect(int32 l, int32 t, int32 r, int32 b);
 29								IntRect(const IntPoint& lt,
 30										const IntPoint& rb);
 31	
 32			IntRect&			operator=(const IntRect &r);
 33			void				Set(int32 l, int32 t, int32 r, int32 b);
 34	
 35			void				PrintToStream() const;
 36	
 37			IntPoint			LeftTop() const;
 38			IntPoint			RightBottom() const;
 39			IntPoint			LeftBottom() const;
 40			IntPoint			RightTop() const;
 41	
 42			void				SetLeftTop(const IntPoint& p);
 43			void				SetRightBottom(const IntPoint& p);
 44			void				SetLeftBottom(const IntPoint& p);
 45			void				SetRightTop(const IntPoint& p);
 46	
 47			// transformation
 48			void				InsetBy(const IntPoint& p);
 49			void				InsetBy(int32 dx, int32 dy);
 50			void				OffsetBy(const IntPoint& p);
 51			void				OffsetBy(int32 dx, int32 dy);
 52			void				OffsetTo(const IntPoint& p);
 53			void				OffsetTo(int32 x, int32 y);
 54	
 55			// expression transformations
 56			IntRect&			InsetBySelf(const IntPoint& p);
 57			IntRect&			InsetBySelf(int32 dx, int32 dy);
 58			IntRect				InsetByCopy(const IntPoint& p);
 59			IntRect				InsetByCopy(int32 dx, int32 dy);
 60			IntRect&			OffsetBySelf(const IntPoint& p);
 61			IntRect&			OffsetBySelf(int32 dx, int32 dy);
 62			IntRect				OffsetByCopy(const IntPoint& p);
 63			IntRect				OffsetByCopy(int32 dx, int32 dy);
 64			IntRect&			OffsetToSelf(const IntPoint& p);
 65			IntRect&			OffsetToSelf(int32 dx, int32 dy);
 66			IntRect				OffsetToCopy(const IntPoint& p);
 67			IntRect				OffsetToCopy(int32 dx, int32 dy);
 68	
 69			// comparison
 70			bool				operator==(const IntRect& r) const;
 71			bool				operator!=(const IntRect& r) const;
 72	
 73			// intersection and union
 74			IntRect				operator&(const IntRect& r) const;
 75			IntRect				operator|(const IntRect& r) const;
 76
 77			// conversion to BRect and clipping_rect
 78								operator clipping_rect() const;
 79								operator BRect() const
 80									{ return BRect(left, top,
 81												   right, bottom); }
 82	
 83			bool				Intersects(const IntRect& r) const;
 84			bool				IsValid() const;
 85			int32				Width() const;
 86			int32				IntegerWidth() const;
 87			int32				Height() const;
 88			int32				IntegerHeight() const;
 89			bool				Contains(const IntPoint& p) const;
 90			bool				Contains(const IntRect& r) const;
 91};
 92
 93
 94// inline definitions ----------------------------------------------------------
 95
 96inline IntPoint
 97IntRect::LeftTop() const
 98{
 99	return *(const IntPoint*)&left;
100}
101
102
103inline IntPoint
104IntRect::RightBottom() const
105{
106	return *(const IntPoint*)&right;
107}
108
109
110inline IntPoint
111IntRect::LeftBottom() const
112{
113	return IntPoint(left, bottom);
114}
115
116
117inline IntPoint
118IntRect::RightTop() const
119{
120	return IntPoint(right, top);
121}
122
123
124inline
125IntRect::IntRect()
126{
127	top = left = 0;
128	bottom = right = -1;
129}
130
131
132inline
133IntRect::IntRect(int32 l, int32 t, int32 r, int32 b)
134{
135	left = l;
136	top = t;
137	right = r;
138	bottom = b;
139}
140
141
142inline
143IntRect::IntRect(const IntRect &r)
144{
145	left = r.left;
146	top = r.top;
147	right = r.right;
148	bottom = r.bottom;
149}
150
151
152inline
153IntRect::IntRect(const BRect &r)
154{
155	left = (int32)r.left;
156	top = (int32)r.top;
157	right = (int32)r.right;
158	bottom = (int32)r.bottom;
159}
160
161
162inline
163IntRect::IntRect(const IntPoint& leftTop, const IntPoint& rightBottom)
164{
165	left = leftTop.x;
166	top = leftTop.y;
167	right = rightBottom.x;
168	bottom = rightBottom.y;
169}
170
171
172inline IntRect &
173IntRect::operator=(const IntRect& from)
174{
175	left = from.left;
176	top = from.top;
177	right = from.right;
178	bottom = from.bottom;
179	return *this;
180}
181
182
183inline void
184IntRect::Set(int32 l, int32 t, int32 r, int32 b)
185{
186	left = l;
187	top = t;
188	right = r;
189	bottom = b;
190}
191
192
193inline bool
194IntRect::IsValid() const
195{
196	return left <= right && top <= bottom;
197}
198
199
200inline int32
201IntRect::IntegerWidth() const
202{
203	return right - left;
204}
205
206
207inline int32
208IntRect::Width() const
209{
210	return right - left;
211}
212
213
214inline int32
215IntRect::IntegerHeight() const
216{
217	return bottom - top;
218}
219
220
221inline int32
222IntRect::Height() const
223{
224	return bottom - top;
225}
226
227inline
228IntRect::operator clipping_rect() const
229{
230	clipping_rect r;
231	r.left = left;
232	r.top = top;
233	r.right = right;
234	r.bottom = bottom;
235	return r;
236}
237
238
239#endif	// INT_RECT_H