diff options
author | Hal Canary <halcanary@google.com> | 2017-05-23 11:47:05 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-05-24 19:49:35 +0000 |
commit | 6fee59b514c5f7b7ff34d63b294759dd0c1d4858 (patch) | |
tree | 6bcfede9aabf632d1f3f7fc0cb1f414240645c96 /src/core/SkStream.cpp | |
parent | 14a6430b7bcf92bcabf4aef18805969d1335aab1 (diff) |
SkStream: DynamicMemoryWStream gets writeToAndReset
This is similar to copyToAndReset().
Also use this in SkPDF, for minor memory savings:
Single-threaded DM's peak RSS drops from 239MB
to 228MB.
Change-Id: I352a980e6dd54eb05d74cd057bd50e02312753b0
Reviewed-on: https://skia-review.googlesource.com/17714
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Hal Canary <halcanary@google.com>
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) { |