blob: a86e6300ff09c2e22f1f6cb9370f2af7b2837dc4 [file] [log] [blame]
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -07001/*
2 * Copyright (C) 2007 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_REGION_H
18#define ANDROID_UI_REGION_H
19
20#include <stdint.h>
21#include <sys/types.h>
22
23#include <utils/Vector.h>
24#include <utils/Parcel.h>
25
26#include <ui/Rect.h>
27#include <ui/BlitHardware.h>
28
29#include <corecg/SkRegion.h>
30
31namespace android {
32// ---------------------------------------------------------------------------
33
34class String8;
35
36// ---------------------------------------------------------------------------
37class Region
38{
39public:
40 Region();
41 Region(const Region& rhs);
42 explicit Region(const SkRegion& rhs);
43 explicit Region(const Rect& rhs);
44 explicit Region(const Parcel& parcel);
45 explicit Region(const void* buffer);
46 ~Region();
47
48 Region& operator = (const Region& rhs);
49
50 inline bool isEmpty() const { return mRegion.isEmpty(); }
51 inline bool isRect() const { return mRegion.isRect(); }
52
53 Rect bounds() const;
54
55 const SkRegion& toSkRegion() const;
56
57 void clear();
58 void set(const Rect& r);
59
60 Region& orSelf(const Rect& rhs);
61 Region& andSelf(const Rect& rhs);
62
63 // boolean operators, applied on this
64 Region& orSelf(const Region& rhs);
65 Region& andSelf(const Region& rhs);
66 Region& subtractSelf(const Region& rhs);
67
68 // these translate rhs first
69 Region& translateSelf(int dx, int dy);
70 Region& orSelf(const Region& rhs, int dx, int dy);
71 Region& andSelf(const Region& rhs, int dx, int dy);
72 Region& subtractSelf(const Region& rhs, int dx, int dy);
73
74 // boolean operators
75 Region merge(const Region& rhs) const;
76 Region intersect(const Region& rhs) const;
77 Region subtract(const Region& rhs) const;
78
79 // these translate rhs first
80 Region translate(int dx, int dy) const;
81 Region merge(const Region& rhs, int dx, int dy) const;
82 Region intersect(const Region& rhs, int dx, int dy) const;
83 Region subtract(const Region& rhs, int dx, int dy) const;
84
85 // convenience operators overloads
86 inline Region operator | (const Region& rhs) const;
87 inline Region operator & (const Region& rhs) const;
88 inline Region operator - (const Region& rhs) const;
89 inline Region operator + (const Point& pt) const;
90
91 inline Region& operator |= (const Region& rhs);
92 inline Region& operator &= (const Region& rhs);
93 inline Region& operator -= (const Region& rhs);
94 inline Region& operator += (const Point& pt);
95
96 class iterator {
97 SkRegion::Iterator mIt;
98 public:
99 iterator(const Region& r);
100 inline operator bool () const { return !done(); }
101 int iterate(Rect* rect);
102 private:
103 inline bool done() const {
104 return const_cast<SkRegion::Iterator&>(mIt).done();
105 }
106 };
107
108 size_t rects(Vector<Rect>& rectList) const;
109
110 // flatten/unflatten a region to/from a Parcel
111 status_t write(Parcel& parcel) const;
112 status_t read(const Parcel& parcel);
113
114 // flatten/unflatten a region to/from a raw buffer
115 ssize_t write(void* buffer, size_t size) const;
116 static ssize_t writeEmpty(void* buffer, size_t size);
117
118 ssize_t read(const void* buffer);
119 static bool isEmpty(void* buffer);
120
121 void dump(String8& out, const char* what, uint32_t flags=0) const;
122 void dump(const char* what, uint32_t flags=0) const;
123
124private:
125 SkRegion mRegion;
126};
127
128
129Region Region::operator | (const Region& rhs) const {
130 return merge(rhs);
131}
132Region Region::operator & (const Region& rhs) const {
133 return intersect(rhs);
134}
135Region Region::operator - (const Region& rhs) const {
136 return subtract(rhs);
137}
138Region Region::operator + (const Point& pt) const {
139 return translate(pt.x, pt.y);
140}
141
142
143Region& Region::operator |= (const Region& rhs) {
144 return orSelf(rhs);
145}
146Region& Region::operator &= (const Region& rhs) {
147 return andSelf(rhs);
148}
149Region& Region::operator -= (const Region& rhs) {
150 return subtractSelf(rhs);
151}
152Region& Region::operator += (const Point& pt) {
153 return translateSelf(pt.x, pt.y);
154}
155
156// ---------------------------------------------------------------------------
157
158struct region_iterator : public copybit_region_t {
159 region_iterator(const Region& region) : i(region) {
160 this->next = iterate;
161 }
162private:
163 static int iterate(copybit_region_t const * self, copybit_rect_t* rect) {
164 return static_cast<const region_iterator*>(self)
165 ->i.iterate(reinterpret_cast<Rect*>(rect));
166 }
167 mutable Region::iterator i;
168};
169
170// ---------------------------------------------------------------------------
171}; // namespace android
172
173#endif // ANDROID_UI_REGION_H
174