Chromium Code Reviews| Index: src/core/SkData.cpp |
| =================================================================== |
| --- src/core/SkData.cpp (revision 9507) |
| +++ src/core/SkData.cpp (working copy) |
| @@ -11,12 +11,12 @@ |
| 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, ReleaseProc proc, void* context) |
| + : fSize(size) |
| + , fPtr(ptr) |
| + , fReleaseProc(proc) |
| + , fReleaseProcContext(context) |
| + { } |
| SkData::~SkData() { |
| if (fReleaseProc) { |
| @@ -58,7 +58,7 @@ |
| return gEmptyRef; |
| } |
| -// assumes fPtr was allocated via sk_malloc |
| +/** Assumes ptr was allocated via sk_malloc, ignores the size and context. */ |
| static void sk_free_releaseproc(const void* ptr, size_t, void*) { |
| sk_free((void*)ptr); |
| } |
| @@ -67,14 +67,26 @@ |
| return new SkData(data, length, sk_free_releaseproc, NULL); |
| } |
| +void SkData::internal_dispose() const { |
| + if (this == this->fReleaseProcContext) { |
| + this->internal_dispose_restore_refcnt_to_1(); |
| + this->~SkData(); |
| + sk_free(const_cast<SkData*>(this)); |
| + return; |
| + } |
| + this->INHERITED::internal_dispose(); |
| +} |
| + |
| SkData* SkData::NewWithCopy(const void* data, size_t length) { |
| if (0 == length) { |
| return SkData::NewEmpty(); |
| } |
|
reed1
2013/06/12 13:39:31
The code is good, but lets add a comment block des
|
| - void* copy = sk_malloc_throw(length); // balanced in sk_free_releaseproc |
| + size_t total_size = sizeof(SkData) + length; |
| + char* self = reinterpret_cast<char*>(sk_malloc_throw(total_size)); |
| + char* copy = self + sizeof(SkData); |
| memcpy(copy, data, length); |
| - return new SkData(copy, length, sk_free_releaseproc, NULL); |
| + return SkNEW_PLACEMENT_ARGS(self, SkData, (copy, length, NULL, self)); |
| } |
| SkData* SkData::NewWithProc(const void* data, size_t length, |
| @@ -162,18 +174,12 @@ |
| 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; |
| - } |
| - |
| +SkData::SkData(SkFlattenableReadBuffer& buffer) |
| + : fSize(buffer.getArrayCount()) |
| + , fPtr(fSize > 0 ? sk_malloc_throw(fSize) : NULL) |
| + , fReleaseProc(fSize > 0 ? sk_free_releaseproc : NULL) |
| + , fReleaseProcContext(NULL) |
| +{ |
| buffer.readByteArray(const_cast<void*>(fPtr)); |
| } |