/*
* Copyright 2016 Google Inc .
*
* Use of this source code is governed by a BSD - style license that can be
* found in the LICENSE file .
*/
#ifndef SkAutoPixmapStorage_DEFINED
#define SkAutoPixmapStorage_DEFINED
#include "include/core/SkPixmap.h"
#include "include/core/SkRefCnt.h"
#include "include/private/base/SkMalloc.h"
#include <cstddef>
class SkData;
struct SkImageInfo;
struct SkMask;
class [[nodiscard]] SkAutoPixmapStorage : public SkPixmap {
public:
SkAutoPixmapStorage();
~SkAutoPixmapStorage();
SkAutoPixmapStorage(SkAutoPixmapStorage&& other);
/**
* Leave the moved - from object in a free - but - valid state .
*/
SkAutoPixmapStorage& operator =(SkAutoPixmapStorage&& other);
/**
* Try to allocate memory for the pixels needed to match the specified Info . On success
* return true and fill out the pixmap to point to that memory . The storage will be freed
* when this object is destroyed , or if another call to tryAlloc ( ) or alloc ( ) is made .
*
* On failure , return false and reset ( ) the pixmap to empty .
*/
bool tryAlloc(const SkImageInfo&);
/**
* Allocate memory for the pixels needed to match the specified Info and fill out the pixmap
* to point to that memory . The storage will be freed when this object is destroyed ,
* or if another call to tryAlloc ( ) or alloc ( ) is made .
*
* If the memory cannot be allocated , calls SK_ABORT ( ) .
*/
void alloc(const SkImageInfo&);
/**
* Gets the size and optionally the rowBytes that would be allocated by SkAutoPixmapStorage if
* alloc / tryAlloc was called .
*/
static size_t AllocSize(const SkImageInfo& info, size_t* rowBytes);
/**
* Returns a void * of the allocated pixel memory and resets the pixmap . If the storage hasn ' t
* been allocated , the result is NULL . The caller is responsible for calling sk_free to free
* the returned memory .
*/
[[nodiscard]] void * detachPixels();
/**
* Returns an SkData object wrapping the allocated pixels memory , and resets the pixmap .
* If the storage hasn ' t been allocated , the result is NULL .
*/
[[nodiscard]] sk_sp<SkData> detachPixelsAsData();
// We wrap these so we can clear our internal storage
void reset() {
this->freeStorage();
this->INHERITED::reset();
}
void reset(const SkImageInfo& info, const void * addr, size_t rb) {
this->freeStorage();
this->INHERITED::reset(info, addr, rb);
}
[[nodiscard]] bool reset(const SkMask& mask) {
this->freeStorage();
return this->INHERITED::reset(mask);
}
private :
void * fStorage;
void freeStorage() {
sk_free(fStorage);
fStorage = nullptr;
}
using INHERITED = SkPixmap;
};
#endif
Messung V0.5 in Prozent C=91 H=98 G=94
¤ Dauer der Verarbeitung: 0.4 Sekunden
¤
*© Formatika GbR, Deutschland