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