Index: include/core/SkPixmap.h |
diff --git a/include/core/SkPixmap.h b/include/core/SkPixmap.h |
index 3a7abdf13451f712f4e47f10a81d44c713d4f8ce..b43072b9579687a3b658ae455caee79536adac38 100644 |
--- a/include/core/SkPixmap.h |
+++ b/include/core/SkPixmap.h |
@@ -187,6 +187,71 @@ |
///////////////////////////////////////////////////////////////////////////////////////////// |
+class SK_API SkAutoPixmapStorage : public SkPixmap { |
+public: |
+ SkAutoPixmapStorage(); |
+ ~SkAutoPixmapStorage(); |
+ |
+ /** |
+ * Try to allocate memory for the pixels needed to match the specified Info. On success |
+ * return true and fill out the pixmap to point to that memory. The storage will be freed |
+ * when this object is destroyed, or if another call to tryAlloc() or alloc() is made. |
+ * |
+ * On failure, return false and reset() the pixmap to empty. |
+ */ |
+ bool tryAlloc(const SkImageInfo&); |
+ |
+ /** |
+ * Allocate memory for the pixels needed to match the specified Info and fill out the pixmap |
+ * to point to that memory. The storage will be freed when this object is destroyed, |
+ * or if another call to tryAlloc() or alloc() is made. |
+ * |
+ * If the memory cannot be allocated, calls sk_throw(). |
+ */ |
+ void alloc(const SkImageInfo&); |
+ |
+ /** |
+ * Gets the size and optionally the rowBytes that would be allocated by SkAutoPixmapStorage if |
+ * alloc/tryAlloc was called. |
+ */ |
+ static size_t AllocSize(const SkImageInfo& info, size_t* rowBytes); |
+ |
+ /** |
+ * 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() { |
+ this->freeStorage(); |
+ this->INHERITED::reset(); |
+ } |
+ void reset(const SkImageInfo& info, const void* addr, size_t rb, SkColorTable* ctable = NULL) { |
+ this->freeStorage(); |
+ this->INHERITED::reset(info, addr, rb, ctable); |
+ } |
+ void reset(const SkImageInfo& info) { |
+ this->freeStorage(); |
+ this->INHERITED::reset(info); |
+ } |
+ bool SK_WARN_UNUSED_RESULT reset(const SkMask& mask) { |
+ this->freeStorage(); |
+ return this->INHERITED::reset(mask); |
+ } |
+ |
+private: |
+ void* fStorage; |
+ |
+ void freeStorage() { |
+ sk_free(fStorage); |
+ fStorage = nullptr; |
+ } |
+ |
+ typedef SkPixmap INHERITED; |
+}; |
+ |
///////////////////////////////////////////////////////////////////////////////////////////// |
class SK_API SkAutoPixmapUnlock : ::SkNoncopyable { |