aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkStream.cpp
diff options
context:
space:
mode:
authorGravatar Hal Canary <halcanary@google.com>2017-05-23 11:47:05 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-05-24 19:49:35 +0000
commit6fee59b514c5f7b7ff34d63b294759dd0c1d4858 (patch)
tree6bcfede9aabf632d1f3f7fc0cb1f414240645c96 /src/core/SkStream.cpp
parent14a6430b7bcf92bcabf4aef18805969d1335aab1 (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.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) {