diff options
author | 2012-08-31 15:41:24 -0700 | |
---|---|---|
committer | 2012-08-31 18:38:22 -0700 | |
commit | 2401ead70099c982796ecc3ec63ec8a5570948fc (patch) | |
tree | 70b4464149c060bf808a5cb7e15de67b612d3fe1 | |
parent | 3ab68558fa5a4b8f792a54965a010f03385bd271 (diff) |
Add a way to retrieve a Region as a SharedBuffer
Change-Id: Ia53cb905fbc88f899521658545f990fb9217b1e1
-rw-r--r-- | include/ui/Region.h | 20 | ||||
-rw-r--r-- | include/utils/SharedBuffer.h | 2 | ||||
-rw-r--r-- | libs/ui/Region.cpp | 12 |
3 files changed, 27 insertions, 7 deletions
diff --git a/include/ui/Region.h b/include/ui/Region.h index 46a36edb9e..0049fde6ed 100644 --- a/include/ui/Region.h +++ b/include/ui/Region.h @@ -28,6 +28,7 @@ namespace android { // --------------------------------------------------------------------------- +class SharedBuffer; class String8; // --------------------------------------------------------------------------- @@ -106,16 +107,23 @@ public: /* various ways to access the rectangle list */ + + // STL-like iterators typedef Rect const* const_iterator; - - const_iterator begin() const; - const_iterator end() const; + const_iterator begin() const; + const_iterator end() const; - /* no user serviceable parts here... */ - - Rect const* getArray(size_t* count) const; + // returns an array of rect which has the same life-time has this + // Region object. + Rect const* getArray(size_t* count) const; + + // returns a SharedBuffer as well as the number of rects. + // ownership is transfered to the caller. + // the caller must call SharedBuffer::release() to free the memory. + SharedBuffer const* getSharedBuffer(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. diff --git a/include/utils/SharedBuffer.h b/include/utils/SharedBuffer.h index 24508b0f76..1d6d497fcd 100644 --- a/include/utils/SharedBuffer.h +++ b/include/utils/SharedBuffer.h @@ -96,7 +96,7 @@ private: inline ~SharedBuffer() { } inline SharedBuffer(const SharedBuffer&); - // 16 bytes. must be sized to preserve correct alingment. + // 16 bytes. must be sized to preserve correct alignment. mutable int32_t mRefs; size_t mSize; uint32_t mReserved[2]; diff --git a/libs/ui/Region.cpp b/libs/ui/Region.cpp index cdc28946fc..94fb1d5520 100644 --- a/libs/ui/Region.cpp +++ b/libs/ui/Region.cpp @@ -606,6 +606,18 @@ Rect const* Region::getArray(size_t* count) const { return b; } +SharedBuffer const* Region::getSharedBuffer(size_t* count) const { + // We can get to the SharedBuffer of a Vector<Rect> because Rect has + // a trivial destructor. + SharedBuffer const* sb = SharedBuffer::bufferFromData(mStorage.array()); + if (count) { + size_t numRects = isRect() ? 1 : mStorage.size() - 1; + count[0] = numRects; + } + sb->acquire(); + return sb; +} + // ---------------------------------------------------------------------------- void Region::dump(String8& out, const char* what, uint32_t flags) const |