[PDF] Fix printing crashes caused by font streams that don't support getMemoryBase().

An apparently recently change started putting web fonts into SkStream objects that don't support getMemoryBase().  This change uses writeStream to avoid needing to call getMemoryBase().

BUG=chromium:274440
R=bungeman@google.com

Review URL: https://codereview.chromium.org/23437004

git-svn-id: http://skia.googlecode.com/svn/trunk/src@10928 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/pdf/SkPDFStream.cpp b/pdf/SkPDFStream.cpp
index 4ae1f39..e570976 100644
--- a/pdf/SkPDFStream.cpp
+++ b/pdf/SkPDFStream.cpp
@@ -18,10 +18,8 @@
                     SkPDFDocument::kFavorSpeedOverSize_Flags);
 }
 
-SkPDFStream::SkPDFStream(SkStream* stream)
-    : fState(kUnused_State),
-      fData(stream) {
-    SkSafeRef(stream);
+SkPDFStream::SkPDFStream(SkStream* stream) : fState(kUnused_State) {
+    setData(stream);
 }
 
 SkPDFStream::SkPDFStream(SkData* data) : fState(kUnused_State) {
@@ -30,9 +28,8 @@
 
 SkPDFStream::SkPDFStream(const SkPDFStream& pdfStream)
         : SkPDFDict(),
-          fState(kUnused_State),
-          fData(pdfStream.fData.get()) {
-    fData.get()->ref();
+          fState(kUnused_State) {
+    setData(pdfStream.fData.get());
     bool removeLength = true;
     // Don't uncompress an already compressed stream, but we could.
     if (pdfStream.fState == kCompressed_State) {
@@ -64,7 +61,8 @@
 
     this->INHERITED::emitObject(stream, catalog, false);
     stream->writeText(" stream\n");
-    stream->write(fData->getMemoryBase(), fData->getLength());
+    stream->writeStream(fData.get(), fData->getLength());
+    fData->rewind();
     stream->writeText("\nendstream");
 }
 
@@ -89,6 +87,11 @@
 }
 
 void SkPDFStream::setData(SkStream* stream) {
+    // Code assumes that the stream starts at the beginning and is rewindable.
+    if (stream) {
+        SkASSERT(stream->getPosition() == 0);
+        SkASSERT(stream->rewind());
+    }
     fData.reset(stream);
     SkSafeRef(stream);
 }
diff --git a/pdf/SkPDFStream.h b/pdf/SkPDFStream.h
index ed18510..d7ff115 100644
--- a/pdf/SkPDFStream.h
+++ b/pdf/SkPDFStream.h
@@ -21,6 +21,8 @@
 
     A stream object in a PDF.  Note, all streams must be indirect objects (via
     SkObjRef).
+    TODO(vandebo): SkStream should be replaced by SkStreamRewindable when that
+    is feasible.
 */
 class SkPDFStream : public SkPDFDict {
 public: