Rect.h revision 7ae7ac48aa2b53453c9805075171ecd5bcafd7de
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
179d5316e3f56d138504565ff311145ac01621dff4Romain Guy#ifndef ANDROID_UI_RECT_H
189d5316e3f56d138504565ff311145ac01621dff4Romain Guy#define ANDROID_UI_RECT_H
19bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
20bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guynamespace android {
219d5316e3f56d138504565ff311145ac01621dff4Romain Guynamespace uirenderer {
22bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
23bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy///////////////////////////////////////////////////////////////////////////////
24bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// Structs
25bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy///////////////////////////////////////////////////////////////////////////////
26bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
27bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guystruct Rect {
287ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    float left;
297ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    float top;
307ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    float right;
317ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    float bottom;
327ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
337ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    Rect():
347ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            left(0),
357ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            top(0),
367ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            right(0),
377ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            bottom(0) {
387ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
397ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
407ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    Rect(float left, float top, float right, float bottom):
417ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            left(left),
427ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            top(top),
437ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            right(right),
447ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            bottom(bottom) {
457ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
467ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
477ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    Rect(const Rect& r) {
487ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        set(r);
497ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
507ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
517ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    Rect(Rect& r) {
527ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        set(r);
537ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
547ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
557ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    Rect& operator=(const Rect& r) {
567ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        set(r);
577ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        return *this;
587ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
597ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
607ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    Rect& operator=(Rect& r) {
617ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        set(r);
627ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        return *this;
637ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
647ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
657ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    friend int operator==(const Rect& a, const Rect& b) {
667ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        return !memcmp(&a, &b, sizeof(a));
677ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
687ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
697ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    friend int operator!=(const Rect& a, const Rect& b) {
707ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        return memcmp(&a, &b, sizeof(a));
717ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
727ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
737ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    bool isEmpty() const {
747ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        return left >= right || top >= bottom;
757ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
767ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
777ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void setEmpty() {
787ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        memset(this, 0, sizeof(*this));
797ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
807ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
817ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void set(float left, float top, float right, float bottom) {
827ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        this->left = left;
837ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        this->right = right;
847ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        this->top = top;
857ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        this->bottom = bottom;
867ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
877ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
887ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void set(const Rect& r) {
897ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        set(r.left, r.top, r.right, r.bottom);
907ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
917ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
927ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    float getWidth() const {
937ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        return right - left;
947ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
957ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
967ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    float getHeight() const {
977ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        return bottom - top;
987ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
997ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
1007ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    bool intersects(float left, float top, float right, float bottom) const {
1017ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        return left < right && top < bottom &&
1027ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy                this->left < this->right && this->top < this->bottom &&
1037ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy                this->left < right && left < this->right &&
1047ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy                this->top < bottom && top < this->bottom;
1057ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
1067ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
1077ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    bool intersects(const Rect& r) const {
1087ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        return intersects(r.left, r.top, r.right, r.bottom);
1097ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
1107ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
1117ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    bool intersect(float left, float top, float right, float bottom) {
1127ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        if (left < right && top < bottom && !this->isEmpty() &&
1137ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy                this->left < right && left < this->right &&
1147ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy                this->top < bottom && top < this->bottom) {
1157ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
1167ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            if (this->left < left) this->left = left;
1177ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            if (this->top < top) this->top = top;
1187ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            if (this->right > right) this->right = right;
1197ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            if (this->bottom > bottom) this->bottom = bottom;
1207ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
1217ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            return true;
1227ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        }
1237ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        return false;
1247ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
1257ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
1267ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    bool intersect(const Rect& r) {
1277ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        return intersect(r.left, r.top, r.right, r.bottom);
1287ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
1297ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
1307ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void dump() const {
1317ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        LOGD("Rect[l=%f t=%f r=%f b=%f]", left, top, right, bottom);
1327ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
133bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
134bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}; // struct Rect
135bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
1369d5316e3f56d138504565ff311145ac01621dff4Romain Guy}; // namespace uirenderer
137bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}; // namespace android
138bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
139bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy#endif // ANDROID_RECT_H
140