text: /*
   * Copyright 2016 Google Inc.
   *
   * Use of this source code is governed by a BSD-style license that can be
   * found in the LICENSE file.
   */
  
  #include "SkAutoPixmapStorage.h"
  #include "SkData.h"
  
  SkAutoPixmapStorage::SkAutoPixmapStorage() : fStorage(nullptr) {}
  
  SkAutoPixmapStorage::~SkAutoPixmapStorage() {
      this->freeStorage();
  }
  
  SkAutoPixmapStorage& SkAutoPixmapStorage::operator=(SkAutoPixmapStorage&& other) {
      this->fStorage = other.fStorage;
      this->INHERITED::reset(other.info(), this->fStorage, other.rowBytes());
  
      other.fStorage = nullptr;
      other.INHERITED::reset();
  
      return *this;
  }
  
  size_t SkAutoPixmapStorage::AllocSize(const SkImageInfo& info, size_t* rowBytes) {
      size_t rb = info.minRowBytes();
      if (rowBytes) {
          *rowBytes = rb;
      }
      return info.getSafeSize(rb);
  }
  
  bool SkAutoPixmapStorage::tryAlloc(const SkImageInfo& info) {
      this->freeStorage();
  
      size_t rb;
      size_t size = AllocSize(info, &rb);
      if (0 == size) {
          return false;
      }
      void* pixels = sk_malloc_flags(size, 0);
      if (nullptr == pixels) {
          return false;
      }
      this->reset(info, pixels, rb);
      fStorage = pixels;
      return true;
  }
  
  void SkAutoPixmapStorage::alloc(const SkImageInfo& info) {
      SkASSERT_RELEASE(this->tryAlloc(info));
  }
  
  const SkData* SkAutoPixmapStorage::detachPixelsAsData() {
      if (!fStorage) {
          return nullptr;
      }
  
      auto data = SkData::MakeFromMalloc(fStorage, this->getSafeSize());
      fStorage = nullptr;
      this->INHERITED::reset();
  
      return data.release();
  }
  