Add a way to retrieve a Region as a SharedBuffer

Change-Id: Ia53cb905fbc88f899521658545f990fb9217b1e1
This commit is contained in:
Mathias Agopian 2012-08-31 15:41:24 -07:00
parent 3ab68558fa
commit 2401ead700
3 changed files with 27 additions and 7 deletions

View File

@ -28,6 +28,7 @@
namespace android {
// ---------------------------------------------------------------------------
class SharedBuffer;
class String8;
// ---------------------------------------------------------------------------
@ -106,17 +107,24 @@ 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;
// 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... */
Rect const* getArray(size_t* count) const;
// 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);

View File

@ -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];

View File

@ -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