Rect.h revision 4b8160fdfd3281d1d66c0cae9bb9c647b4333491
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef ANDROID_UI_RECT
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define ANDROID_UI_RECT
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/TypeHelpers.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Point.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass Rect
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int left;
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int top;
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int right;
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int bottom;
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
334b8160fdfd3281d1d66c0cae9bb9c647b4333491Mathias Agopian    typedef int value_type;
344b8160fdfd3281d1d66c0cae9bb9c647b4333491Mathias Agopian
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // we don't provide copy-ctor and operator= on purpose
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // because we want the compiler generated versions
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3835801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian    inline Rect() {
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline Rect(int w, int h)
4135801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian        : left(0), top(0), right(w), bottom(h) {
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline Rect(int l, int t, int r, int b)
4435801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian        : left(l), top(t), right(r), bottom(b) {
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline Rect(const Point& lt, const Point& rb)
4735801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian        : left(lt.x), top(lt.y), right(rb.x), bottom(rb.y) {
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void makeInvalid();
514b8160fdfd3281d1d66c0cae9bb9c647b4333491Mathias Agopian
524b8160fdfd3281d1d66c0cae9bb9c647b4333491Mathias Agopian    inline void clear() {
534b8160fdfd3281d1d66c0cae9bb9c647b4333491Mathias Agopian        left = top = right = bottom = 0;
544b8160fdfd3281d1d66c0cae9bb9c647b4333491Mathias Agopian    }
554b8160fdfd3281d1d66c0cae9bb9c647b4333491Mathias Agopian
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // a valid rectangle has a non negative width and height
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline bool isValid() const {
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (width()>=0) && (height()>=0);
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // an empty rect has a zero width or height, or is invalid
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline bool isEmpty() const {
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (width()<=0) || (height()<=0);
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline void set(const Rect& rhs) {
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        operator = (rhs);
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // rectangle's width
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline int width() const {
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return right-left;
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // rectangle's height
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline int height() const {
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return bottom-top;
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
8035801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian    void setLeftTop(const Point& lt) {
8135801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian        left = lt.x;
8235801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian        top  = lt.y;
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
8435801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian
8535801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian    void setRightBottom(const Point& rb) {
8635801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian        right = rb.x;
8735801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian        bottom  = rb.y;
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // the following 4 functions return the 4 corners of the rect as Point
9135801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian    Point leftTop() const {
9235801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian        return Point(left, top);
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
9435801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian    Point rightBottom() const {
9535801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian        return Point(right, bottom);
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Point rightTop() const {
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return Point(right, top);
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Point leftBottom() const {
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return Point(left, bottom);
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // comparisons
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline bool operator == (const Rect& rhs) const {
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (left == rhs.left) && (top == rhs.top) &&
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project               (right == rhs.right) && (bottom == rhs.bottom);
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline bool operator != (const Rect& rhs) const {
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return !operator == (rhs);
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // operator < defines an order which allows to use rectangles in sorted
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // vectors.
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bool operator < (const Rect& rhs) const;
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Rect& offsetToOrigin() {
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        right -= left;
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        bottom -= top;
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        left = top = 0;
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return *this;
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Rect& offsetTo(const Point& p) {
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return offsetTo(p.x, p.y);
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Rect& offsetBy(const Point& dp) {
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return offsetBy(dp.x, dp.y);
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Rect& operator += (const Point& rhs) {
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return offsetBy(rhs.x, rhs.y);
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Rect& operator -= (const Point& rhs) {
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return offsetBy(-rhs.x, -rhs.y);
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
13635801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian    const Rect operator + (const Point& rhs) const;
13735801cea5f301c0e1d7a93b15a8f73f98e6b1033Mathias Agopian    const Rect operator - (const Point& rhs) const;
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void translate(int dx, int dy) { // legacy, don't use.
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        offsetBy(dx, dy);
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Rect&   offsetTo(int x, int y);
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Rect&   offsetBy(int x, int y);
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bool    intersect(const Rect& with, Rect* result) const;
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS(Rect)
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_UI_RECT
153