Index: src/core/SkAutoPixmapStorage.h |
diff --git a/src/core/SkAutoPixmapStorage.h b/src/core/SkAutoPixmapStorage.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4379b13d2482ade8ed7c5f8bc48751be460caee6 |
--- /dev/null |
+++ b/src/core/SkAutoPixmapStorage.h |
@@ -0,0 +1,87 @@ |
+ |
+/* |
+ * Copyright 2016 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#ifndef SkAutoPixmapStorage_DEFINED |
+#define SkAutoPixmapStorage_DEFINED |
+ |
+#include "SkPixmap.h" |
+ |
+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(); |
+ |
+ /** |
+ * Whereas 'reset' frees the backing memory and then clears the SkPixmap, |
+ * this entry point disowns the backing memory before clearing so the memory |
+ * isn't freed. It can be used when the Pixmap has been installed into |
+ * an SkBitmap and the SkBitmap should manage the memory's lifetime. |
+ */ |
+ void release(); |
+ |
+ // 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; |
+}; |
+ |
+#endif |