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