add serialprocs to MultiDocument, hide redundant methods

Bug: skia:
Change-Id: I6521e93af79439bd8c1d2f5130a68492044a2ee9
Reviewed-on: https://skia-review.googlesource.com/87788
Reviewed-by: Wei Li <weili@chromium.org>
Reviewed-by: Hal Canary <halcanary@google.com>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/bench/RecordingBench.cpp b/bench/RecordingBench.cpp
index dc82655..d23d4f4 100644
--- a/bench/RecordingBench.cpp
+++ b/bench/RecordingBench.cpp
@@ -107,8 +107,7 @@
 }
 
 void DeserializePictureBench::onDraw(int loops, SkCanvas*) {
-    SkDeserialProcs procs;
     for (int i = 0; i < loops; ++i) {
-        SkPicture::MakeFromData(fEncodedPicture, procs);
+        SkPicture::MakeFromData(fEncodedPicture.get());
     }
 }
diff --git a/include/core/SkPicture.h b/include/core/SkPicture.h
index ba01a92..85b2368 100644
--- a/include/core/SkPicture.h
+++ b/include/core/SkPicture.h
@@ -38,13 +38,10 @@
      *  Recreate a picture that was serialized into a stream or data.
      */
 
-    static sk_sp<SkPicture> MakeFromStream(SkStream*);
-    static sk_sp<SkPicture> MakeFromData(const SkData* data);
-    static sk_sp<SkPicture> MakeFromData(const void* data, size_t size);
-
-    static sk_sp<SkPicture> MakeFromStream(SkStream*, const SkDeserialProcs& procs);
-    static sk_sp<SkPicture> MakeFromData(const SkData* data, const SkDeserialProcs& procs);
-    static sk_sp<SkPicture> MakeFromData(sk_sp<SkData> data, const SkDeserialProcs& procs);
+    static sk_sp<SkPicture> MakeFromStream(SkStream*, const SkDeserialProcs* = nullptr);
+    static sk_sp<SkPicture> MakeFromData(const SkData* data, const SkDeserialProcs* = nullptr);
+    static sk_sp<SkPicture> MakeFromData(const void* data, size_t size,
+                                         const SkDeserialProcs* = nullptr);
 
     /**
      *  Recreate a picture that was serialized into a buffer. If the creation requires bitmap
@@ -90,9 +87,16 @@
     /** Returns a non-zero value unique among all pictures. */
     uint32_t uniqueID() const;
 
-    sk_sp<SkData> serialize() const;
-    void serialize(SkWStream*) const;
+    sk_sp<SkData> serialize(const SkSerialProcs* = nullptr) const;
+    void serialize(SkWStream*, const SkSerialProcs* = nullptr) const;
+
+#ifdef SK_SUPPORT_LEGACY_SERIALPROCS_REF
     sk_sp<SkData> serialize(const SkSerialProcs&) const;
+    static sk_sp<SkPicture> MakeFromStream(SkStream*, const SkDeserialProcs& procs);
+    static sk_sp<SkPicture> MakeFromData(const SkData* data, const SkDeserialProcs& procs);
+    static sk_sp<SkPicture> MakeFromData(sk_sp<SkData> data, const SkDeserialProcs& procs);
+    static sk_sp<SkPicture> MakeFromData(sk_sp<SkData>, const SkDeserialProcs* = nullptr);
+#endif
 
     /**
      *  Serialize to a buffer.
@@ -121,8 +125,8 @@
     friend class SkEmptyPicture;
     template <typename> friend class SkMiniPicture;
 
-    void serialize(SkWStream*, const SkSerialProcs&, SkRefCntSet* typefaces) const;
-    static sk_sp<SkPicture> MakeFromStream(SkStream*, const SkDeserialProcs&, SkTypefacePlayback*);
+    void serialize(SkWStream*, const SkSerialProcs*, SkRefCntSet* typefaces) const;
+    static sk_sp<SkPicture> MakeFromStream(SkStream*, const SkDeserialProcs*, SkTypefacePlayback*);
     friend class SkPictureData;
 
     /** Return true if the SkStream/Buffer represents a serialized picture, and
diff --git a/include/core/SkSerialProcs.h b/include/core/SkSerialProcs.h
index cd87732..0c20f08 100644
--- a/include/core/SkSerialProcs.h
+++ b/include/core/SkSerialProcs.h
@@ -36,7 +36,7 @@
 typedef sk_sp<SkImage> (*SkDeserialImageProc)(const void* data, size_t length, void* ctx);
 typedef sk_sp<SkTypeface> (*SkDeserialTypefaceProc)(const void* data, size_t length, void* ctx);
 
-struct SkSerialProcs {
+struct SK_API SkSerialProcs {
     SkSerialPictureProc fPictureProc = nullptr;
     void*               fPictureCtx = nullptr;
 
@@ -47,7 +47,7 @@
     void*                fTypefaceCtx = nullptr;
 };
 
-struct SkDeserialProcs {
+struct SK_API SkDeserialProcs {
     SkDeserialPictureProc   fPictureProc = nullptr;
     void*                   fPictureCtx = nullptr;
 
diff --git a/src/core/SkPicture.cpp b/src/core/SkPicture.cpp
index b2a8360..0d8789a 100644
--- a/src/core/SkPicture.cpp
+++ b/src/core/SkPicture.cpp
@@ -144,28 +144,20 @@
     return r.finishRecordingAsPicture();
 }
 
-sk_sp<SkPicture> SkPicture::MakeFromStream(SkStream* stream) {
-    return MakeFromStream(stream, SkDeserialProcs(), nullptr);
+sk_sp<SkPicture> SkPicture::MakeFromStream(SkStream* stream, const SkDeserialProcs* procs) {
+    return MakeFromStream(stream, procs, nullptr);
 }
 
-sk_sp<SkPicture> SkPicture::MakeFromData(const void* data, size_t size) {
+sk_sp<SkPicture> SkPicture::MakeFromData(const void* data, size_t size,
+                                         const SkDeserialProcs* procs) {
     if (!data) {
         return nullptr;
     }
     SkMemoryStream stream(data, size);
-    return MakeFromStream(&stream, SkDeserialProcs(), nullptr);
+    return MakeFromStream(&stream, procs, nullptr);
 }
 
-sk_sp<SkPicture> SkPicture::MakeFromData(const SkData* data) {
-    if (!data) {
-        return nullptr;
-    }
-    SkMemoryStream stream(data->data(), data->size());
-    return MakeFromStream(&stream, SkDeserialProcs(), nullptr);
-}
-
-
-sk_sp<SkPicture> SkPicture::MakeFromData(const SkData* data, const SkDeserialProcs& procs) {
+sk_sp<SkPicture> SkPicture::MakeFromData(const SkData* data, const SkDeserialProcs* procs) {
     if (!data) {
         return nullptr;
     }
@@ -173,21 +165,18 @@
     return MakeFromStream(&stream, procs, nullptr);
 }
 
-sk_sp<SkPicture> SkPicture::MakeFromData(sk_sp<SkData> data, const SkDeserialProcs& procs) {
-    return MakeFromData(data.get(), procs);
-}
-
-sk_sp<SkPicture> SkPicture::MakeFromStream(SkStream* stream, const SkDeserialProcs& procs) {
-    return MakeFromStream(stream, procs, nullptr);
-}
-
-sk_sp<SkPicture> SkPicture::MakeFromStream(SkStream* stream, const SkDeserialProcs& procs,
+sk_sp<SkPicture> SkPicture::MakeFromStream(SkStream* stream, const SkDeserialProcs* procsPtr,
                                            SkTypefacePlayback* typefaces) {
     SkPictInfo info;
     if (!StreamIsSKP(stream, &info)) {
         return nullptr;
     }
 
+    SkDeserialProcs procs;
+    if (procsPtr) {
+        procs = *procsPtr;
+    }
+
     switch (stream->readU8()) {
         case kPictureData_TrailingStreamByteAfterPictInfo: {
             std::unique_ptr<SkPictureData> data(
@@ -244,22 +233,36 @@
     return new SkPictureData(rec, info);
 }
 
-void SkPicture::serialize(SkWStream* stream) const {
-    this->serialize(stream, SkSerialProcs(), nullptr);
+void SkPicture::serialize(SkWStream* stream, const SkSerialProcs* procs) const {
+    this->serialize(stream, procs, nullptr);
 }
 
-sk_sp<SkData> SkPicture::serialize() const {
-    SkDynamicMemoryWStream stream;
-    this->serialize(&stream);
-    return stream.detachAsData();
-}
-
-sk_sp<SkData> SkPicture::serialize(const SkSerialProcs& procs) const {
+sk_sp<SkData> SkPicture::serialize(const SkSerialProcs* procs) const {
     SkDynamicMemoryWStream stream;
     this->serialize(&stream, procs, nullptr);
     return stream.detachAsData();
 }
 
+#ifdef SK_SUPPORT_LEGACY_SERIALPROCS_REF
+sk_sp<SkData> SkPicture::serialize(const SkSerialProcs& procs) const {
+    return this->serialize(&procs);
+}
+sk_sp<SkPicture> SkPicture::MakeFromData(const SkData* data, const SkDeserialProcs& procs) {
+    return SkPicture::MakeFromData(data, &procs);
+}
+
+sk_sp<SkPicture> SkPicture::MakeFromData(sk_sp<SkData> data, const SkDeserialProcs& procs) {
+    return SkPicture::MakeFromData(std::move(data), &procs);
+}
+
+sk_sp<SkPicture> SkPicture::MakeFromStream(SkStream* stream, const SkDeserialProcs& procs) {
+    return SkPicture::MakeFromStream(stream, &procs);
+}
+sk_sp<SkPicture> SkPicture::MakeFromData(sk_sp<SkData> data, const SkDeserialProcs* procs) {
+    return SkPicture::MakeFromData(data.get(), procs);
+}
+#endif
+
 static sk_sp<SkData> custom_serialize(const SkPicture* picture, const SkSerialProcs& procs) {
     if (procs.fPictureProc) {
         auto data = procs.fPictureProc(const_cast<SkPicture*>(picture), procs.fPictureCtx);
@@ -285,8 +288,13 @@
     return true;
 }
 
-void SkPicture::serialize(SkWStream* stream, const SkSerialProcs& procs,
+void SkPicture::serialize(SkWStream* stream, const SkSerialProcs* procsPtr,
                           SkRefCntSet* typefaceSet) const {
+    SkSerialProcs procs;
+    if (procsPtr) {
+        procs = *procsPtr;
+    }
+
     SkPictInfo info = this->createHeader();
     stream->write(&info, sizeof(info));
 
diff --git a/src/core/SkPictureData.cpp b/src/core/SkPictureData.cpp
index 889e9db..7c51bd9 100644
--- a/src/core/SkPictureData.cpp
+++ b/src/core/SkPictureData.cpp
@@ -293,9 +293,8 @@
         bool write(const void*, size_t size) override { fBytesWritten += size; return true; }
         size_t bytesWritten() const override { return fBytesWritten; }
     } devnull;
-    SkSerialProcs nullProcs;
     for (int i = 0; i < fPictureCount; i++) {
-        fPictureRefs[i]->serialize(&devnull, nullProcs, typefaceSet);
+        fPictureRefs[i]->serialize(&devnull, nullptr, typefaceSet);
     }
 
     // We need to write factories before we write the buffer.
@@ -313,7 +312,7 @@
     if (fPictureCount > 0) {
         write_tag_size(stream, SK_PICT_PICTURE_TAG, fPictureCount);
         for (int i = 0; i < fPictureCount; i++) {
-            fPictureRefs[i]->serialize(stream, procs, typefaceSet);
+            fPictureRefs[i]->serialize(stream, &procs, typefaceSet);
         }
     }
 
@@ -424,7 +423,7 @@
             fPictureCount = 0;
             fPictureRefs = new const SkPicture* [size];
             for (uint32_t i = 0; i < size; i++) {
-                fPictureRefs[i] = SkPicture::MakeFromStream(stream, procs, topLevelTFPlayback).release();
+                fPictureRefs[i] = SkPicture::MakeFromStream(stream, &procs, topLevelTFPlayback).release();
                 if (!fPictureRefs[i]) {
                     return false;
                 }
diff --git a/src/utils/SkMultiPictureDocument.cpp b/src/utils/SkMultiPictureDocument.cpp
index 4ff2d07..b3e84dc 100644
--- a/src/utils/SkMultiPictureDocument.cpp
+++ b/src/utils/SkMultiPictureDocument.cpp
@@ -10,6 +10,7 @@
 #include "SkNWayCanvas.h"
 #include "SkPicture.h"
 #include "SkPictureRecorder.h"
+#include "SkSerialProcs.h"
 #include "SkStream.h"
 #include "SkTArray.h"
 
@@ -45,12 +46,15 @@
 }
 
 struct MultiPictureDocument final : public SkDocument {
+    const SkSerialProcs fProcs;
     SkPictureRecorder fPictureRecorder;
     SkSize fCurrentPageSize;
     SkTArray<sk_sp<SkPicture>> fPages;
     SkTArray<SkSize> fSizes;
-    MultiPictureDocument(SkWStream* s, void (*d)(SkWStream*, bool))
-        : SkDocument(s, d) {}
+    MultiPictureDocument(SkWStream* s, void (*d)(SkWStream*, bool), const SkSerialProcs* procs)
+        : SkDocument(s, d)
+        , fProcs(procs ? *procs : SkSerialProcs())
+    {}
     ~MultiPictureDocument() override { this->close(); }
 
     SkCanvas* onBeginPage(SkScalar w, SkScalar h) override {
@@ -77,7 +81,7 @@
             c->drawAnnotation(SkRect::MakeEmpty(), kEndPage, nullptr);
         }
         sk_sp<SkPicture> p = fPictureRecorder.finishRecordingAsPicture();
-        p->serialize(wStream);
+        p->serialize(wStream, &fProcs);
         fPages.reset();
         fSizes.reset();
         return;
@@ -89,8 +93,8 @@
 };
 }
 
-sk_sp<SkDocument> SkMakeMultiPictureDocument(SkWStream* wStream) {
-    return sk_make_sp<MultiPictureDocument>(wStream, nullptr);
+sk_sp<SkDocument> SkMakeMultiPictureDocument(SkWStream* wStream, const SkSerialProcs* procs) {
+    return sk_make_sp<MultiPictureDocument>(wStream, nullptr, procs);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -171,7 +175,8 @@
 
 bool SkMultiPictureDocumentRead(SkStreamSeekable* stream,
                                 SkDocumentPage* dstArray,
-                                int dstArrayCount) {
+                                int dstArrayCount,
+                                const SkDeserialProcs* procs) {
     if (!SkMultiPictureDocumentReadPageSizes(stream, dstArray, dstArrayCount)) {
         return false;
     }
@@ -181,7 +186,7 @@
                         SkTMax(joined.height(), dstArray[i].fSize.height())};
     }
 
-    auto picture = SkPicture::MakeFromStream(stream);
+    auto picture = SkPicture::MakeFromStream(stream, procs);
 
     PagerCanvas canvas(joined.toCeil(), dstArray, dstArrayCount);
     // Must call playback(), not drawPicture() to reach
diff --git a/src/utils/SkMultiPictureDocument.h b/src/utils/SkMultiPictureDocument.h
index 0ca8c2d..7d50683 100644
--- a/src/utils/SkMultiPictureDocument.h
+++ b/src/utils/SkMultiPictureDocument.h
@@ -4,17 +4,20 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
+
 #ifndef SkMultiPictureDocument_DEFINED
 #define SkMultiPictureDocument_DEFINED
 
 #include "SkDocument.h"
 
+struct SkDeserialProcs;
+struct SkSerialProcs;
 class SkStreamSeekable;
 
 /**
  *  Writes into a file format that is similar to SkPicture::serialize()
  */
-SK_API sk_sp<SkDocument> SkMakeMultiPictureDocument(SkWStream* dst);
+SK_API sk_sp<SkDocument> SkMakeMultiPictureDocument(SkWStream* dst, const SkSerialProcs* = nullptr);
 
 struct SkDocumentPage {
     sk_sp<SkPicture> fPicture;
@@ -33,6 +36,7 @@
  */
 SK_API bool SkMultiPictureDocumentRead(SkStreamSeekable* src,
                                        SkDocumentPage* dstArray,
-                                       int dstArrayCount);
+                                       int dstArrayCount,
+                                       const SkDeserialProcs* = nullptr);
 
 #endif  // SkMultiPictureDocument_DEFINED
diff --git a/tests/ImageTest.cpp b/tests/ImageTest.cpp
index ff058f2..ffccb85 100644
--- a/tests/ImageTest.cpp
+++ b/tests/ImageTest.cpp
@@ -244,7 +244,7 @@
     procs.fImageCtx = &was_called;
 
     REPORTER_ASSERT(reporter, !was_called);
-    auto data = picture->serialize(procs);
+    auto data = picture->serialize(&procs);
     REPORTER_ASSERT(reporter, was_called);
     REPORTER_ASSERT(reporter, data && data->size() > 0);
 
diff --git a/tests/SerialProcsTest.cpp b/tests/SerialProcsTest.cpp
index 0d13c03..c408dc7 100644
--- a/tests/SerialProcsTest.cpp
+++ b/tests/SerialProcsTest.cpp
@@ -70,11 +70,11 @@
 
     for (size_t i = 0; i < SK_ARRAY_COUNT(sprocs); ++i) {
         sproc.fImageProc = sprocs[i];
-        auto data = pic->serialize(sproc);
+        auto data = pic->serialize(&sproc);
         REPORTER_ASSERT(reporter, data);
 
         dproc.fImageProc = dprocs[i];
-        auto new_pic = SkPicture::MakeFromData(data, dproc);
+        auto new_pic = SkPicture::MakeFromData(data.get(), &dproc);
         REPORTER_ASSERT(reporter, data);
 
         auto dst_img = picture_to_image(new_pic);
@@ -140,9 +140,11 @@
         ctx.fSkipMe = p0.get();
     }
 
-    auto d0 = p0->serialize(makes(array_serial_proc, &ctx));
+    SkSerialProcs sprocs = makes(array_serial_proc, &ctx);
+    auto d0 = p0->serialize(&sprocs);
     REPORTER_ASSERT(reporter, ctx.fArray.count() == count);
-    p0 = SkPicture::MakeFromData(d0.get(), maked(array_deserial_proc, &ctx));
+    SkDeserialProcs dprocs = maked(array_deserial_proc, &ctx);
+    p0 = SkPicture::MakeFromData(d0.get(), &dprocs);
     REPORTER_ASSERT(reporter, ctx.fArray.count() == 0);
 }
 
diff --git a/tools/get_images_from_skps.cpp b/tools/get_images_from_skps.cpp
index c81254f..da66e58 100644
--- a/tools/get_images_from_skps.cpp
+++ b/tools/get_images_from_skps.cpp
@@ -141,7 +141,7 @@
         return SkData::MakeEmpty();
     };
     procs.fImageCtx = &sniff;
-    picture->serialize(procs);
+    picture->serialize(&procs);
     return true;
 }