Index: src/core/SkData.cpp |
diff --git a/src/core/SkData.cpp b/src/core/SkData.cpp |
index fd963a9ff50b22aedf2d18f30ee6880e08afd598..e7130a1f52a33c1b70d78293c4634c054a9756f3 100644 |
--- a/src/core/SkData.cpp |
+++ b/src/core/SkData.cpp |
@@ -9,6 +9,7 @@ |
#include "SkFlattenableBuffers.h" |
#include "SkOSFile.h" |
#include "SkOnce.h" |
+#include "SkStream.h" |
SkData::SkData(const void* ptr, size_t size, ReleaseProc proc, void* context) { |
fPtr = ptr; |
@@ -79,6 +80,27 @@ SkData* SkData::NewWithCopy(const void* data, size_t length) { |
return new SkData(copy, length, sk_free_releaseproc, NULL); |
} |
+SkData* SkData::NewWithCopyFromStream(SkStreamRewindable* stream) { |
+ if (!stream->hasLength()) { |
+ return NULL; |
+ } |
+ size_t length = stream->getLength(); |
+ if (0 == length) { |
+ return NULL; |
+ } |
+ void* buffer = sk_malloc_flags(length, 0); |
+ if (NULL == buffer) { |
+ return NULL; |
+ } |
+ if (!stream->rewind()) { |
+ sk_free(buffer); |
+ return NULL; |
+ } |
+ SkAssertResult(stream->read(buffer, length) == length); |
+ return new SkData(buffer, length, sk_free_releaseproc, NULL); |
+} |
+ |
+ |
SkData* SkData::NewWithProc(const void* data, size_t length, |
ReleaseProc proc, void* context) { |
return new SkData(data, length, proc, context); |