blob: df0c0fa878032db5ef058fb4c55cfa09d7de1ec8 [file] [log] [blame]
robertphillipsc5035e72016-03-17 06:58:39 -07001/*
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
11SkAutoPixmapStorage::SkAutoPixmapStorage() : fStorage(nullptr) {}
12
13SkAutoPixmapStorage::~SkAutoPixmapStorage() {
14 this->freeStorage();
15}
16
Eric Karl7a8c84c2017-06-12 10:05:49 -070017SkAutoPixmapStorage& SkAutoPixmapStorage::operator=(SkAutoPixmapStorage&& other) {
18 this->fStorage = other.fStorage;
Mike Reed086a4272017-07-18 10:53:11 -040019 this->INHERITED::reset(other.info(), this->fStorage, other.rowBytes());
Eric Karl7a8c84c2017-06-12 10:05:49 -070020
21 other.fStorage = nullptr;
22 other.INHERITED::reset();
23
24 return *this;
25}
26
robertphillipsc5035e72016-03-17 06:58:39 -070027size_t SkAutoPixmapStorage::AllocSize(const SkImageInfo& info, size_t* rowBytes) {
28 size_t rb = info.minRowBytes();
29 if (rowBytes) {
30 *rowBytes = rb;
31 }
Mike Reedcd284c52017-09-29 15:22:56 -040032 return info.computeByteSize(rb);
robertphillipsc5035e72016-03-17 06:58:39 -070033}
34
35bool SkAutoPixmapStorage::tryAlloc(const SkImageInfo& info) {
36 this->freeStorage();
37
38 size_t rb;
39 size_t size = AllocSize(info, &rb);
40 if (0 == size) {
41 return false;
42 }
43 void* pixels = sk_malloc_flags(size, 0);
44 if (nullptr == pixels) {
45 return false;
46 }
47 this->reset(info, pixels, rb);
48 fStorage = pixels;
49 return true;
50}
51
52void SkAutoPixmapStorage::alloc(const SkImageInfo& info) {
Ben Wagner7ca9a742017-08-17 14:05:04 -040053 SkASSERT_RELEASE(this->tryAlloc(info));
robertphillipsc5035e72016-03-17 06:58:39 -070054}
55
56const SkData* SkAutoPixmapStorage::detachPixelsAsData() {
57 if (!fStorage) {
58 return nullptr;
59 }
60
Mike Reedcd284c52017-09-29 15:22:56 -040061 auto data = SkData::MakeFromMalloc(fStorage, this->computeByteSize());
robertphillipsc5035e72016-03-17 06:58:39 -070062 fStorage = nullptr;
63 this->INHERITED::reset();
64
65 return data.release();
66}