Index: src/core/SkStream.cpp |
diff --git a/src/core/SkStream.cpp b/src/core/SkStream.cpp |
index 1022d183d93cc4bb36526f437c04f89f520ff856..2c27c5b1da72a3d44129d1ba9b0d8b59fa43cc54 100644 |
--- a/src/core/SkStream.cpp |
+++ b/src/core/SkStream.cpp |
@@ -907,3 +907,34 @@ SkData* SkCopyStreamToData(SkStream* stream) { |
} while (!stream->isAtEnd()); |
return tempStream.copyToData(); |
} |
+ |
+SkStreamRewindable* SkStreamToStreamRewindable(SkStream* stream) { |
bungeman-skia
2014/07/11 21:43:38
I would prefer this to be SkStreamRewindableFromSk
hal.canary
2014/07/12 00:58:49
Done.
|
+ if (!stream) { |
+ return NULL; |
+ } |
+ SkAutoTUnref<SkStreamRewindable> dupStream(stream->duplicate()); |
+ if (dupStream) { |
+ return dupStream.detach(); |
+ } |
+ if (stream->hasLength()) { |
+ size_t length = stream->getLength(); |
+ SkAutoMalloc allocMemory(length); |
+ SkAssertResult(stream->rewind()); |
bungeman-skia
2014/07/11 21:43:38
I wouldn't assert this, just because a stream has
hal.canary
2014/07/12 00:58:49
Done.
|
+ SkAssertResult(length == stream->read(allocMemory.get(), length)); |
+ SkAssertResult(stream->rewind()); |
bungeman-skia
2014/07/11 21:43:38
I see no reason to try to leave this in a known st
hal.canary
2014/07/12 00:58:49
Done.
|
+ SkAutoTUnref<SkData> data( |
+ SkData::NewFromMalloc(allocMemory.get(), length)); |
+ return SkNEW_ARGS(SkMemoryStream, (data.get())); |
+ } |
+ SkAssertResult(stream->rewind()); |
+ SkDynamicMemoryWStream tempStream; |
+ const size_t bufferSize = 4096; |
+ char buffer[bufferSize]; |
+ do { |
+ size_t bytesRead = stream->read(buffer, bufferSize); |
+ tempStream.write(buffer, bytesRead); |
+ } while (!stream->isAtEnd()); |
+ SkAssertResult(stream->rewind()); |
bungeman-skia
2014/07/11 21:43:38
Same as above (line 924), I see no reason to try t
hal.canary
2014/07/12 00:58:49
Done.
|
+ return tempStream.detachAsStream(); // returns a SkBlockMemoryStream, |
+ // cheaper than copying to SkData |
+} |