summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Mathias Agopian <mathias@google.com> 2012-08-31 15:41:24 -0700
committer Mathias Agopian <mathias@google.com> 2012-08-31 18:38:22 -0700
commit2401ead70099c982796ecc3ec63ec8a5570948fc (patch)
tree70b4464149c060bf808a5cb7e15de67b612d3fe1
parent3ab68558fa5a4b8f792a54965a010f03385bd271 (diff)
Add a way to retrieve a Region as a SharedBuffer
Change-Id: Ia53cb905fbc88f899521658545f990fb9217b1e1
-rw-r--r--include/ui/Region.h20
-rw-r--r--include/utils/SharedBuffer.h2
-rw-r--r--libs/ui/Region.cpp12
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