aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkStream.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/SkStream.cpp')
-rw-r--r--src/core/SkStream.cpp24
1 files changed, 22 insertions, 2 deletions
diff --git a/src/core/SkStream.cpp b/src/core/SkStream.cpp
index ef86bc963e..7bb2079f7f 100644
--- a/src/core/SkStream.cpp
+++ b/src/core/SkStream.cpp
@@ -545,10 +545,13 @@ void SkDynamicMemoryWStream::copyTo(void* dst) const {
}
}
-void SkDynamicMemoryWStream::writeToStream(SkWStream* dst) const {
+bool SkDynamicMemoryWStream::writeToStream(SkWStream* dst) const {
for (Block* block = fHead; block != nullptr; block = block->fNext) {
- dst->write(block->start(), block->written());
+ if (!dst->write(block->start(), block->written())) {
+ return false;
+ }
}
+ return true;
}
void SkDynamicMemoryWStream::padToAlign4() {
@@ -584,6 +587,23 @@ void SkDynamicMemoryWStream::copyToAndReset(void* ptr) {
fBytesWrittenBeforeTail = 0;
}
+bool SkDynamicMemoryWStream::writeToAndReset(SkWStream* dst) {
+ // By looping through the source and freeing as we copy, we
+ // can reduce real memory use with large streams.
+ bool dstStreamGood = true;
+ for (Block* block = fHead; block != nullptr; ) {
+ if (dstStreamGood && !dst->write(block->start(), block->written())) {
+ dstStreamGood = false;
+ }
+ Block* next = block->fNext;
+ sk_free(block);
+ block = next;
+ }
+ fHead = fTail = nullptr;
+ fBytesWrittenBeforeTail = 0;
+ return dstStreamGood;
+}
+
sk_sp<SkData> SkDynamicMemoryWStream::detachAsData() {
const size_t size = this->bytesWritten();
if (0 == size) {