| /* | 
 |  * Copyright (C) 2007 The Android Open Source Project | 
 |  * | 
 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
 |  * you may not use this file except in compliance with the License. | 
 |  * You may obtain a copy of the License at | 
 |  * | 
 |  *      http://www.apache.org/licenses/LICENSE-2.0 | 
 |  * | 
 |  * Unless required by applicable law or agreed to in writing, software | 
 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 |  * See the License for the specific language governing permissions and | 
 |  * limitations under the License. | 
 |  */ | 
 |  | 
 | #ifndef ANDROID_UI_REGION_H | 
 | #define ANDROID_UI_REGION_H | 
 |  | 
 | #include <stdint.h> | 
 | #include <sys/types.h> | 
 |  | 
 | #include <utils/Vector.h> | 
 |  | 
 | #include <ui/Rect.h> | 
 | #include <utils/Flattenable.h> | 
 |  | 
 | namespace android { | 
 | // --------------------------------------------------------------------------- | 
 |  | 
 | class String8; | 
 |  | 
 | // --------------------------------------------------------------------------- | 
 | class Region : public LightFlattenable<Region> | 
 | { | 
 | public: | 
 |     static const Region INVALID_REGION; | 
 |  | 
 |                         Region(); | 
 |                         Region(const Region& rhs); | 
 |     explicit            Region(const Rect& rhs); | 
 |                         ~Region(); | 
 |  | 
 |     static  Region      createTJunctionFreeRegion(const Region& r); | 
 |  | 
 |         Region& operator = (const Region& rhs); | 
 |  | 
 |     inline  bool        isEmpty() const     { return getBounds().isEmpty(); } | 
 |     inline  bool        isRect() const      { return mStorage.size() == 1; } | 
 |  | 
 |     inline  Rect        getBounds() const   { return mStorage[mStorage.size() - 1]; } | 
 |     inline  Rect        bounds() const      { return getBounds(); } | 
 |  | 
 |             bool        contains(const Point& point) const; | 
 |             bool        contains(int x, int y) const; | 
 |  | 
 |             // the region becomes its bounds | 
 |             Region&     makeBoundsSelf(); | 
 |  | 
 |             void        clear(); | 
 |             void        set(const Rect& r); | 
 |             void        set(int32_t w, int32_t h); | 
 |             void        set(uint32_t w, uint32_t h); | 
 |  | 
 |             Region&     orSelf(const Rect& rhs); | 
 |             Region&     xorSelf(const Rect& rhs); | 
 |             Region&     andSelf(const Rect& rhs); | 
 |             Region&     subtractSelf(const Rect& rhs); | 
 |  | 
 |             // boolean operators, applied on this | 
 |             Region&     orSelf(const Region& rhs); | 
 |             Region&     xorSelf(const Region& rhs); | 
 |             Region&     andSelf(const Region& rhs); | 
 |             Region&     subtractSelf(const Region& rhs); | 
 |  | 
 |             // boolean operators | 
 |     const   Region      merge(const Rect& rhs) const; | 
 |     const   Region      mergeExclusive(const Rect& rhs) const; | 
 |     const   Region      intersect(const Rect& rhs) const; | 
 |     const   Region      subtract(const Rect& rhs) const; | 
 |  | 
 |             // boolean operators | 
 |     const   Region      merge(const Region& rhs) const; | 
 |     const   Region      mergeExclusive(const Region& rhs) const; | 
 |     const   Region      intersect(const Region& rhs) const; | 
 |     const   Region      subtract(const Region& rhs) const; | 
 |  | 
 |             // these translate rhs first | 
 |             Region&     translateSelf(int dx, int dy); | 
 |             Region&     orSelf(const Region& rhs, int dx, int dy); | 
 |             Region&     xorSelf(const Region& rhs, int dx, int dy); | 
 |             Region&     andSelf(const Region& rhs, int dx, int dy); | 
 |             Region&     subtractSelf(const Region& rhs, int dx, int dy); | 
 |  | 
 |             // these translate rhs first | 
 |     const   Region      translate(int dx, int dy) const; | 
 |     const   Region      merge(const Region& rhs, int dx, int dy) const; | 
 |     const   Region      mergeExclusive(const Region& rhs, int dx, int dy) const; | 
 |     const   Region      intersect(const Region& rhs, int dx, int dy) const; | 
 |     const   Region      subtract(const Region& rhs, int dx, int dy) const; | 
 |  | 
 |     // convenience operators overloads | 
 |     inline  const Region      operator | (const Region& rhs) const; | 
 |     inline  const Region      operator ^ (const Region& rhs) const; | 
 |     inline  const Region      operator & (const Region& rhs) const; | 
 |     inline  const Region      operator - (const Region& rhs) const; | 
 |     inline  const Region      operator + (const Point& pt) const; | 
 |  | 
 |     inline  Region&     operator |= (const Region& rhs); | 
 |     inline  Region&     operator ^= (const Region& rhs); | 
 |     inline  Region&     operator &= (const Region& rhs); | 
 |     inline  Region&     operator -= (const Region& rhs); | 
 |     inline  Region&     operator += (const Point& pt); | 
 |  | 
 |  | 
 |     // returns true if the regions share the same underlying storage | 
 |     bool isTriviallyEqual(const Region& region) const; | 
 |  | 
 |  | 
 |     /* various ways to access the rectangle list */ | 
 |  | 
 |  | 
 |     // STL-like iterators | 
 |     typedef Rect const* const_iterator; | 
 |     const_iterator begin() const; | 
 |     const_iterator end() const; | 
 |  | 
 |     // returns an array of rect which has the same life-time has this | 
 |     // Region object. | 
 |     Rect const* getArray(size_t* count) const; | 
 |  | 
 |     /* no user serviceable parts here... */ | 
 |  | 
 |             // add a rectangle to the internal list. This rectangle must | 
 |             // be sorted in Y and X and must not make the region invalid. | 
 |             void        addRectUnchecked(int l, int t, int r, int b); | 
 |  | 
 |     inline  bool        isFixedSize() const { return false; } | 
 |             size_t      getFlattenedSize() const; | 
 |             status_t    flatten(void* buffer, size_t size) const; | 
 |             status_t    unflatten(void const* buffer, size_t size); | 
 |  | 
 |     void        dump(String8& out, const char* what, uint32_t flags=0) const; | 
 |     void        dump(const char* what, uint32_t flags=0) const; | 
 |  | 
 | private: | 
 |     class rasterizer; | 
 |     friend class rasterizer; | 
 |  | 
 |     Region& operationSelf(const Rect& r, uint32_t op); | 
 |     Region& operationSelf(const Region& r, uint32_t op); | 
 |     Region& operationSelf(const Region& r, int dx, int dy, uint32_t op); | 
 |     const Region operation(const Rect& rhs, uint32_t op) const; | 
 |     const Region operation(const Region& rhs, uint32_t op) const; | 
 |     const Region operation(const Region& rhs, int dx, int dy, uint32_t op) const; | 
 |  | 
 |     static void boolean_operation(uint32_t op, Region& dst, | 
 |             const Region& lhs, const Region& rhs, int dx, int dy); | 
 |     static void boolean_operation(uint32_t op, Region& dst, | 
 |             const Region& lhs, const Rect& rhs, int dx, int dy); | 
 |  | 
 |     static void boolean_operation(uint32_t op, Region& dst, | 
 |             const Region& lhs, const Region& rhs); | 
 |     static void boolean_operation(uint32_t op, Region& dst, | 
 |             const Region& lhs, const Rect& rhs); | 
 |  | 
 |     static void translate(Region& reg, int dx, int dy); | 
 |     static void translate(Region& dst, const Region& reg, int dx, int dy); | 
 |  | 
 |     static bool validate(const Region& reg, | 
 |             const char* name, bool silent = false); | 
 |  | 
 |     // mStorage is a (manually) sorted array of Rects describing the region | 
 |     // with an extra Rect as the last element which is set to the | 
 |     // bounds of the region. However, if the region is | 
 |     // a simple Rect then mStorage contains only that rect. | 
 |     Vector<Rect> mStorage; | 
 | }; | 
 |  | 
 |  | 
 | const Region Region::operator | (const Region& rhs) const { | 
 |     return merge(rhs); | 
 | } | 
 | const Region Region::operator ^ (const Region& rhs) const { | 
 |     return mergeExclusive(rhs); | 
 | } | 
 | const Region Region::operator & (const Region& rhs) const { | 
 |     return intersect(rhs); | 
 | } | 
 | const Region Region::operator - (const Region& rhs) const { | 
 |     return subtract(rhs); | 
 | } | 
 | const Region Region::operator + (const Point& pt) const { | 
 |     return translate(pt.x, pt.y); | 
 | } | 
 |  | 
 |  | 
 | Region& Region::operator |= (const Region& rhs) { | 
 |     return orSelf(rhs); | 
 | } | 
 | Region& Region::operator ^= (const Region& rhs) { | 
 |     return xorSelf(rhs); | 
 | } | 
 | Region& Region::operator &= (const Region& rhs) { | 
 |     return andSelf(rhs); | 
 | } | 
 | Region& Region::operator -= (const Region& rhs) { | 
 |     return subtractSelf(rhs); | 
 | } | 
 | Region& Region::operator += (const Point& pt) { | 
 |     return translateSelf(pt.x, pt.y); | 
 | } | 
 | // --------------------------------------------------------------------------- | 
 | }; // namespace android | 
 |  | 
 | #endif // ANDROID_UI_REGION_H | 
 |  |