xref: /haiku/src/servers/app/IntRect.cpp (revision 25a7b01d15612846f332751841da3579db313082)
1264fe59dSStephan Aßmus /*
2264fe59dSStephan Aßmus  * Copyright 2001-2006, Haiku, Inc. All Rights Reserved.
3264fe59dSStephan Aßmus  * Distributed under the terms of the MIT License.
4264fe59dSStephan Aßmus  *
5264fe59dSStephan Aßmus  * Authors:
6264fe59dSStephan Aßmus  *		Frans van Nispen
7264fe59dSStephan Aßmus  *		Stephan Aßmus <superstippi@gmx.de>
8264fe59dSStephan Aßmus  */
9264fe59dSStephan Aßmus 
10264fe59dSStephan Aßmus #include "IntRect.h"
11264fe59dSStephan Aßmus 
12264fe59dSStephan Aßmus #include <stdio.h>
13264fe59dSStephan Aßmus 
14264fe59dSStephan Aßmus 
15264fe59dSStephan Aßmus void
SetLeftTop(const IntPoint & p)16264fe59dSStephan Aßmus IntRect::SetLeftTop(const IntPoint& p)
17264fe59dSStephan Aßmus {
18264fe59dSStephan Aßmus 	left = p.x;
19264fe59dSStephan Aßmus 	top = p.y;
20264fe59dSStephan Aßmus }
21264fe59dSStephan Aßmus 
22264fe59dSStephan Aßmus 
23264fe59dSStephan Aßmus void
SetRightBottom(const IntPoint & p)24264fe59dSStephan Aßmus IntRect::SetRightBottom(const IntPoint& p)
25264fe59dSStephan Aßmus {
26264fe59dSStephan Aßmus 	right = p.x;
27264fe59dSStephan Aßmus 	bottom = p.y;
28264fe59dSStephan Aßmus }
29264fe59dSStephan Aßmus 
30264fe59dSStephan Aßmus 
31264fe59dSStephan Aßmus void
SetLeftBottom(const IntPoint & p)32264fe59dSStephan Aßmus IntRect::SetLeftBottom(const IntPoint& p)
33264fe59dSStephan Aßmus {
34264fe59dSStephan Aßmus 	left = p.x;
35264fe59dSStephan Aßmus 	bottom = p.y;
36264fe59dSStephan Aßmus }
37264fe59dSStephan Aßmus 
38264fe59dSStephan Aßmus 
39264fe59dSStephan Aßmus void
SetRightTop(const IntPoint & p)40264fe59dSStephan Aßmus IntRect::SetRightTop(const IntPoint& p)
41264fe59dSStephan Aßmus {
42264fe59dSStephan Aßmus 	right = p.x;
43264fe59dSStephan Aßmus 	top = p.y;
44264fe59dSStephan Aßmus }
45264fe59dSStephan Aßmus 
46264fe59dSStephan Aßmus 
47264fe59dSStephan Aßmus void
InsetBy(const IntPoint & point)48264fe59dSStephan Aßmus IntRect::InsetBy(const IntPoint& point)
49264fe59dSStephan Aßmus {
50264fe59dSStephan Aßmus 	 left += point.x;
51264fe59dSStephan Aßmus 	 right -= point.x;
52264fe59dSStephan Aßmus 	 top += point.y;
53264fe59dSStephan Aßmus 	 bottom -= point.y;
54264fe59dSStephan Aßmus }
55264fe59dSStephan Aßmus 
56264fe59dSStephan Aßmus 
57264fe59dSStephan Aßmus void
InsetBy(int32 dx,int32 dy)58264fe59dSStephan Aßmus IntRect::InsetBy(int32 dx, int32 dy)
59264fe59dSStephan Aßmus {
60264fe59dSStephan Aßmus 	 left += dx;
61264fe59dSStephan Aßmus 	 right -= dx;
62264fe59dSStephan Aßmus 	 top += dy;
63264fe59dSStephan Aßmus 	 bottom -= dy;
64264fe59dSStephan Aßmus }
65264fe59dSStephan Aßmus 
66264fe59dSStephan Aßmus 
67264fe59dSStephan Aßmus IntRect&
InsetBySelf(const IntPoint & point)68264fe59dSStephan Aßmus IntRect::InsetBySelf(const IntPoint& point)
69264fe59dSStephan Aßmus {
70264fe59dSStephan Aßmus 	InsetBy(point);
71264fe59dSStephan Aßmus 	return *this;
72264fe59dSStephan Aßmus }
73264fe59dSStephan Aßmus 
74264fe59dSStephan Aßmus 
75264fe59dSStephan Aßmus IntRect&
InsetBySelf(int32 dx,int32 dy)76264fe59dSStephan Aßmus IntRect::InsetBySelf(int32 dx, int32 dy)
77264fe59dSStephan Aßmus {
78264fe59dSStephan Aßmus 	InsetBy(dx, dy);
79264fe59dSStephan Aßmus 	return *this;
80264fe59dSStephan Aßmus }
81264fe59dSStephan Aßmus 
82264fe59dSStephan Aßmus 
83264fe59dSStephan Aßmus IntRect
InsetByCopy(const IntPoint & point)84264fe59dSStephan Aßmus IntRect::InsetByCopy(const IntPoint& point)
85264fe59dSStephan Aßmus {
86264fe59dSStephan Aßmus 	IntRect copy(*this);
87264fe59dSStephan Aßmus 	copy.InsetBy(point);
88264fe59dSStephan Aßmus 	return copy;
89264fe59dSStephan Aßmus }
90264fe59dSStephan Aßmus 
91264fe59dSStephan Aßmus 
92264fe59dSStephan Aßmus IntRect
InsetByCopy(int32 dx,int32 dy)93264fe59dSStephan Aßmus IntRect::InsetByCopy(int32 dx, int32 dy)
94264fe59dSStephan Aßmus {
95264fe59dSStephan Aßmus 	IntRect copy(*this);
96264fe59dSStephan Aßmus 	copy.InsetBy(dx, dy);
97264fe59dSStephan Aßmus 	return copy;
98264fe59dSStephan Aßmus }
99264fe59dSStephan Aßmus 
100264fe59dSStephan Aßmus 
101264fe59dSStephan Aßmus void
OffsetBy(const IntPoint & point)102264fe59dSStephan Aßmus IntRect::OffsetBy(const IntPoint& point)
103264fe59dSStephan Aßmus {
104264fe59dSStephan Aßmus 	 left += point.x;
105264fe59dSStephan Aßmus 	 right += point.x;
106264fe59dSStephan Aßmus 	 top += point.y;
107264fe59dSStephan Aßmus 	 bottom += point.y;
108264fe59dSStephan Aßmus }
109264fe59dSStephan Aßmus 
110264fe59dSStephan Aßmus 
111264fe59dSStephan Aßmus void
OffsetBy(int32 dx,int32 dy)112264fe59dSStephan Aßmus IntRect::OffsetBy(int32 dx, int32 dy)
113264fe59dSStephan Aßmus {
114264fe59dSStephan Aßmus 	 left += dx;
115264fe59dSStephan Aßmus 	 right += dx;
116264fe59dSStephan Aßmus 	 top += dy;
117264fe59dSStephan Aßmus 	 bottom += dy;
118264fe59dSStephan Aßmus }
119264fe59dSStephan Aßmus 
120264fe59dSStephan Aßmus 
121264fe59dSStephan Aßmus IntRect&
OffsetBySelf(const IntPoint & point)122264fe59dSStephan Aßmus IntRect::OffsetBySelf(const IntPoint& point)
123264fe59dSStephan Aßmus {
124264fe59dSStephan Aßmus 	OffsetBy(point);
125264fe59dSStephan Aßmus 	return *this;
126264fe59dSStephan Aßmus }
127264fe59dSStephan Aßmus 
128264fe59dSStephan Aßmus 
129264fe59dSStephan Aßmus IntRect&
OffsetBySelf(int32 dx,int32 dy)130264fe59dSStephan Aßmus IntRect::OffsetBySelf(int32 dx, int32 dy)
131264fe59dSStephan Aßmus {
132264fe59dSStephan Aßmus 	OffsetBy(dx, dy);
133264fe59dSStephan Aßmus 	return *this;
134264fe59dSStephan Aßmus }
135264fe59dSStephan Aßmus 
136264fe59dSStephan Aßmus 
137264fe59dSStephan Aßmus IntRect
OffsetByCopy(const IntPoint & point)138264fe59dSStephan Aßmus IntRect::OffsetByCopy(const IntPoint& point)
139264fe59dSStephan Aßmus {
140264fe59dSStephan Aßmus 	IntRect copy(*this);
141264fe59dSStephan Aßmus 	copy.OffsetBy(point);
142264fe59dSStephan Aßmus 	return copy;
143264fe59dSStephan Aßmus }
144264fe59dSStephan Aßmus 
145264fe59dSStephan Aßmus 
146264fe59dSStephan Aßmus IntRect
OffsetByCopy(int32 dx,int32 dy)147264fe59dSStephan Aßmus IntRect::OffsetByCopy(int32 dx, int32 dy)
148264fe59dSStephan Aßmus {
149264fe59dSStephan Aßmus 	IntRect copy(*this);
150264fe59dSStephan Aßmus 	copy.OffsetBy(dx, dy);
151264fe59dSStephan Aßmus 	return copy;
152264fe59dSStephan Aßmus }
153264fe59dSStephan Aßmus 
154264fe59dSStephan Aßmus 
155264fe59dSStephan Aßmus void
OffsetTo(const IntPoint & point)156264fe59dSStephan Aßmus IntRect::OffsetTo(const IntPoint& point)
157264fe59dSStephan Aßmus {
158264fe59dSStephan Aßmus 	 right = (right - left) + point.x;
159264fe59dSStephan Aßmus 	 left = point.x;
160264fe59dSStephan Aßmus 	 bottom = (bottom - top) + point.y;
161264fe59dSStephan Aßmus 	 top = point.y;
162264fe59dSStephan Aßmus }
163264fe59dSStephan Aßmus 
164264fe59dSStephan Aßmus 
165264fe59dSStephan Aßmus void
OffsetTo(int32 x,int32 y)166264fe59dSStephan Aßmus IntRect::OffsetTo(int32 x, int32 y)
167264fe59dSStephan Aßmus {
168264fe59dSStephan Aßmus 	 right = (right - left) + x;
169264fe59dSStephan Aßmus 	 left = x;
170264fe59dSStephan Aßmus 	 bottom = (bottom - top) + y;
171264fe59dSStephan Aßmus 	 top=y;
172264fe59dSStephan Aßmus }
173264fe59dSStephan Aßmus 
174264fe59dSStephan Aßmus 
175264fe59dSStephan Aßmus IntRect&
OffsetToSelf(const IntPoint & point)176264fe59dSStephan Aßmus IntRect::OffsetToSelf(const IntPoint& point)
177264fe59dSStephan Aßmus {
178264fe59dSStephan Aßmus 	OffsetTo(point);
179264fe59dSStephan Aßmus 	return *this;
180264fe59dSStephan Aßmus }
181264fe59dSStephan Aßmus 
182264fe59dSStephan Aßmus 
183264fe59dSStephan Aßmus IntRect&
OffsetToSelf(int32 dx,int32 dy)184264fe59dSStephan Aßmus IntRect::OffsetToSelf(int32 dx, int32 dy)
185264fe59dSStephan Aßmus {
186264fe59dSStephan Aßmus 	OffsetTo(dx, dy);
187264fe59dSStephan Aßmus 	return *this;
188264fe59dSStephan Aßmus }
189264fe59dSStephan Aßmus 
190264fe59dSStephan Aßmus 
191264fe59dSStephan Aßmus IntRect
OffsetToCopy(const IntPoint & point)192264fe59dSStephan Aßmus IntRect::OffsetToCopy(const IntPoint& point)
193264fe59dSStephan Aßmus {
194264fe59dSStephan Aßmus 	IntRect copy(*this);
195264fe59dSStephan Aßmus 	copy.OffsetTo(point);
196264fe59dSStephan Aßmus 	return copy;
197264fe59dSStephan Aßmus }
198264fe59dSStephan Aßmus 
199264fe59dSStephan Aßmus 
200264fe59dSStephan Aßmus IntRect
OffsetToCopy(int32 dx,int32 dy)201264fe59dSStephan Aßmus IntRect::OffsetToCopy(int32 dx, int32 dy)
202264fe59dSStephan Aßmus {
203264fe59dSStephan Aßmus 	IntRect copy(*this);
204264fe59dSStephan Aßmus 	copy.OffsetTo(dx, dy);
205264fe59dSStephan Aßmus 	return copy;
206264fe59dSStephan Aßmus }
207264fe59dSStephan Aßmus 
208264fe59dSStephan Aßmus 
209264fe59dSStephan Aßmus void
PrintToStream() const210264fe59dSStephan Aßmus IntRect::PrintToStream() const
211264fe59dSStephan Aßmus {
212*3fed1a15SAlex Smith 	printf("IntRect(l:%" B_PRId32 ", t:%" B_PRId32 ", r:%" B_PRId32 ", b:%"
213*3fed1a15SAlex Smith 		B_PRId32 ")\n", left, top, right, bottom);
214264fe59dSStephan Aßmus }
215264fe59dSStephan Aßmus 
216264fe59dSStephan Aßmus 
217264fe59dSStephan Aßmus bool
operator ==(const IntRect & rect) const218264fe59dSStephan Aßmus IntRect::operator==(const IntRect& rect) const
219264fe59dSStephan Aßmus {
220264fe59dSStephan Aßmus 	 return left == rect.left && right == rect.right &&
221264fe59dSStephan Aßmus 	 		top == rect.top && bottom == rect.bottom;
222264fe59dSStephan Aßmus }
223264fe59dSStephan Aßmus 
224264fe59dSStephan Aßmus 
225264fe59dSStephan Aßmus bool
operator !=(const IntRect & rect) const226264fe59dSStephan Aßmus IntRect::operator!=(const IntRect& rect) const
227264fe59dSStephan Aßmus {
228264fe59dSStephan Aßmus 	 return !(*this == rect);
229264fe59dSStephan Aßmus }
230264fe59dSStephan Aßmus 
231264fe59dSStephan Aßmus 
232264fe59dSStephan Aßmus IntRect
operator &(const IntRect & rect) const233264fe59dSStephan Aßmus IntRect::operator&(const IntRect& rect) const
234264fe59dSStephan Aßmus {
235264fe59dSStephan Aßmus 	 return IntRect(max_c(left, rect.left), max_c(top, rect.top),
236264fe59dSStephan Aßmus 	 				min_c(right, rect.right), min_c(bottom, rect.bottom));
237264fe59dSStephan Aßmus }
238264fe59dSStephan Aßmus 
239264fe59dSStephan Aßmus 
240264fe59dSStephan Aßmus IntRect
operator |(const IntRect & rect) const241264fe59dSStephan Aßmus IntRect::operator|(const IntRect& rect) const
242264fe59dSStephan Aßmus {
243264fe59dSStephan Aßmus 	 return IntRect(min_c(left, rect.left), min_c(top, rect.top),
244264fe59dSStephan Aßmus 	 				max_c(right, rect.right), max_c(bottom, rect.bottom));
245264fe59dSStephan Aßmus }
246264fe59dSStephan Aßmus 
247264fe59dSStephan Aßmus 
248264fe59dSStephan Aßmus bool
Intersects(const IntRect & rect) const249264fe59dSStephan Aßmus IntRect::Intersects(const IntRect& rect) const
250264fe59dSStephan Aßmus {
251264fe59dSStephan Aßmus 	if (!IsValid() || !rect.IsValid())
252264fe59dSStephan Aßmus 		return false;
253264fe59dSStephan Aßmus 
254264fe59dSStephan Aßmus 	return !(rect.left > right || rect.right < left
255264fe59dSStephan Aßmus 			|| rect.top > bottom || rect.bottom < top);
256264fe59dSStephan Aßmus }
257264fe59dSStephan Aßmus 
258264fe59dSStephan Aßmus 
259264fe59dSStephan Aßmus bool
Contains(const IntPoint & point) const260264fe59dSStephan Aßmus IntRect::Contains(const IntPoint& point) const
261264fe59dSStephan Aßmus {
262264fe59dSStephan Aßmus 	return point.x >= left && point.x <= right
263264fe59dSStephan Aßmus 			&& point.y >= top && point.y <= bottom;
264264fe59dSStephan Aßmus }
265264fe59dSStephan Aßmus 
266264fe59dSStephan Aßmus 
267264fe59dSStephan Aßmus bool
Contains(const IntRect & rect) const268264fe59dSStephan Aßmus IntRect::Contains(const IntRect& rect) const
269264fe59dSStephan Aßmus {
270264fe59dSStephan Aßmus 	return rect.left >= left && rect.right <= right
271264fe59dSStephan Aßmus 			&& rect.top >= top && rect.bottom <= bottom;
272264fe59dSStephan Aßmus }
273264fe59dSStephan Aßmus 
274