Rect.h revision 9d5316e3f56d138504565ff311145ac01621dff4
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_UI_RECT_H
18#define ANDROID_UI_RECT_H
19
20namespace android {
21namespace uirenderer {
22
23///////////////////////////////////////////////////////////////////////////////
24// Structs
25///////////////////////////////////////////////////////////////////////////////
26
27struct Rect {
28	float left;
29	float top;
30	float right;
31	float bottom;
32
33	Rect():
34			left(0),
35			top(0),
36			right(0),
37			bottom(0) {
38	}
39
40	Rect(float left, float top, float right, float bottom):
41			left(left),
42			top(top),
43			right(right),
44			bottom(bottom) {
45	}
46
47	Rect(const Rect& r) {
48		set(r);
49	}
50
51	Rect(Rect& r) {
52		set(r);
53	}
54
55	Rect& operator=(const Rect& r) {
56		set(r);
57		return *this;
58	}
59
60	Rect& operator=(Rect& r) {
61		set(r);
62		return *this;
63	}
64
65	friend int operator==(const Rect& a, const Rect& b) {
66		return !memcmp(&a, &b, sizeof(a));
67	}
68
69	friend int operator!=(const Rect& a, const Rect& b) {
70		return memcmp(&a, &b, sizeof(a));
71	}
72
73	bool isEmpty() const {
74		return left >= right || top >= bottom;
75	}
76
77	void setEmpty() {
78		memset(this, 0, sizeof(*this));
79	}
80
81	void set(float left, float top, float right, float bottom) {
82		this->left = left;
83		this->right = right;
84		this->top = top;
85		this->bottom = bottom;
86	}
87
88	void set(const Rect& r) {
89		set(r.left, r.top, r.right, r.bottom);
90	}
91
92	float getWidth() const {
93		return right - left;
94	}
95
96	float getHeight() const {
97		return bottom - top;
98	}
99
100	bool intersects(float left, float top, float right, float bottom) const {
101		return left < right && top < bottom &&
102				this->left < this->right && this->top < this->bottom &&
103			    this->left < right && left < this->right &&
104			    this->top < bottom && top < this->bottom;
105	}
106
107	bool intersects(const Rect& r) const {
108		return intersects(r.left, r.top, r.right, r.bottom);
109	}
110
111	bool intersect(float left, float top, float right, float bottom) {
112		if (left < right && top < bottom && !this->isEmpty() &&
113		        this->left < right && left < this->right &&
114		        this->top < bottom && top < this->bottom) {
115
116			if (this->left < left) this->left = left;
117			if (this->top < top) this->top = top;
118			if (this->right > right) this->right = right;
119			if (this->bottom > bottom) this->bottom = bottom;
120
121			return true;
122		}
123		return false;
124	}
125
126	bool intersect(const Rect& r) {
127		return intersect(r.left, r.top, r.right, r.bottom);
128	}
129
130	void dump() const {
131		LOGD("Rect[l=%f t=%f r=%f b=%f]", left, top, right, bottom);
132	}
133
134}; // struct Rect
135
136}; // namespace uirenderer
137}; // namespace android
138
139#endif // ANDROID_RECT_H
140