OSDN Git Service

Add a way to retrieve a Region as a SharedBuffer
authorMathias Agopian <mathias@google.com>
Fri, 31 Aug 2012 22:41:24 +0000 (15:41 -0700)
committerMathias Agopian <mathias@google.com>
Sat, 1 Sep 2012 01:38:22 +0000 (18:38 -0700)
Change-Id: Ia53cb905fbc88f899521658545f990fb9217b1e1

include/ui/Region.h
include/utils/SharedBuffer.h
libs/ui/Region.cpp

index 46a36ed..0049fde 100644 (file)
@@ -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.
index 24508b0..1d6d497 100644 (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];
index cdc2894..94fb1d5 100644 (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