Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright 2016 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef SkAutoPixmapStorage_DEFINED
      9 #define SkAutoPixmapStorage_DEFINED
     10 
     11 #include "SkMalloc.h"
     12 #include "SkPixmap.h"
     13 
     14 class SkAutoPixmapStorage : public SkPixmap {
     15 public:
     16     SkAutoPixmapStorage();
     17     ~SkAutoPixmapStorage();
     18 
     19     /**
     20     * Leave the moved-from object in a free-but-valid state.
     21     */
     22     SkAutoPixmapStorage& operator=(SkAutoPixmapStorage&& other);
     23 
     24     /**
     25     *  Try to allocate memory for the pixels needed to match the specified Info. On success
     26     *  return true and fill out the pixmap to point to that memory. The storage will be freed
     27     *  when this object is destroyed, or if another call to tryAlloc() or alloc() is made.
     28     *
     29     *  On failure, return false and reset() the pixmap to empty.
     30     */
     31     bool tryAlloc(const SkImageInfo&);
     32 
     33     /**
     34     *  Allocate memory for the pixels needed to match the specified Info and fill out the pixmap
     35     *  to point to that memory. The storage will be freed when this object is destroyed,
     36     *  or if another call to tryAlloc() or alloc() is made.
     37     *
     38     *  If the memory cannot be allocated, calls SK_ABORT().
     39     */
     40     void alloc(const SkImageInfo&);
     41 
     42     /**
     43     * Gets the size and optionally the rowBytes that would be allocated by SkAutoPixmapStorage if
     44     * alloc/tryAlloc was called.
     45     */
     46     static size_t AllocSize(const SkImageInfo& info, size_t* rowBytes);
     47 
     48     /**
     49     *  Returns an SkData object wrapping the allocated pixels memory, and resets the pixmap.
     50     *  If the storage hasn't been allocated, the result is NULL.
     51     */
     52     const SkData* SK_WARN_UNUSED_RESULT detachPixelsAsData();
     53 
     54     // We wrap these so we can clear our internal storage
     55 
     56     void reset() {
     57         this->freeStorage();
     58         this->INHERITED::reset();
     59     }
     60     void reset(const SkImageInfo& info, const void* addr, size_t rb) {
     61         this->freeStorage();
     62         this->INHERITED::reset(info, addr, rb);
     63     }
     64 
     65     bool SK_WARN_UNUSED_RESULT reset(const SkMask& mask) {
     66         this->freeStorage();
     67         return this->INHERITED::reset(mask);
     68     }
     69 
     70 private:
     71     void*   fStorage;
     72 
     73     void freeStorage() {
     74         sk_free(fStorage);
     75         fStorage = nullptr;
     76     }
     77 
     78     typedef SkPixmap INHERITED;
     79 };
     80 
     81 #endif
     82