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