Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(132)

Unified Diff: src/core/SkData.cpp

Issue 560653004: SkData can allocate room for its contents in the same block (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: update dox, change fPtr to non const Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/core/SkBitmap.cpp ('k') | src/core/SkFlattenableSerialization.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkData.cpp
diff --git a/src/core/SkData.cpp b/src/core/SkData.cpp
index c65328720a789051e49be9d41d4a0a6866a022fc..a7a3d8d559681bf661cb90e4bbaf9a144f26ded7 100644
--- a/src/core/SkData.cpp
+++ b/src/core/SkData.cpp
@@ -11,19 +11,49 @@
#include "SkReadBuffer.h"
#include "SkWriteBuffer.h"
+static void sk_inplace_sentinel_releaseproc(const void*, size_t, void*) {
+ // we should never get called, as we are just a sentinel
+ sk_throw();
+}
+
SkData::SkData(const void* ptr, size_t size, ReleaseProc proc, void* context) {
- fPtr = ptr;
+ fPtr = const_cast<void*>(ptr);
fSize = size;
fReleaseProc = proc;
fReleaseProcContext = context;
}
+// This constructor means we are inline with our fPtr's contents. Thus we set fPtr
+// to point right after this. We also set our releaseproc to sk_inplace_sentinel_releaseproc,
+// since we need to handle "delete" ourselves. See internal_displose().
+//
+SkData::SkData(size_t size) {
+ fPtr = (char*)(this + 1); // contents are immediately after this
+ fSize = size;
+ fReleaseProc = sk_inplace_sentinel_releaseproc;
+ fReleaseProcContext = NULL;
+}
+
SkData::~SkData() {
if (fReleaseProc) {
fReleaseProc(fPtr, fSize, fReleaseProcContext);
}
}
+void SkData::internal_dispose() const {
+ if (sk_inplace_sentinel_releaseproc == fReleaseProc) {
+ const_cast<SkData*>(this)->fReleaseProc = NULL; // so we don't call it in our destructor
+
+ this->internal_dispose_restore_refcnt_to_1();
+ this->~SkData(); // explicitly call this for refcnt bookkeeping
+
+ sk_free(const_cast<SkData*>(this));
+ } else {
+ this->internal_dispose_restore_refcnt_to_1();
+ SkDELETE(this);
+ }
+}
+
bool SkData::equals(const SkData* other) const {
if (NULL == other) {
return false;
@@ -47,11 +77,24 @@ size_t SkData::copyRange(size_t offset, size_t length, void* buffer) const {
return length;
}
+SkData* SkData::PrivateNewWithCopy(const void* srcOrNull, size_t length) {
+ if (0 == length) {
+ return SkData::NewEmpty();
+ }
+ char* storage = (char*)sk_malloc_throw(sizeof(SkData) + length);
+ SkData* data = new (storage) SkData(length);
+ if (srcOrNull) {
+ memcpy(data->writable_data(), srcOrNull, length);
+ }
+ return data;
+}
+
///////////////////////////////////////////////////////////////////////////////
SkData* SkData::NewEmptyImpl() {
return new SkData(NULL, 0, NULL, NULL);
}
+
void SkData::DeleteEmpty(SkData* ptr) { SkDELETE(ptr); }
SkData* SkData::NewEmpty() {
@@ -68,14 +111,13 @@ SkData* SkData::NewFromMalloc(const void* data, size_t length) {
return new SkData(data, length, sk_free_releaseproc, NULL);
}
-SkData* SkData::NewWithCopy(const void* data, size_t length) {
- if (0 == length) {
- return SkData::NewEmpty();
- }
+SkData* SkData::NewWithCopy(const void* src, size_t length) {
+ SkASSERT(src);
+ return PrivateNewWithCopy(src, length);
+}
- void* copy = sk_malloc_throw(length); // balanced in sk_free_releaseproc
- memcpy(copy, data, length);
- return new SkData(copy, length, sk_free_releaseproc, NULL);
+SkData* SkData::NewUninitialized(size_t length) {
+ return PrivateNewWithCopy(NULL, length);
}
SkData* SkData::NewWithProc(const void* data, size_t length,
« no previous file with comments | « src/core/SkBitmap.cpp ('k') | src/core/SkFlattenableSerialization.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698