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 #include "SkAutoPixmapStorage.h"
9 #include "SkData.h"
10 
SkAutoPixmapStorage()11 SkAutoPixmapStorage::SkAutoPixmapStorage() : fStorage(nullptr) {}
12 
~SkAutoPixmapStorage()13 SkAutoPixmapStorage::~SkAutoPixmapStorage() {
14     this->freeStorage();
15 }
16 
operator =(SkAutoPixmapStorage && other)17 SkAutoPixmapStorage& SkAutoPixmapStorage::operator=(SkAutoPixmapStorage&& other) {
18     this->fStorage = other.fStorage;
19     this->INHERITED::reset(other.info(), this->fStorage, other.rowBytes());
20 
21     other.fStorage = nullptr;
22     other.INHERITED::reset();
23 
24     return *this;
25 }
26 
AllocSize(const SkImageInfo & info,size_t * rowBytes)27 size_t SkAutoPixmapStorage::AllocSize(const SkImageInfo& info, size_t* rowBytes) {
28     size_t rb = info.minRowBytes();
29     if (rowBytes) {
30         *rowBytes = rb;
31     }
32     return info.computeByteSize(rb);
33 }
34 
tryAlloc(const SkImageInfo & info)35 bool SkAutoPixmapStorage::tryAlloc(const SkImageInfo& info) {
36     this->freeStorage();
37 
38     size_t rb;
39     size_t size = AllocSize(info, &rb);
40     if (SkImageInfo::ByteSizeOverflowed(size)) {
41         return false;
42     }
43     void* pixels = sk_malloc_canfail(size);
44     if (nullptr == pixels) {
45         return false;
46     }
47     this->reset(info, pixels, rb);
48     fStorage = pixels;
49     return true;
50 }
51 
alloc(const SkImageInfo & info)52 void SkAutoPixmapStorage::alloc(const SkImageInfo& info) {
53     SkASSERT_RELEASE(this->tryAlloc(info));
54 }
55 
detachPixelsAsData()56 const SkData* SkAutoPixmapStorage::detachPixelsAsData() {
57     if (!fStorage) {
58         return nullptr;
59     }
60 
61     auto data = SkData::MakeFromMalloc(fStorage, this->computeByteSize());
62     fStorage = nullptr;
63     this->INHERITED::reset();
64 
65     return data.release();
66 }
67