SkData to SkStreamAsset to avoid unneeded copying

R=mtklein@google.com

Author: halcanary@google.com

Review URL: https://codereview.chromium.org/502193002
diff --git a/dm/DMPDFRasterizeTask.cpp b/dm/DMPDFRasterizeTask.cpp
index 43be6e5..40b9d8b 100644
--- a/dm/DMPDFRasterizeTask.cpp
+++ b/dm/DMPDFRasterizeTask.cpp
@@ -16,18 +16,20 @@
 namespace DM {
 
 PDFRasterizeTask::PDFRasterizeTask(const Task& parent,
-                                   SkData* pdf,
+                                   SkStreamAsset* pdf,
                                    RasterizePdfProc proc)
     : CpuTask(parent)
     , fName(UnderJoin(parent.name().c_str(), "rasterize"))
-    , fPdf(SkRef(pdf))
-    , fRasterize(proc) {}
+    , fPdf(pdf)
+    , fRasterize(proc) {
+    SkASSERT(fPdf.get());
+    SkASSERT(fPdf->unique());
+}
 
 void PDFRasterizeTask::draw() {
-    SkMemoryStream pdfStream(fPdf.get());
     SkBitmap bitmap;
 
-    if (fRasterize(&pdfStream, &bitmap)) {
+    if (fRasterize(fPdf.get(), &bitmap)) {
         this->spawnChild(SkNEW_ARGS(WriteTask, (*this, bitmap)));
     } else {
         this->fail();
diff --git a/dm/DMPDFRasterizeTask.h b/dm/DMPDFRasterizeTask.h
index 2cc1ef7..7231950 100644
--- a/dm/DMPDFRasterizeTask.h
+++ b/dm/DMPDFRasterizeTask.h
@@ -21,8 +21,9 @@
 
 class PDFRasterizeTask : public CpuTask {
 public:
+    // takes ownership of SkStreamAsset.
     PDFRasterizeTask(const Task& parent,
-                     SkData* pdf,
+                     SkStreamAsset* pdf,
                      RasterizePdfProc);
 
     virtual void draw() SK_OVERRIDE;
@@ -31,7 +32,7 @@
 
 private:
     const SkString fName;
-    SkAutoTUnref<SkData> fPdf;
+    SkAutoTDelete<SkStreamAsset> fPdf;
     RasterizePdfProc fRasterize;
 };
 
diff --git a/dm/DMPDFTask.cpp b/dm/DMPDFTask.cpp
index 5fee403..81fd307 100644
--- a/dm/DMPDFTask.cpp
+++ b/dm/DMPDFTask.cpp
@@ -50,11 +50,11 @@
 
     SkCanvas* canvas() { return fCanvas; }
 
-    SkData* end() {
+    SkStreamAsset* end() {
         fCanvas->flush();
         fDocument->endPage();
         fDocument->close();
-        return fWriteStream.copyToData();
+        return fWriteStream.detachAsStream();
     }
 
 private:
@@ -66,7 +66,7 @@
 }  // namespace
 
 void PDFTask::draw() {
-    SkAutoTUnref<SkData> pdfData;
+    SkAutoTDelete<SkStreamAsset> pdfData;
     bool rasterize = true;
     if (fGM.get()) {
         rasterize = 0 == (fGM->getFlags() & skiagm::GM::kSkipPDFRasterization_Flag);
@@ -83,9 +83,11 @@
 
     SkASSERT(pdfData.get());
     if (rasterize) {
-        this->spawnChild(SkNEW_ARGS(PDFRasterizeTask, (*this, pdfData.get(), fRasterize)));
+        this->spawnChild(SkNEW_ARGS(PDFRasterizeTask,
+                                    (*this, pdfData->duplicate(), fRasterize)));
     }
-    this->spawnChild(SkNEW_ARGS(WriteTask, (*this, pdfData.get(), ".pdf")));
+    this->spawnChild(SkNEW_ARGS(WriteTask,
+                                (*this, pdfData->duplicate(), ".pdf")));
 }
 
 bool PDFTask::shouldSkip() const {
diff --git a/dm/DMWriteTask.cpp b/dm/DMWriteTask.cpp
index b8ce318..5a07e46 100644
--- a/dm/DMWriteTask.cpp
+++ b/dm/DMWriteTask.cpp
@@ -41,11 +41,14 @@
     , fData(NULL)
     , fExtension(".png") {}
 
-WriteTask::WriteTask(const Task& parent, SkData *data, const char* ext)
+WriteTask::WriteTask(const Task& parent, SkStreamAsset *data, const char* ext)
     : CpuTask(parent)
     , fGmName(find_gm_name(parent, &fSuffixes))
-    , fData(SkRef(data))
-    , fExtension(ext) {}
+    , fData(data)
+    , fExtension(ext) {
+    SkASSERT(fData.get());
+    SkASSERT(fData->unique());
+}
 
 void WriteTask::makeDirOrFail(SkString dir) {
     if (!sk_mkdir(dir.c_str())) {
@@ -115,9 +118,10 @@
 };
 
 // Does not take ownership of data.
-bool save_data_to_file(const SkData* data, const char* path) {
+bool save_data_to_file(SkStreamAsset* data, const char* path) {
+    data->rewind();
     SkFILEWStream stream(path);
-    if (!stream.isValid() || !stream.write(data->data(), data->size())) {
+    if (!stream.isValid() || !stream.writeStream(data, data->getLength())) {
         SkDebugf("Can't write %s.\n", path);
         return false;
     }
@@ -142,7 +146,7 @@
     SkString path = SkOSPath::Join(dir.c_str(), fGmName.c_str());
     path.append(fExtension);
 
-    const bool ok = fData.get() ? save_data_to_file(fData,   path.c_str())
+    const bool ok = fData.get() ? save_data_to_file(fData.get(), path.c_str())
                                 : PngAndRaw::Encode(fBitmap, path.c_str());
     if (!ok) {
         this->fail();
diff --git a/dm/DMWriteTask.h b/dm/DMWriteTask.h
index c2c1d9f..15e1300 100644
--- a/dm/DMWriteTask.h
+++ b/dm/DMWriteTask.h
@@ -18,8 +18,9 @@
     WriteTask(const Task& parent,  // WriteTask must be a child task.
               SkBitmap bitmap);    // Bitmap to encode to PNG and write to disk.
 
+    // Takes ownership of SkStreamAsset
     WriteTask(const Task& parent,   // WriteTask must be a child task.
-              SkData *data,         // Pre-encoded data to write to disk.
+              SkStreamAsset* data,  // Pre-encoded data to write to disk.
               const char* ext);     // File extension.
 
     virtual void draw() SK_OVERRIDE;
@@ -40,7 +41,7 @@
     SkTArray<SkString> fSuffixes;
     const SkString fGmName;
     const SkBitmap fBitmap;
-    SkAutoTUnref<SkData> fData;
+    SkAutoTDelete<SkStreamAsset> fData;
     const char* fExtension;
 
     void makeDirOrFail(SkString dir);