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()11SkAutoPixmapStorage::SkAutoPixmapStorage() : fStorage(nullptr) {} 12 ~SkAutoPixmapStorage()13SkAutoPixmapStorage::~SkAutoPixmapStorage() { 14 this->freeStorage(); 15 } 16 operator =(SkAutoPixmapStorage && other)17SkAutoPixmapStorage& 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)27size_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)35bool 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)52void SkAutoPixmapStorage::alloc(const SkImageInfo& info) { 53 SkASSERT_RELEASE(this->tryAlloc(info)); 54 } 55 detachPixelsAsData()56const 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