• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2006 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
18 #define ANDROID_UI_RECT
19 
20 #include <utils/Flattenable.h>
21 #include <utils/TypeHelpers.h>
22 #include <ui/Point.h>
23 
24 #include <android/rect.h>
25 
26 namespace android {
27 
28 class Rect : public ARect, public LightFlattenablePod<Rect>
29 {
30 public:
31     typedef ARect::value_type value_type;
32 
33     // we don't provide copy-ctor and operator= on purpose
34     // because we want the compiler generated versions
35 
Rect()36     inline Rect() {
37     }
Rect(int32_t w,int32_t h)38     inline Rect(int32_t w, int32_t h) {
39         left = top = 0; right = w; bottom = h;
40     }
Rect(int32_t l,int32_t t,int32_t r,int32_t b)41     inline Rect(int32_t l, int32_t t, int32_t r, int32_t b) {
42         left = l; top = t; right = r; bottom = b;
43     }
Rect(const Point & lt,const Point & rb)44     inline Rect(const Point& lt, const Point& rb) {
45         left = lt.x; top = lt.y; right = rb.x; bottom = rb.y;
46     }
47 
48     void makeInvalid();
49 
clear()50     inline void clear() {
51         left = top = right = bottom = 0;
52     }
53 
54     // a valid rectangle has a non negative width and height
isValid()55     inline bool isValid() const {
56         return (width()>=0) && (height()>=0);
57     }
58 
59     // an empty rect has a zero width or height, or is invalid
isEmpty()60     inline bool isEmpty() const {
61         return (width()<=0) || (height()<=0);
62     }
63 
set(const Rect & rhs)64     inline void set(const Rect& rhs) {
65         operator = (rhs);
66     }
67 
68     // rectangle's width
getWidth()69     inline int32_t getWidth() const {
70         return right-left;
71     }
72 
73     // rectangle's height
getHeight()74     inline int32_t getHeight() const {
75         return bottom-top;
76     }
77 
getBounds()78     inline Rect getBounds() const {
79         return Rect(right-left, bottom-top);
80     }
81 
width()82     inline int32_t width() const { return getWidth(); }
height()83     inline int32_t height() const { return getHeight(); }
84 
setLeftTop(const Point & lt)85     void setLeftTop(const Point& lt) {
86         left = lt.x;
87         top  = lt.y;
88     }
89 
setRightBottom(const Point & rb)90     void setRightBottom(const Point& rb) {
91         right = rb.x;
92         bottom  = rb.y;
93     }
94 
95     // the following 4 functions return the 4 corners of the rect as Point
leftTop()96     Point leftTop() const {
97         return Point(left, top);
98     }
rightBottom()99     Point rightBottom() const {
100         return Point(right, bottom);
101     }
rightTop()102     Point rightTop() const {
103         return Point(right, top);
104     }
leftBottom()105     Point leftBottom() const {
106         return Point(left, bottom);
107     }
108 
109     // comparisons
110     inline bool operator == (const Rect& rhs) const {
111         return (left == rhs.left) && (top == rhs.top) &&
112                (right == rhs.right) && (bottom == rhs.bottom);
113     }
114 
115     inline bool operator != (const Rect& rhs) const {
116         return !operator == (rhs);
117     }
118 
119     // operator < defines an order which allows to use rectangles in sorted
120     // vectors.
121     bool operator < (const Rect& rhs) const;
122 
offsetToOrigin()123     Rect& offsetToOrigin() {
124         right -= left;
125         bottom -= top;
126         left = top = 0;
127         return *this;
128     }
offsetTo(const Point & p)129     Rect& offsetTo(const Point& p) {
130         return offsetTo(p.x, p.y);
131     }
offsetBy(const Point & dp)132     Rect& offsetBy(const Point& dp) {
133         return offsetBy(dp.x, dp.y);
134     }
135     Rect& operator += (const Point& rhs) {
136         return offsetBy(rhs.x, rhs.y);
137     }
138     Rect& operator -= (const Point& rhs) {
139         return offsetBy(-rhs.x, -rhs.y);
140     }
141     const Rect operator + (const Point& rhs) const;
142     const Rect operator - (const Point& rhs) const;
143 
translate(int32_t dx,int32_t dy)144     void translate(int32_t dx, int32_t dy) { // legacy, don't use.
145         offsetBy(dx, dy);
146     }
147 
148     Rect&   offsetTo(int32_t x, int32_t y);
149     Rect&   offsetBy(int32_t x, int32_t y);
150     bool    intersect(const Rect& with, Rect* result) const;
151 
152     // Create a new Rect by transforming this one using a graphics HAL
153     // transform.  This rectangle is defined in a coordinate space starting at
154     // the origin and extending to (width, height).  If the transform includes
155     // a ROT90 then the output rectangle is defined in a space extending to
156     // (height, width).  Otherwise the output rectangle is in the same space as
157     // the input.
158     Rect transform(uint32_t xform, int32_t width, int32_t height) const;
159 };
160 
161 ANDROID_BASIC_TYPES_TRAITS(Rect)
162 
163 }; // namespace android
164 
165 #endif // ANDROID_UI_RECT
166