Rect.h revision ae88e5e8e9cb6c9539314c4360c5b20f8ec1fefc
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
205cbbce535744b89df5ecea95de21ee3733298260Romain Guy#include <utils/Log.h>
215cbbce535744b89df5ecea95de21ee3733298260Romain Guy
22bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guynamespace android {
239d5316e3f56d138504565ff311145ac01621dff4Romain Guynamespace uirenderer {
24bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
25bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy///////////////////////////////////////////////////////////////////////////////
26bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// Structs
27bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy///////////////////////////////////////////////////////////////////////////////
28bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
29bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guystruct Rect {
307ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    float left;
317ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    float top;
327ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    float right;
337ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    float bottom;
347ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
357ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    Rect():
367ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            left(0),
377ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            top(0),
387ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            right(0),
397ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            bottom(0) {
407ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
417ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
427ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    Rect(float left, float top, float right, float bottom):
437ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            left(left),
447ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            top(top),
457ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            right(right),
467ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            bottom(bottom) {
477ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
487ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
497ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    Rect(const Rect& r) {
507ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        set(r);
517ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
527ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
537ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    Rect(Rect& r) {
547ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        set(r);
557ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
567ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
577ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    Rect& operator=(const Rect& r) {
587ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        set(r);
597ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        return *this;
607ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
617ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
627ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    Rect& operator=(Rect& r) {
637ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        set(r);
647ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        return *this;
657ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
667ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
677ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    friend int operator==(const Rect& a, const Rect& b) {
687ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        return !memcmp(&a, &b, sizeof(a));
697ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
707ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
717ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    friend int operator!=(const Rect& a, const Rect& b) {
727ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        return memcmp(&a, &b, sizeof(a));
737ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
747ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
757ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    bool isEmpty() const {
767ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        return left >= right || top >= bottom;
777ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
787ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
797ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void setEmpty() {
807ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        memset(this, 0, sizeof(*this));
817ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
827ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
837ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void set(float left, float top, float right, float bottom) {
847ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        this->left = left;
857ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        this->right = right;
867ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        this->top = top;
877ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        this->bottom = bottom;
887ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
897ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
907ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void set(const Rect& r) {
917ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        set(r.left, r.top, r.right, r.bottom);
927ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
937ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
948aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy    inline float getWidth() const {
957ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        return right - left;
967ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
977ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
988aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy    inline float getHeight() const {
997ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        return bottom - top;
1007ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
1017ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
1027ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    bool intersects(float left, float top, float right, float bottom) const {
1037ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        return left < right && top < bottom &&
1047ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy                this->left < this->right && this->top < this->bottom &&
1057ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy                this->left < right && left < this->right &&
1067ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy                this->top < bottom && top < this->bottom;
1077ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
1087ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
1097ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    bool intersects(const Rect& r) const {
1107ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        return intersects(r.left, r.top, r.right, r.bottom);
1117ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
1127ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
1137ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    bool intersect(float left, float top, float right, float bottom) {
1147ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        if (left < right && top < bottom && !this->isEmpty() &&
1157ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy                this->left < right && left < this->right &&
1167ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy                this->top < bottom && top < this->bottom) {
1177ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
1187ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            if (this->left < left) this->left = left;
1197ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            if (this->top < top) this->top = top;
1207ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            if (this->right > right) this->right = right;
1217ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            if (this->bottom > bottom) this->bottom = bottom;
1227ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
1237ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            return true;
1247ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        }
1257ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        return false;
1267ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
1277ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
1287ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    bool intersect(const Rect& r) {
1297ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        return intersect(r.left, r.top, r.right, r.bottom);
1307ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
1317ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy
132079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy    bool unionWith(const Rect& r) {
133079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy        if (r.left < r.right && r.top < r.bottom) {
134079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy            if (left < right && top < bottom) {
135079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy                if (left > r.left) left = r.left;
136079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy                if (top > r.top) top = r.top;
137079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy                if (right < r.right) right = r.right;
138079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy                if (bottom < r.bottom) bottom = r.bottom;
139079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy                return true;
140079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy            } else {
141079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy                left = r.left;
142079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy                top = r.top;
143079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy                right = r.right;
144079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy                bottom = r.bottom;
145079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy                return true;
146079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy            }
147079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy        }
148079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy        return false;
149079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy    }
150079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy
151bf434114cbf55b216fdc76fc8d65a75e84c9dab5Romain Guy    void snapToPixelBoundaries() {
152ae88e5e8e9cb6c9539314c4360c5b20f8ec1fefcRomain Guy        left = floorf(left + 0.5f);
153ae88e5e8e9cb6c9539314c4360c5b20f8ec1fefcRomain Guy        top = floorf(top + 0.5f);
154ae88e5e8e9cb6c9539314c4360c5b20f8ec1fefcRomain Guy        right = floorf(right + 0.5f);
155ae88e5e8e9cb6c9539314c4360c5b20f8ec1fefcRomain Guy        bottom = floorf(bottom + 0.5f);
156bf434114cbf55b216fdc76fc8d65a75e84c9dab5Romain Guy    }
157bf434114cbf55b216fdc76fc8d65a75e84c9dab5Romain Guy
1587ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void dump() const {
1597ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        LOGD("Rect[l=%f t=%f r=%f b=%f]", left, top, right, bottom);
1607ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
161bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
162bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}; // struct Rect
163bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
1649d5316e3f56d138504565ff311145ac01621dff4Romain Guy}; // namespace uirenderer
165bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}; // namespace android
166bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
167759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy#endif // ANDROID_UI_RECT_H
168