blob: 47d37b6d35d7eb8af6bf3da69d749e836d073a53 [file] [log] [blame]
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001/*
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
Mathias Agopian8683fca2012-08-12 19:37:16 -070020#include <utils/Flattenable.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080021#include <utils/TypeHelpers.h>
22#include <ui/Point.h>
23
Dianne Hackborn9147d112010-07-09 11:44:11 -070024#include <android/rect.h>
25
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080026namespace android {
27
Mathias Agopian8683fca2012-08-12 19:37:16 -070028class Rect : public ARect, public LightFlattenablePod<Rect>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080029{
30public:
Mathias Agopian000e95e2011-09-19 16:00:46 -070031 typedef ARect::value_type value_type;
Mathias Agopian4b8160f2009-05-27 15:02:35 -070032
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080033 // we don't provide copy-ctor and operator= on purpose
34 // because we want the compiler generated versions
35
Mathias Agopian35801ce2009-05-26 17:44:57 -070036 inline Rect() {
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080037 }
Dianne Hackborn9147d112010-07-09 11:44:11 -070038 inline Rect(int32_t w, int32_t h) {
39 left = top = 0; right = w; bottom = h;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080040 }
Dianne Hackborn9147d112010-07-09 11:44:11 -070041 inline Rect(int32_t l, int32_t t, int32_t r, int32_t b) {
42 left = l; top = t; right = r; bottom = b;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080043 }
Dianne Hackborn9147d112010-07-09 11:44:11 -070044 inline Rect(const Point& lt, const Point& rb) {
45 left = lt.x; top = lt.y; right = rb.x; bottom = rb.y;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080046 }
47
48 void makeInvalid();
Mathias Agopian4b8160f2009-05-27 15:02:35 -070049
50 inline void clear() {
51 left = top = right = bottom = 0;
52 }
53
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080054 // a valid rectangle has a non negative width and height
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
60 inline bool isEmpty() const {
61 return (width()<=0) || (height()<=0);
62 }
63
64 inline void set(const Rect& rhs) {
65 operator = (rhs);
66 }
67
68 // rectangle's width
Mathias Agopianb82203a2012-05-13 20:02:04 -070069 inline int32_t getWidth() const {
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080070 return right-left;
71 }
72
73 // rectangle's height
Mathias Agopianb82203a2012-05-13 20:02:04 -070074 inline int32_t getHeight() const {
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080075 return bottom-top;
76 }
77
Mathias Agopianb82203a2012-05-13 20:02:04 -070078 inline Rect getBounds() const {
79 return Rect(right-left, bottom-top);
80 }
81
82 inline int32_t width() const { return getWidth(); }
83 inline int32_t height() const { return getHeight(); }
84
Mathias Agopian35801ce2009-05-26 17:44:57 -070085 void setLeftTop(const Point& lt) {
86 left = lt.x;
87 top = lt.y;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080088 }
Mathias Agopian35801ce2009-05-26 17:44:57 -070089
90 void setRightBottom(const Point& rb) {
91 right = rb.x;
92 bottom = rb.y;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080093 }
94
95 // the following 4 functions return the 4 corners of the rect as Point
Mathias Agopian35801ce2009-05-26 17:44:57 -070096 Point leftTop() const {
97 return Point(left, top);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080098 }
Mathias Agopian35801ce2009-05-26 17:44:57 -070099 Point rightBottom() const {
100 return Point(right, bottom);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800101 }
102 Point rightTop() const {
103 return Point(right, top);
104 }
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
123 Rect& offsetToOrigin() {
124 right -= left;
125 bottom -= top;
126 left = top = 0;
127 return *this;
128 }
129 Rect& offsetTo(const Point& p) {
130 return offsetTo(p.x, p.y);
131 }
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 }
Mathias Agopian35801ce2009-05-26 17:44:57 -0700141 const Rect operator + (const Point& rhs) const;
142 const Rect operator - (const Point& rhs) const;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800143
Dianne Hackborn9147d112010-07-09 11:44:11 -0700144 void translate(int32_t dx, int32_t dy) { // legacy, don't use.
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800145 offsetBy(dx, dy);
146 }
Jamie Gennis59332802012-05-07 13:49:17 -0700147
Dianne Hackborn9147d112010-07-09 11:44:11 -0700148 Rect& offsetTo(int32_t x, int32_t y);
149 Rect& offsetBy(int32_t x, int32_t y);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800150 bool intersect(const Rect& with, Rect* result) const;
Jamie Gennis59332802012-05-07 13:49:17 -0700151
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.
Jamie Gennisf15a83f2012-05-10 20:43:55 -0700158 Rect transform(uint32_t xform, int32_t width, int32_t height) const;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800159};
160
161ANDROID_BASIC_TYPES_TRAITS(Rect)
162
163}; // namespace android
164
165#endif // ANDROID_UI_RECT