remove unused dynamicwstream.snapshotAsData()

Checking to invalidate this on every write() call has a measurable cost, so removing it both simplifies the class and speeds it up.

BUG=skia:

Change-Id: Idf0baa265c9a0b5d26d82fce948c61ed9b0810b1
Reviewed-on: https://skia-review.googlesource.com/6096
Reviewed-by: Ben Wagner <bungeman@google.com>
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/include/core/SkStream.h b/include/core/SkStream.h
index d8eeb6c..089a4ca 100644
--- a/include/core/SkStream.h
+++ b/include/core/SkStream.h
@@ -385,7 +385,6 @@
     void copyTo(void* dst) const;
     void writeToStream(SkWStream* dst) const;
 
-    sk_sp<SkData> snapshotAsData() const;
     // Return the contents as SkData, and then reset the stream.
     sk_sp<SkData> detachAsData();
 
@@ -400,9 +399,6 @@
     Block*  fHead;
     Block*  fTail;
     size_t  fBytesWritten;
-    mutable sk_sp<SkData> fCopy;  // is invalidated if we write after it is created
-
-    void invalidateCopy();
 
     // For access to the Block type.
     friend class SkBlockMemoryStream;
diff --git a/src/core/SkStream.cpp b/src/core/SkStream.cpp
index cb47437..20afe2b 100644
--- a/src/core/SkStream.cpp
+++ b/src/core/SkStream.cpp
@@ -504,12 +504,8 @@
     reset();
 }
 
-void SkDynamicMemoryWStream::reset()
-{
-    this->invalidateCopy();
-
+void SkDynamicMemoryWStream::reset() {
     Block*  block = fHead;
-
     while (block != nullptr) {
         Block*  next = block->fNext;
         sk_free(block);
@@ -519,11 +515,8 @@
     fBytesWritten = 0;
 }
 
-bool SkDynamicMemoryWStream::write(const void* buffer, size_t count)
-{
+bool SkDynamicMemoryWStream::write(const void* buffer, size_t count) {
     if (count > 0) {
-        this->invalidateCopy();
-
         fBytesWritten += count;
 
         size_t  size;
@@ -572,19 +565,13 @@
     return false;
 }
 
-void SkDynamicMemoryWStream::copyTo(void* dst) const
-{
-    if (fCopy) {
-        memcpy(dst, fCopy->data(), fBytesWritten);
-    } else {
-        Block* block = fHead;
-
-        while (block != nullptr) {
-            size_t size = block->written();
-            memcpy(dst, block->start(), size);
-            dst = (void*)((char*)dst + size);
-            block = block->fNext;
-        }
+void SkDynamicMemoryWStream::copyTo(void* dst) const {
+    Block* block = fHead;
+    while (block != nullptr) {
+        size_t size = block->written();
+        memcpy(dst, block->start(), size);
+        dst = (void*)((char*)dst + size);
+        block = block->fNext;
     }
 }
 
@@ -604,24 +591,16 @@
     write(&zero, padBytes);
 }
 
-sk_sp<SkData> SkDynamicMemoryWStream::snapshotAsData() const {
-    if (nullptr == fCopy) {
-        auto data = SkData::MakeUninitialized(fBytesWritten);
-        // be sure to call copyTo() before we assign to fCopy
-        this->copyTo(data->writable_data());
-        fCopy = std::move(data);
-    }
-    return fCopy;
-}
-
 sk_sp<SkData> SkDynamicMemoryWStream::detachAsData() {
-    sk_sp<SkData> data = this->snapshotAsData();
-    this->reset();
-    return data;
-}
+    const size_t size = this->bytesWritten();
+    if (0 == size) {
+        return SkData::MakeEmpty();
+    }
 
-void SkDynamicMemoryWStream::invalidateCopy() {
-    fCopy = nullptr;
+    sk_sp<SkData> data = SkData::MakeUninitialized(size);
+    this->copyTo(data->writable_data());
+    this->reset(); // this is the "detach" part
+    return data;
 }
 
 class SkBlockMemoryRefCnt : public SkRefCnt {
@@ -770,13 +749,8 @@
 };
 
 SkStreamAsset* SkDynamicMemoryWStream::detachAsStream() {
-    if (fCopy) {
-        SkMemoryStream* stream = new SkMemoryStream(fCopy);
-        this->reset();
-        return stream;
-    }
-    SkBlockMemoryStream* stream = new SkBlockMemoryStream(fHead, fBytesWritten);
-    fHead = 0;
+    SkBlockMemoryStream* stream = new SkBlockMemoryStream(fHead, this->bytesWritten());
+    fHead = nullptr;    // signal reset() to not free anything
     this->reset();
     return stream;
 }
diff --git a/tests/PDFGlyphsToUnicodeTest.cpp b/tests/PDFGlyphsToUnicodeTest.cpp
index b3ee2d8..a256c93 100644
--- a/tests/PDFGlyphsToUnicodeTest.cpp
+++ b/tests/PDFGlyphsToUnicodeTest.cpp
@@ -15,14 +15,19 @@
 
 static bool stream_equals(const SkDynamicMemoryWStream& stream, size_t offset,
                           const char* buffer, size_t len) {
-    sk_sp<SkData> data = stream.snapshotAsData();
-    if (offset + len > data->size()) {
-        return false;
-    }
     if (len != strlen(buffer)) {
         return false;
     }
-    return memcmp(data->bytes() + offset, buffer, len) == 0;
+
+    const size_t streamSize = stream.bytesWritten();
+
+    if (offset + len > streamSize) {
+        return false;
+    }
+
+    SkAutoTMalloc<char> data(streamSize);
+    stream.copyTo(data.get());
+    return memcmp(data.get() + offset, buffer, len) == 0;
 }
 
 DEF_TEST(SkPDF_ToUnicode, reporter) {
diff --git a/tests/StreamTest.cpp b/tests/StreamTest.cpp
index d1fd751..b64de69 100644
--- a/tests/StreamTest.cpp
+++ b/tests/StreamTest.cpp
@@ -118,12 +118,6 @@
     REPORTER_ASSERT(reporter, ds.getOffset() == 100 * 26);
 
     {
-        sk_sp<SkData> data = ds.snapshotAsData();
-        REPORTER_ASSERT(reporter, 100 * 26 == data->size());
-        REPORTER_ASSERT(reporter, memcmp(dst, data->data(), data->size()) == 0);
-    }
-
-    {
         // Test that this works after a snapshot.
         std::unique_ptr<SkStreamAsset> stream(ds.detachAsStream());
         REPORTER_ASSERT(reporter, ds.getOffset() == 0);