| Index: src/core/SkData.cpp
|
| ===================================================================
|
| --- src/core/SkData.cpp (revision 9702)
|
| +++ src/core/SkData.cpp (working copy)
|
| @@ -11,19 +11,11 @@
|
|
|
| SK_DEFINE_INST_COUNT(SkData)
|
|
|
| -SkData::SkData(const void* ptr, size_t size, ReleaseProc proc, void* context) {
|
| - fPtr = ptr;
|
| - fSize = size;
|
| - fReleaseProc = proc;
|
| - fReleaseProcContext = context;
|
| -}
|
| +SkData::SkData(const void* ptr, size_t size)
|
| + : fSize(size)
|
| + , fPtr(ptr)
|
| +{ }
|
|
|
| -SkData::~SkData() {
|
| - if (fReleaseProc) {
|
| - fReleaseProc(fPtr, fSize, fReleaseProcContext);
|
| - }
|
| -}
|
| -
|
| bool SkData::equals(const SkData* other) const {
|
| if (NULL == other) {
|
| return false;
|
| @@ -52,38 +44,42 @@
|
| SkData* SkData::NewEmpty() {
|
| static SkData* gEmptyRef;
|
| if (NULL == gEmptyRef) {
|
| - gEmptyRef = new SkData(NULL, 0, NULL, NULL);
|
| + gEmptyRef = new SkData(NULL, 0);
|
| }
|
| gEmptyRef->ref();
|
| return gEmptyRef;
|
| }
|
|
|
| -// assumes fPtr was allocated via sk_malloc
|
| -static void sk_free_releaseproc(const void* ptr, size_t, void*) {
|
| +/** Assumes ptr was allocated via sk_malloc, ignores the size and context. */
|
| +static void sk_free_releaseproc(const void* ptr, size_t) {
|
| sk_free((void*)ptr);
|
| }
|
|
|
| SkData* SkData::NewFromMalloc(const void* data, size_t length) {
|
| - return new SkData(data, length, sk_free_releaseproc, NULL);
|
| + typedef SkManagedData<SkManagedDataProcs::ReleaseProc, void> SelfType;
|
| + return new SelfType(data, length, sk_free_releaseproc);
|
| }
|
|
|
| +/** Assumes obj was allocated via sk_malloc, ignores context. */
|
| +static void sk_free_deleteproc(const void* obj) {
|
| + sk_free((void*)obj);
|
| +}
|
| +
|
| SkData* SkData::NewWithCopy(const void* data, size_t length) {
|
| if (0 == length) {
|
| return SkData::NewEmpty();
|
| }
|
|
|
| - void* copy = sk_malloc_throw(length); // balanced in sk_free_releaseproc
|
| + typedef SkManagedData<void, SkManagedDataProcs::DeleterProc> SelfType;
|
| + size_t total_size = sizeof(SelfType) + length;
|
| + char* self = reinterpret_cast<char*>(sk_malloc_throw(total_size));
|
| + char* copy = self + sizeof(SelfType);
|
| memcpy(copy, data, length);
|
| - return new SkData(copy, length, sk_free_releaseproc, NULL);
|
| + return SelfType::Place(self, copy, length, sk_free_deleteproc);
|
| }
|
|
|
| -SkData* SkData::NewWithProc(const void* data, size_t length,
|
| - ReleaseProc proc, void* context) {
|
| - return new SkData(data, length, proc, context);
|
| -}
|
| -
|
| // assumes fPtr was allocated with sk_fmmap
|
| -static void sk_mmap_releaseproc(const void* addr, size_t length, void*) {
|
| +static void sk_mmap_releaseproc(const void* addr, size_t length) {
|
| sk_fmunmap(addr, length);
|
| }
|
|
|
| @@ -94,7 +90,7 @@
|
| return NULL;
|
| }
|
|
|
| - return SkData::NewWithProc(addr, size, sk_mmap_releaseproc, NULL);
|
| + return SkData::NewWithProc(addr, size, sk_mmap_releaseproc);
|
| }
|
|
|
| SkData* SkData::NewFromFileName(const char path[]) {
|
| @@ -114,14 +110,18 @@
|
| return NULL;
|
| }
|
|
|
| - return SkData::NewWithProc(addr, size, sk_mmap_releaseproc, NULL);
|
| + return SkData::NewWithProc(addr, size, sk_mmap_releaseproc);
|
| }
|
|
|
| -// assumes context is a SkData
|
| -static void sk_dataref_releaseproc(const void*, size_t, void* context) {
|
| - SkData* src = reinterpret_cast<SkData*>(context);
|
| - src->unref();
|
| -}
|
| +struct SkAutoUnrefFunctor {
|
| +public:
|
| + explicit SkAutoUnrefFunctor(SkRefCnt const * ptr) : fPtr(ptr) { }
|
| + void operator()(const void* ptr, size_t length) const {
|
| + fPtr->unref();
|
| + }
|
| +private:
|
| + SkRefCnt const * fPtr;
|
| +};
|
|
|
| SkData* SkData::NewSubset(const SkData* src, size_t offset, size_t length) {
|
| /*
|
| @@ -140,9 +140,9 @@
|
| }
|
| SkASSERT(length > 0);
|
|
|
| - src->ref(); // this will be balanced in sk_dataref_releaseproc
|
| - return new SkData(src->bytes() + offset, length, sk_dataref_releaseproc,
|
| - const_cast<SkData*>(src));
|
| + src->ref(); // this will be balanced in SkAutoUnrefFunctor
|
| + typedef SkManagedData<SkAutoUnrefFunctor, void> SelfType;
|
| + return new SelfType(src->bytes() + offset, length, SkAutoUnrefFunctor(src));
|
| }
|
|
|
| SkData* SkData::NewWithCString(const char cstr[]) {
|
| @@ -156,25 +156,28 @@
|
| return NewWithCopy(cstr, size);
|
| }
|
|
|
| +SkData* SkData::NewUnowned(const void* data, size_t length) {
|
| + return new SkData(data, length);
|
| +}
|
| +
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| void SkData::flatten(SkFlattenableWriteBuffer& buffer) const {
|
| buffer.writeByteArray(fPtr, fSize);
|
| }
|
|
|
| -SkData::SkData(SkFlattenableReadBuffer& buffer) {
|
| - fSize = buffer.getArrayCount();
|
| - fReleaseProcContext = NULL;
|
| -
|
| - if (fSize > 0) {
|
| - fPtr = sk_malloc_throw(fSize);
|
| - fReleaseProc = sk_free_releaseproc;
|
| - } else {
|
| - fPtr = NULL;
|
| - fReleaseProc = NULL;
|
| +SkFlattenable* SkData::CreateProc(SkFlattenableReadBuffer& buffer) {
|
| + uint32_t length = buffer.getArrayCount();
|
| + if (0 == length) {
|
| + return SkData::NewEmpty();
|
| }
|
|
|
| - buffer.readByteArray(const_cast<void*>(fPtr));
|
| + typedef SkManagedData<void, SkManagedDataProcs::DeleterProc> SelfType;
|
| + size_t total_size = sizeof(SelfType) + length;
|
| + char* self = reinterpret_cast<char*>(sk_malloc_throw(total_size));
|
| + char* copy = self + sizeof(SelfType);
|
| + buffer.readByteArray(copy);
|
| + return SelfType::Place(self, copy, length, sk_free_deleteproc);
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|