diff options
Diffstat (limited to 'src/core/SkStream.cpp')
-rw-r--r-- | src/core/SkStream.cpp | 24 |
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) { |