• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "include/core/SkPixmap.h"
12 #include "include/private/SkMalloc.h"
13 
14 class SkAutoPixmapStorage : public SkPixmap {
15 public:
16     SkAutoPixmapStorage();
17     ~SkAutoPixmapStorage();
18 
19     SkAutoPixmapStorage(SkAutoPixmapStorage&& other);
20 
21     /**
22     * Leave the moved-from object in a free-but-valid state.
23     */
24     SkAutoPixmapStorage& operator=(SkAutoPixmapStorage&& other);
25 
26     /**
27     *  Try to allocate memory for the pixels needed to match the specified Info. On success
28     *  return true and fill out the pixmap to point to that memory. The storage will be freed
29     *  when this object is destroyed, or if another call to tryAlloc() or alloc() is made.
30     *
31     *  On failure, return false and reset() the pixmap to empty.
32     */
33     bool tryAlloc(const SkImageInfo&);
34 
35     /**
36     *  Allocate memory for the pixels needed to match the specified Info and fill out the pixmap
37     *  to point to that memory. The storage will be freed when this object is destroyed,
38     *  or if another call to tryAlloc() or alloc() is made.
39     *
40     *  If the memory cannot be allocated, calls SK_ABORT().
41     */
42     void alloc(const SkImageInfo&);
43 
44     /**
45     * Gets the size and optionally the rowBytes that would be allocated by SkAutoPixmapStorage if
46     * alloc/tryAlloc was called.
47     */
48     static size_t AllocSize(const SkImageInfo& info, size_t* rowBytes);
49 
50     /**
51     * Returns a void* of the allocated pixel memory and resets the pixmap. If the storage hasn't
52     * been allocated, the result is NULL. The caller is responsible for calling sk_free to free
53     * the returned memory.
54     */
55     void* SK_WARN_UNUSED_RESULT detachPixels();
56 
57     /**
58     *  Returns an SkData object wrapping the allocated pixels memory, and resets the pixmap.
59     *  If the storage hasn't been allocated, the result is NULL.
60     */
61     sk_sp<SkData> SK_WARN_UNUSED_RESULT detachPixelsAsData();
62 
63     // We wrap these so we can clear our internal storage
64 
reset()65     void reset() {
66         this->freeStorage();
67         this->INHERITED::reset();
68     }
reset(const SkImageInfo & info,const void * addr,size_t rb)69     void reset(const SkImageInfo& info, const void* addr, size_t rb) {
70         this->freeStorage();
71         this->INHERITED::reset(info, addr, rb);
72     }
73 
reset(const SkMask & mask)74     bool SK_WARN_UNUSED_RESULT reset(const SkMask& mask) {
75         this->freeStorage();
76         return this->INHERITED::reset(mask);
77     }
78 
79 private:
80     void*   fStorage;
81 
freeStorage()82     void freeStorage() {
83         sk_free(fStorage);
84         fStorage = nullptr;
85     }
86 
87     using INHERITED = SkPixmap;
88 };
89 
90 #endif
91