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