SkStream/Priv cleanups

Replace all callers of SkCopyStreamToStorage with SkCopyStreamToData,
which is simpler and does the same thing.

Remove SkStreamRewindableFromSkStream, which is unused.

BUG=skia:4788
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1604963002

Review URL: https://codereview.chromium.org/1604963002
diff --git a/src/core/SkStream.cpp b/src/core/SkStream.cpp
index ef4c6ba..9529308 100644
--- a/src/core/SkStream.cpp
+++ b/src/core/SkStream.cpp
@@ -882,42 +882,6 @@
 }
 
 // Declared in SkStreamPriv.h:
-size_t SkCopyStreamToStorage(SkAutoMalloc* storage, SkStream* stream) {
-    SkASSERT(storage != nullptr);
-    SkASSERT(stream != nullptr);
-
-    if (stream->hasLength()) {
-        const size_t length = stream->getLength();
-        void* dst = storage->reset(length);
-        if (stream->read(dst, length) != length) {
-            return 0;
-        }
-        return length;
-    }
-
-    SkDynamicMemoryWStream tempStream;
-    // Arbitrary buffer size.
-#if defined(GOOGLE3)
-    // Stack frame size is limited in GOOGLE3.
-    const size_t bufferSize = 8 * 1024; // 8KB
-#else
-    const size_t bufferSize = 256 * 1024; // 256KB
-#endif
-    char buffer[bufferSize];
-    SkDEBUGCODE(size_t debugLength = 0;)
-    do {
-        size_t bytesRead = stream->read(buffer, bufferSize);
-        tempStream.write(buffer, bytesRead);
-        SkDEBUGCODE(debugLength += bytesRead);
-        SkASSERT(tempStream.bytesWritten() == debugLength);
-    } while (!stream->isAtEnd());
-    const size_t length = tempStream.bytesWritten();
-    void* dst = storage->reset(length);
-    tempStream.copyTo(dst);
-    return length;
-}
-
-// Declared in SkStreamPriv.h:
 SkData* SkCopyStreamToData(SkStream* stream) {
     SkASSERT(stream != nullptr);
 
@@ -935,34 +899,6 @@
     return tempStream.copyToData();
 }
 
-SkStreamRewindable* SkStreamRewindableFromSkStream(SkStream* stream) {
-    if (!stream) {
-        return nullptr;
-    }
-    SkAutoTDelete<SkStreamRewindable> dupStream(stream->duplicate());
-    if (dupStream) {
-        return dupStream.detach();
-    }
-    stream->rewind();
-    if (stream->hasLength()) {
-        size_t length = stream->getLength();
-        if (stream->hasPosition()) {  // If stream has length, but can't rewind.
-            length -= stream->getPosition();
-        }
-        SkAutoTUnref<SkData> data(SkData::NewFromStream(stream, length));
-        return new SkMemoryStream(data.get());
-    }
-    SkDynamicMemoryWStream tempStream;
-    const size_t bufferSize = 4096;
-    char buffer[bufferSize];
-    do {
-        size_t bytesRead = stream->read(buffer, bufferSize);
-        tempStream.write(buffer, bytesRead);
-    } while (!stream->isAtEnd());
-    return tempStream.detachAsStream();  // returns a SkBlockMemoryStream,
-                                         // cheaper than copying to SkData
-}
-
 bool SkStreamCopy(SkWStream* out, SkStream* input) {
     const char* base = static_cast<const char*>(input->getMemoryBase());
     if (base && input->hasPosition() && input->hasLength()) {
diff --git a/src/core/SkStreamPriv.h b/src/core/SkStreamPriv.h
index b82f7d8..75f7cce 100644
--- a/src/core/SkStreamPriv.h
+++ b/src/core/SkStreamPriv.h
@@ -8,40 +8,22 @@
 #ifndef SkStreamPriv_DEFINED
 #define SkStreamPriv_DEFINED
 
-class SkAutoMalloc;
-class SkStream;
-class SkStreamRewindable;
 class SkData;
-
-/**
- *  Copy the provided stream to memory allocated by storage.
- *  Used by SkImageDecoder_libbmp and SkImageDecoder_libico.
- *  @param storage Allocator to hold the memory. Will be reset to be large
- *      enough to hold the entire stream. Upon successful return,
- *      storage->get() will point to data holding the SkStream's entire
- *      contents.
- *  @param stream SkStream to be copied into storage.
- *  @return size_t Total number of bytes in the SkStream, which is also the
- *      number of bytes pointed to by storage->get(). Returns 0 on failure.
- */
-size_t SkCopyStreamToStorage(SkAutoMalloc* storage, SkStream* stream);
+class SkStream;
+class SkWStream;
 
 /**
  *  Copy the provided stream to an SkData variable.
+ *
+ *  Note: Assumes the stream is at the beginning. If it has a length,
+ *  but is not at the beginning, this call will fail (return NULL).
+ *
  *  @param stream SkStream to be copied into data.
  *  @return SkData* The resulting SkData after the copy. This data
  *      will have a ref count of one upon return and belongs to the
  *      caller. Returns nullptr on failure.
  */
-SkData *SkCopyStreamToData(SkStream* stream);
-
-/**
- *  Attempt to convert this stream to a StreamRewindable in the
- *  cheapest possible manner (calling duplicate() if possible, and
- *  otherwise allocating memory for a copy).  The position of the
- *  input stream is left in an indeterminate state.
- */
-SkStreamRewindable* SkStreamRewindableFromSkStream(SkStream* stream);
+SkData* SkCopyStreamToData(SkStream* stream);
 
 /**
  *  Copies the input stream from the current position to the end.
diff --git a/src/images/SkImageDecoder_astc.cpp b/src/images/SkImageDecoder_astc.cpp
index e1a6a06..8989464 100644
--- a/src/images/SkImageDecoder_astc.cpp
+++ b/src/images/SkImageDecoder_astc.cpp
@@ -5,6 +5,7 @@
  * found in the LICENSE file.
  */
 
+#include "SkData.h"
 #include "SkEndian.h"
 #include "SkColorPriv.h"
 #include "SkImageDecoder.h"
@@ -43,13 +44,12 @@
 }
 
 SkImageDecoder::Result SkASTCImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) {
-    SkAutoMalloc autoMal;
-    const size_t length = SkCopyStreamToStorage(&autoMal, stream);
-    if (0 == length) {
+    SkAutoTUnref<SkData> data(SkCopyStreamToData(stream));
+    if (!data || !data->size()) {
         return kFailure;
     }
 
-    unsigned char* buf = (unsigned char*)autoMal.get();
+    unsigned char* buf = (unsigned char*) data->data();
 
     // Make sure that the magic header is there...
     SkASSERT(SkEndian_SwapLE32(*(reinterpret_cast<uint32_t*>(buf))) == kASTCMagicNumber);
diff --git a/src/images/SkImageDecoder_libbmp.cpp b/src/images/SkImageDecoder_libbmp.cpp
index 1791623..4a6f71c 100644
--- a/src/images/SkImageDecoder_libbmp.cpp
+++ b/src/images/SkImageDecoder_libbmp.cpp
@@ -9,6 +9,7 @@
 
 #include "bmpdecoderhelper.h"
 #include "SkColorPriv.h"
+#include "SkData.h"
 #include "SkImageDecoder.h"
 #include "SkScaledBitmapSampler.h"
 #include "SkStream.h"
@@ -96,10 +97,13 @@
     // First read the entire stream, so that all of the data can be passed to
     // the BmpDecoderHelper.
 
-    // Allocated space used to hold the data.
-    SkAutoMalloc storage;
+    SkAutoTUnref<SkData> data(SkCopyStreamToData(stream));
+    if (!data) {
+        return kFailure;
+    }
+
     // Byte length of all of the data.
-    const size_t length = SkCopyStreamToStorage(&storage, stream);
+    const size_t length = data->size();
     if (0 == length) {
         return kFailure;
     }
@@ -111,7 +115,7 @@
     {
         image_codec::BmpDecoderHelper helper;
         const int max_pixels = 16383*16383; // max width*height
-        if (!helper.DecodeImage((const char*)storage.get(), length,
+        if (!helper.DecodeImage((const char*) data->data(), length,
                                 max_pixels, &callback)) {
             return kFailure;
         }
@@ -119,7 +123,7 @@
 
     // we don't need this anymore, so free it now (before we try to allocate
     // the bitmap's pixels) rather than waiting for its destructor
-    storage.free();
+    data.reset(nullptr);
 
     int width = callback.width();
     int height = callback.height();
diff --git a/src/images/SkImageDecoder_libico.cpp b/src/images/SkImageDecoder_libico.cpp
index cb21b69..93a875d 100644
--- a/src/images/SkImageDecoder_libico.cpp
+++ b/src/images/SkImageDecoder_libico.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "SkColorPriv.h"
+#include "SkData.h"
 #include "SkImageDecoder.h"
 #include "SkStream.h"
 #include "SkStreamPriv.h"
@@ -74,14 +75,18 @@
 
 SkImageDecoder::Result SkICOImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode)
 {
-    SkAutoMalloc autoMal;
-    const size_t length = SkCopyStreamToStorage(&autoMal, stream);
+    SkAutoTUnref<SkData> data(SkCopyStreamToData(stream));
+    if (!data) {
+        return kFailure;
+    }
+
+    const size_t length = data->size();
     // Check that the buffer is large enough to read the directory header
     if (length < 6) {
         return kFailure;
     }
 
-    unsigned char* buf = (unsigned char*)autoMal.get();
+    unsigned char* buf = (unsigned char*) data->data();
 
     //these should always be the same - should i use for error checking? - what about files that have some
     //incorrect values, but still decode properly?
diff --git a/src/images/SkImageDecoder_pkm.cpp b/src/images/SkImageDecoder_pkm.cpp
index 7100461..098a4ee 100644
--- a/src/images/SkImageDecoder_pkm.cpp
+++ b/src/images/SkImageDecoder_pkm.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "SkColorPriv.h"
+#include "SkData.h"
 #include "SkImageDecoder.h"
 #include "SkScaledBitmapSampler.h"
 #include "SkStream.h"
@@ -33,13 +34,12 @@
 /////////////////////////////////////////////////////////////////////////////////////////
 
 SkImageDecoder::Result SkPKMImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) {
-    SkAutoMalloc autoMal;
-    const size_t length = SkCopyStreamToStorage(&autoMal, stream);
-    if (0 == length) {
+    SkAutoTUnref<SkData> data(SkCopyStreamToData(stream));
+    if (!data || !data->size()) {
         return kFailure;
     }
 
-    unsigned char* buf = (unsigned char*)autoMal.get();
+    unsigned char* buf = (unsigned char*) data->data();
 
     // Make sure original PKM header is there...
     SkASSERT(etc1_pkm_is_valid(buf));
diff --git a/src/ports/SkImageDecoder_CG.cpp b/src/ports/SkImageDecoder_CG.cpp
index 4be5874..2deaf21 100644
--- a/src/ports/SkImageDecoder_CG.cpp
+++ b/src/ports/SkImageDecoder_CG.cpp
@@ -10,6 +10,7 @@
 
 #include "SkCGUtils.h"
 #include "SkColorPriv.h"
+#include "SkData.h"
 #include "SkImageDecoder.h"
 #include "SkImageEncoder.h"
 #include "SkMovie.h"
@@ -28,17 +29,19 @@
 #include <MobileCoreServices/MobileCoreServices.h>
 #endif
 
-static void malloc_release_proc(void* info, const void* data, size_t size) {
-    sk_free(info);
+static void data_unref_proc(void* skdata, const void*, size_t) {
+    SkASSERT(skdata);
+    static_cast<SkData*>(skdata)->unref();
 }
 
 static CGDataProviderRef SkStreamToDataProvider(SkStream* stream) {
     // TODO: use callbacks, so we don't have to load all the data into RAM
-    SkAutoMalloc storage;
-    const size_t len = SkCopyStreamToStorage(&storage, stream);
-    void* data = storage.detach();
+    SkData* skdata = SkCopyStreamToData(stream);
+    if (!skdata) {
+        return nullptr;
+    }
 
-    return CGDataProviderCreateWithData(data, data, len, malloc_release_proc);
+    return CGDataProviderCreateWithData(skdata, skdata->data(), skdata->size(), data_unref_proc);
 }
 
 static CGImageSourceRef SkStreamToCGImageSource(SkStream* stream) {