Add SkAutoPixmapStorage::detachPixelsAsData()
authorfmalita <fmalita@chromium.org>
Thu, 4 Feb 2016 21:09:59 +0000 (13:09 -0800)
committerCommit bot <commit-bot@chromium.org>
Thu, 4 Feb 2016 21:09:59 +0000 (13:09 -0800)
Allows passing pixels ownership to clients.

BUG=skia:4896
R=reed@google.com
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1662353002

Review URL: https://codereview.chromium.org/1662353002

include/core/SkPixmap.h
src/core/SkPixmap.cpp

index da97025..523c40f 100644 (file)
@@ -13,6 +13,7 @@
 #include "SkImageInfo.h"
 
 class SkColorTable;
+class SkData;
 struct SkMask;
 
 /**
@@ -184,6 +185,12 @@ public:
      */
     void alloc(const SkImageInfo&);
 
+    /**
+     *  Returns an SkData object wrapping the allocated pixels memory, and resets the pixmap.
+     *  If the storage hasn't been allocated, the result is NULL.
+     */
+    const SkData* SK_WARN_UNUSED_RESULT detachPixelsAsData();
+
     // We wrap these so we can clear our internal storage
 
     void reset() {
@@ -208,7 +215,7 @@ private:
 
     void freeStorage() {
         sk_free(fStorage);
-        fStorage = NULL;
+        fStorage = nullptr;
     }
 
     typedef SkPixmap INHERITED;
index 943287b..e2d4d30 100644 (file)
@@ -7,6 +7,7 @@
 
 #include "SkColorPriv.h"
 #include "SkConfig8888.h"
+#include "SkData.h"
 #include "SkMask.h"
 #include "SkPixmap.h"
 #include "SkUtils.h"
@@ -272,3 +273,15 @@ void SkAutoPixmapStorage::alloc(const SkImageInfo& info) {
         sk_throw();
     }
 }
+
+const SkData* SkAutoPixmapStorage::detachPixelsAsData() {
+    if (!fStorage) {
+        return nullptr;
+    }
+
+    const SkData* data = SkData::NewFromMalloc(fStorage, this->getSafeSize());
+    fStorage = nullptr;
+    this->INHERITED::reset();
+
+    return data;
+}