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