Rect.h revision bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4
1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ANDROID_RECT_H
18#define ANDROID_RECT_H
19
20namespace android {
21
22///////////////////////////////////////////////////////////////////////////////
23// Structs
24///////////////////////////////////////////////////////////////////////////////
25
26struct Rect {
27	float left;
28	float top;
29	float right;
30	float bottom;
31
32	Rect(): left(0), top(0), right(0), bottom(0) { }
33
34	Rect(const Rect& r) {
35		set(r);
36	}
37
38	Rect(Rect& r) {
39		set(r);
40	}
41
42	Rect& operator=(const Rect& r) {
43		set(r);
44		return *this;
45	}
46
47	Rect& operator=(Rect& r) {
48		set(r);
49		return *this;
50	}
51
52	friend int operator==(const Rect& a, const Rect& b) {
53		return !memcmp(&a, &b, sizeof(a));
54	}
55
56	friend int operator!=(const Rect& a, const Rect& b) {
57		return memcmp(&a, &b, sizeof(a));
58	}
59
60	bool isEmpty() const {
61		return left >= right || top >= bottom;
62	}
63
64	void setEmpty() {
65		memset(this, 0, sizeof(*this));
66	}
67
68	void set(float left, float top, float right, float bottom) {
69		this->left = left;
70		this->right = right;
71		this->top = top;
72		this->bottom = bottom;
73	}
74
75	void set(const Rect& r) {
76		set(r.left, r.top, r.right, r.bottom);
77	}
78
79	float getWidth() const {
80		return right - left;
81	}
82
83	float getHeight() const {
84		return bottom - top;
85	}
86
87	bool intersects(float left, float top, float right, float bottom) const {
88		return left < right && top < bottom &&
89				this->left < this->right && this->top < this->bottom &&
90			    this->left < right && left < this->right &&
91			    this->top < bottom && top < this->bottom;
92	}
93
94	bool intersects(const Rect& r) const {
95		return intersects(r.left, r.top, r.right, r.bottom);
96	}
97
98	bool intersect(float left, float top, float right, float bottom) {
99		if (left < right && top < bottom && !this->isEmpty() &&
100		        this->left < right && left < this->right &&
101		        this->top < bottom && top < this->bottom) {
102
103			if (this->left < left) this->left = left;
104			if (this->top < top) this->top = top;
105			if (this->right > right) this->right = right;
106			if (this->bottom > bottom) this->bottom = bottom;
107
108			return true;
109		}
110		return false;
111	}
112
113	bool intersect(const Rect& r) {
114		return intersect(r.left, r.top, r.right, r.bottom);
115	}
116
117	void dump() const {
118		LOGD("Rect[l=%f t=%f r=%f b=%f]", left, top, right, bottom);
119	}
120
121}; // struct Rect
122
123}; // namespace android
124
125#endif // ANDROID_RECT_H
126