Reland "Revert "Make SKP deserialize null instead of PNG images by default.""

This reverts commit b78c91996051d250b6a2946a7b6f14719e014d57.

Reason for revert: Possible cause of https://crbug.com/1485891

Original change's description:
> Revert "Revert "Make SKP deserialize null instead of PNG images by default.""
>
> This reverts commit 2d295711337cf6fcbf66dfc90af39d4188999108.
>
> Change-Id: I158484509c1d067cbebdc99f97e42ff734fa855a
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/755548
> Reviewed-by: Brian Osman <brianosman@google.com>
> Commit-Queue: Kevin Lubick <kjlubick@google.com>

Change-Id: Ifb716927460a8ab6a03dafc168d1eb1eb230fea7
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/759268
Owners-Override: Kevin Lubick <kjlubick@google.com>
Commit-Queue: Kevin Lubick <kjlubick@google.com>
Auto-Submit: Kevin Lubick <kjlubick@google.com>
Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
index 78bd500..3e55dab 100644
--- a/dm/DMSrcSink.cpp
+++ b/dm/DMSrcSink.cpp
@@ -21,7 +21,6 @@
 #include "include/core/SkSurface.h"
 #include "include/core/SkSurfaceProps.h"
 #include "include/docs/SkPDFDocument.h"
-#include "include/encode/SkPngEncoder.h"
 #include "include/gpu/GrBackendSurface.h"
 #include "include/gpu/GrDirectContext.h"
 #include "include/gpu/ganesh/SkImageGanesh.h"
@@ -52,7 +51,6 @@
 #include "src/gpu/ganesh/GrDirectContextPriv.h"
 #include "src/gpu/ganesh/GrGpu.h"
 #include "src/gpu/ganesh/image/GrImageUtils.h"
-#include "src/image/SkImage_Base.h"
 #include "src/utils/SkJSONWriter.h"
 #include "src/utils/SkMultiPictureDocumentPriv.h"
 #include "src/utils/SkOSPath.h"
@@ -2007,14 +2005,6 @@
 }
 #endif
 
-static SkSerialProcs serial_procs_using_png() {
-    static SkSerialProcs procs;
-    procs.fImageProc = [](SkImage* img, void*) -> sk_sp<SkData> {
-        return SkPngEncoder::Encode(as_IB(img)->directContext(), img, SkPngEncoder::Options{});
-    };
-    return procs;
-}
-
 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 
 SKPSink::SKPSink() {}
@@ -2026,8 +2016,7 @@
     if (!result.isOk()) {
         return result;
     }
-    SkSerialProcs procs = serial_procs_using_png();
-    recorder.finishRecordingAsPicture()->serialize(dst, &procs);
+    recorder.finishRecordingAsPicture()->serialize(dst);
     return Result::Ok();
 }
 
@@ -2280,9 +2269,8 @@
     }
     sk_sp<SkPicture> pic(recorder.finishRecordingAsPicture());
 
-    SkSerialProcs procs = serial_procs_using_png();
     // Serialize it and then deserialize it.
-    sk_sp<SkPicture> deserialized(SkPicture::MakeFromData(pic->serialize(&procs).get()));
+    sk_sp<SkPicture> deserialized(SkPicture::MakeFromData(pic->serialize().get()));
 
     result = draw_to_canvas(fSink.get(), bitmap, stream, log, size,
                             [&](SkCanvas* canvas) {
diff --git a/docs/examples/Picture_008.cpp b/docs/examples/Picture_008.cpp
new file mode 100644
index 0000000..69a6d75
--- /dev/null
+++ b/docs/examples/Picture_008.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "tools/fiddle/examples.h"
+// HASH=30b9f1b310187db6aff720a5d67591e2
+REG_FIDDLE(Picture_008, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPictureRecorder recorder;
+    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});
+    SkPaint paint;
+    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);
+    paint.setColor(SK_ColorWHITE);
+    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
+    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
+    SkDynamicMemoryWStream writableStream;
+    picture->serialize(&writableStream);
+    sk_sp<SkData> readableData = writableStream.detachAsData();
+    sk_sp<SkPicture> copy = SkPicture::MakeFromData(readableData->data(), readableData->size());
+    copy->playback(canvas);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Picture_MakeFromData.cpp b/docs/examples/Picture_MakeFromData.cpp
index 4ed67cb..92041e8 100644
--- a/docs/examples/Picture_MakeFromData.cpp
+++ b/docs/examples/Picture_MakeFromData.cpp
@@ -12,7 +12,7 @@
     pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
     sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
     SkDynamicMemoryWStream writableStream;
-    picture->serialize(&writableStream, nullptr);
+    picture->serialize(&writableStream);
     sk_sp<SkData> readableData = writableStream.detachAsData();
     sk_sp<SkPicture> copy = SkPicture::MakeFromData(readableData.get());
     copy->playback(canvas);
diff --git a/docs/examples/Picture_MakeFromStream.cpp b/docs/examples/Picture_MakeFromStream.cpp
index fcc08e8..5508809 100644
--- a/docs/examples/Picture_MakeFromStream.cpp
+++ b/docs/examples/Picture_MakeFromStream.cpp
@@ -12,7 +12,7 @@
     pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
     sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
     SkDynamicMemoryWStream writableStream;
-    picture->serialize(&writableStream, nullptr);
+    picture->serialize(&writableStream);
     std::unique_ptr<SkStreamAsset> readableStream = writableStream.detachAsStream();
     sk_sp<SkPicture> copy = SkPicture::MakeFromStream(readableStream.get());
     copy->playback(canvas);
diff --git a/docs/examples/Picture_serialize.cpp b/docs/examples/Picture_serialize.cpp
index 3a0a695..1875ba6 100644
--- a/docs/examples/Picture_serialize.cpp
+++ b/docs/examples/Picture_serialize.cpp
@@ -11,10 +11,7 @@
     paint.setColor(SK_ColorWHITE);
     pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
     sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
-    SkSerialProcs sProcs;
-    // One would override serialization behavior for images, typefaces, or even SkPictures
-    // themselves if desired by setting the fields on sProcs.
-    sk_sp<SkData> readableData = picture->serialize(&sProcs);
+    sk_sp<SkData> readableData = picture->serialize();
     sk_sp<SkPicture> copy = SkPicture::MakeFromData(readableData->data(), readableData->size());
     copy->playback(canvas);
 }
diff --git a/docs/examples/Picture_serialize_2.cpp b/docs/examples/Picture_serialize_2.cpp
index f97e174..f78b130 100644
--- a/docs/examples/Picture_serialize_2.cpp
+++ b/docs/examples/Picture_serialize_2.cpp
@@ -12,10 +12,7 @@
     pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
     sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
     SkDynamicMemoryWStream writableStream;
-    SkSerialProcs sProcs;
-    // One would override serialization behavior for images, typefaces, or even SkPictures
-    // themselves if desired by setting the fields on sProcs.
-    picture->serialize(&writableStream, &sProcs);
+    picture->serialize(&writableStream);
     sk_sp<SkData> readableData = writableStream.detachAsData();
     sk_sp<SkPicture> copy = SkPicture::MakeFromData(readableData->data(), readableData->size());
     copy->playback(canvas);
diff --git a/fuzz/FuzzCanvas.cpp b/fuzz/FuzzCanvas.cpp
index 2c21203..268a79b 100644
--- a/fuzz/FuzzCanvas.cpp
+++ b/fuzz/FuzzCanvas.cpp
@@ -7,7 +7,6 @@
 
 #include "fuzz/Fuzz.h"
 #include "fuzz/FuzzCommon.h"
-#include "include/codec/SkPngDecoder.h"
 #include "include/core/SkBitmap.h"
 #include "include/core/SkBlurTypes.h"
 #include "include/core/SkCanvas.h"
@@ -35,7 +34,6 @@
 #include "include/effects/SkImageFilters.h"
 #include "include/effects/SkLumaColorFilter.h"
 #include "include/effects/SkPerlinNoiseShader.h"
-#include "include/encode/SkPngEncoder.h"
 #include "include/gpu/ganesh/SkSurfaceGanesh.h"
 #include "include/private/base/SkTo.h"
 #include "include/svg/SkSVGCanvas.h"
@@ -1524,14 +1522,9 @@
                                               SkIntToScalar(kCanvasSize.height())));
     sk_sp<SkPicture> pic(recorder.finishRecordingAsPicture());
     if (!pic) { fuzz->signalBug(); }
-    SkSerialProcs sProcs;
-    sProcs.fImageProc = [](SkImage* img, void*) -> sk_sp<SkData> {
-        return SkPngEncoder::Encode(nullptr, img, SkPngEncoder::Options{});
-    };
-    sk_sp<SkData> data = pic->serialize(&sProcs);
+    sk_sp<SkData> data = pic->serialize();
     if (!data) { fuzz->signalBug(); }
     SkReadBuffer rb(data->data(), data->size());
-    SkCodecs::Register(SkPngDecoder::Decoder());
     auto deserialized = SkPicturePriv::MakeFromBuffer(rb);
     if (!deserialized) { fuzz->signalBug(); }
     auto surface = SkSurfaces::Raster(
diff --git a/gm/3d.cpp b/gm/3d.cpp
index d9938d1..51c1c29 100644
--- a/gm/3d.cpp
+++ b/gm/3d.cpp
@@ -8,8 +8,6 @@
 #include "gm/gm.h"
 #include "include/core/SkCanvas.h"
 #include "include/core/SkData.h"
-#include "include/core/SkPicture.h"
-#include "include/core/SkPictureRecorder.h"
 
 #include <cmath>
 
@@ -44,6 +42,9 @@
     return viewport * perspective * camera * model * inv(viewport);
 }
 
+#include "include/core/SkPicture.h"
+#include "include/core/SkPictureRecorder.h"
+
 static void do_draw(SkCanvas* canvas, SkColor color) {
     SkAutoCanvasRestore acr(canvas, true);
 
@@ -72,4 +73,10 @@
 
     auto pic = recorder.finishRecordingAsPicture();
     real_canvas->drawPicture(pic);
+
+    if ((false)) {
+        auto data = pic->serialize();
+        auto pic2 = SkPicture::MakeFromData(data.get());
+        real_canvas->drawPicture(pic2);
+    }
 }
diff --git a/include/core/SkPicture.h b/include/core/SkPicture.h
index a81bd735..343d63d 100644
--- a/include/core/SkPicture.h
+++ b/include/core/SkPicture.h
@@ -162,10 +162,6 @@
         may be used to provide user context to procs->fPictureProc; procs->fPictureProc
         is called with a pointer to SkPicture and user context.
 
-        The default behavior for serializing SkImages is to encode a nullptr. Should
-        clients want to, for example, encode these SkImages as PNGs so they can be
-        deserialized, they must provide SkSerialProcs with the fImageProc set to do so.
-
         @param procs  custom serial data encoders; may be nullptr
         @return       storage containing serialized SkPicture
 
@@ -180,10 +176,6 @@
         may be used to provide user context to procs->fPictureProc; procs->fPictureProc
         is called with a pointer to SkPicture and user context.
 
-        The default behavior for serializing SkImages is to encode a nullptr. Should
-        clients want to, for example, encode these SkImages as PNGs so they can be
-        deserialized, they must provide SkSerialProcs with the fImageProc set to do so.
-
         @param stream  writable serial data stream
         @param procs   custom serial data encoders; may be nullptr
 
diff --git a/modules/skottie/src/SkottieTool.cpp b/modules/skottie/src/SkottieTool.cpp
index 8f4920b..30a5651 100644
--- a/modules/skottie/src/SkottieTool.cpp
+++ b/modules/skottie/src/SkottieTool.cpp
@@ -9,7 +9,6 @@
 #include "include/core/SkGraphics.h"
 #include "include/core/SkPicture.h"
 #include "include/core/SkPictureRecorder.h"
-#include "include/core/SkSerialProcs.h"
 #include "include/core/SkStream.h"
 #include "include/core/SkSurface.h"
 #include "include/encode/SkPngEncoder.h"
@@ -20,7 +19,6 @@
 #include "modules/skresources/include/SkResources.h"
 #include "src/core/SkOSFile.h"
 #include "src/core/SkTaskGroup.h"
-#include "src/image/SkImage_Base.h"
 #include "src/utils/SkOSPath.h"
 #include "tools/flags/CommandLineFlags.h"
 
@@ -273,12 +271,7 @@
         auto stream = make_file_stream(frame_index, "skp");
 
         if (frame && stream) {
-            SkSerialProcs sProcs;
-            sProcs.fImageProc = [](SkImage* img, void*) -> sk_sp<SkData> {
-                return SkPngEncoder::Encode(as_IB(img)->directContext(), img,
-                                            SkPngEncoder::Options{});
-            };
-            frame->serialize(stream.get(), &sProcs);
+            frame->serialize(stream.get());
         }
     }
 
diff --git a/relnotes/skpicture_png.md b/relnotes/skpicture_png.md
deleted file mode 100644
index 6f3e88a..0000000
--- a/relnotes/skpicture_png.md
+++ /dev/null
@@ -1,2 +0,0 @@
-`SkPicture`s no longer serialize `SkImage`s to PNG encoded data by default. Clients who wish to
-preserve this should make use of `SkSerialProcs`, specifically the `fImageProc` field.
\ No newline at end of file
diff --git a/src/core/SkGlyph.cpp b/src/core/SkGlyph.cpp
index ad51f8f..4e69ff8 100644
--- a/src/core/SkGlyph.cpp
+++ b/src/core/SkGlyph.cpp
@@ -63,8 +63,6 @@
     }
 
     sk_sp<SkPicture> picture = drawable->makePictureSnapshot();
-    // These drawables should not have SkImages, SkTypefaces or SkPictures inside of them, so
-    // the default SkSerialProcs are sufficient.
     sk_sp<SkData> data = picture->serialize();
 
     // If the picture is too big, or there is no picture, then drop by sending an empty byte array.
diff --git a/src/core/SkPicture.cpp b/src/core/SkPicture.cpp
index cf2a258..7ccf3a3 100644
--- a/src/core/SkPicture.cpp
+++ b/src/core/SkPicture.cpp
@@ -319,7 +319,7 @@
     buffer.writeUInt(info.getVersion());
     buffer.writeRect(info.fCullRect);
 
-    if (auto custom = custom_serialize(picture.get(), buffer.serialProcs())) {
+    if (auto custom = custom_serialize(picture.get(), buffer.fProcs)) {
         int32_t size = SkToS32(custom->size());
         buffer.write32(-size);    // negative for custom format
         buffer.writePad32(custom->data(), size);
diff --git a/src/core/SkWriteBuffer.cpp b/src/core/SkWriteBuffer.cpp
index efe610d..0565b2e 100644
--- a/src/core/SkWriteBuffer.cpp
+++ b/src/core/SkWriteBuffer.cpp
@@ -8,13 +8,16 @@
 #include "src/core/SkWriteBuffer.h"
 
 #include "include/core/SkAlphaType.h"
+#include "include/core/SkBitmap.h"
 #include "include/core/SkData.h"
 #include "include/core/SkFlattenable.h"
 #include "include/core/SkImage.h"
 #include "include/core/SkPoint.h"
 #include "include/core/SkPoint3.h"
 #include "include/core/SkRect.h"
+#include "include/core/SkStream.h"
 #include "include/core/SkTypeface.h"
+#include "include/encode/SkPngEncoder.h"
 #include "include/private/base/SkAssert.h"
 #include "include/private/base/SkTFitsIn.h"
 #include "include/private/base/SkTo.h"
@@ -162,9 +165,21 @@
         return data;
     }
     // Check to see if the image's source was an encoded block of data.
-    // If so, just use that. Otherwise, return nullptr. Clients really should be providing
-    // an ImageProc to encode images if that functionality is necessary.
-    return image->refEncodedData();
+    // If so, just use that.
+    data = image->refEncodedData();
+    if (data) {
+        return data;
+    }
+    SkBitmap bm;
+    auto ib = as_IB(image);
+    if (!ib->getROPixels(ib->directContext(), &bm)) {
+        return nullptr;
+    }
+    SkDynamicMemoryWStream stream;
+    if (SkPngEncoder::Encode(&stream, bm.pixmap(), SkPngEncoder::Options())) {
+        return stream.detachAsData();
+    }
+    return nullptr;
 }
 
 static sk_sp<SkData> serialize_mipmap(const SkMipmap* mipmap, SkSerialProcs procs) {
diff --git a/src/core/SkWriteBuffer.h b/src/core/SkWriteBuffer.h
index da03f8d..4fd0cfa 100644
--- a/src/core/SkWriteBuffer.h
+++ b/src/core/SkWriteBuffer.h
@@ -84,11 +84,10 @@
     virtual void writeImage(const SkImage*) = 0;
     virtual void writeTypeface(SkTypeface* typeface) = 0;
     virtual void writePaint(const SkPaint& paint) = 0;
-
-    const SkSerialProcs& serialProcs() const { return fProcs; }
-
 protected:
     SkSerialProcs   fProcs;
+
+    friend class SkPicturePriv; // fProcs
 };
 
 /**
diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp
index 9592ffc..4744b57 100644
--- a/tests/ImageFilterTest.cpp
+++ b/tests/ImageFilterTest.cpp
@@ -29,7 +29,6 @@
 #include "include/core/SkRefCnt.h"
 #include "include/core/SkSamplingOptions.h"
 #include "include/core/SkScalar.h"
-#include "include/core/SkSerialProcs.h"
 #include "include/core/SkShader.h"
 #include "include/core/SkSize.h"
 #include "include/core/SkSurface.h"
@@ -39,7 +38,6 @@
 #include "include/effects/SkGradientShader.h"
 #include "include/effects/SkImageFilters.h"
 #include "include/effects/SkPerlinNoiseShader.h"
-#include "include/encode/SkPngEncoder.h"
 #include "include/gpu/GpuTypes.h"
 #include "include/gpu/GrTypes.h"
 #include "include/private/base/SkTArray.h"
@@ -1659,11 +1657,7 @@
     sk_sp<SkImage> image(surface->makeImageSnapshot());
     sk_sp<SkImageFilter> filter(SkImageFilters::Image(std::move(image), SkFilterMode::kNearest));
 
-    SkSerialProcs sProcs;
-    sProcs.fImageProc = [](SkImage* img, void*) -> sk_sp<SkData> {
-        return SkPngEncoder::Encode(as_IB(img)->directContext(), img, SkPngEncoder::Options{});
-    };
-    sk_sp<SkData> data(filter->serialize(&sProcs));
+    sk_sp<SkData> data(filter->serialize());
     sk_sp<SkImageFilter> unflattenedFilter = SkImageFilter::Deserialize(data->data(), data->size());
     REPORTER_ASSERT(reporter, unflattenedFilter);
 
diff --git a/tests/PictureTest.cpp b/tests/PictureTest.cpp
index f877f11..5d3c466 100644
--- a/tests/PictureTest.cpp
+++ b/tests/PictureTest.cpp
@@ -69,7 +69,7 @@
     recorder.beginRecording(0, 0);
     sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
     SkDynamicMemoryWStream stream;
-    picture->serialize(&stream, nullptr);  // default SkSerialProcs
+    picture->serialize(&stream);
 }
 #endif
 
@@ -513,7 +513,7 @@
     canvas->drawString("Q", 0, 10, font, SkPaint());
     sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
     SkDynamicMemoryWStream stream;
-    picture->serialize(&stream, nullptr);  // default SkSerialProcs
+    picture->serialize(&stream);
 }
 
 DEF_TEST(Picture, reporter) {
@@ -708,7 +708,7 @@
 
     sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
     SkDynamicMemoryWStream wstream;
-    picture->serialize(&wstream, nullptr);  // default SkSerialProcs
+    picture->serialize(&wstream);
 
     std::unique_ptr<SkStream> rstream(wstream.detachAsStream());
     sk_sp<SkPicture> deserializedPicture(SkPicture::MakeFromStream(rstream.get()));
@@ -785,7 +785,7 @@
     auto pic = rec.finishRecordingAsPicture();
     REPORTER_ASSERT(reporter, pic);
 
-    auto data = pic->serialize(); // explicitly testing the default SkSerialProcs
+    auto data = pic->serialize();
     REPORTER_ASSERT(reporter, data);
 
     auto pic2 = SkPicture::MakeFromData(data->data(), data->size());
diff --git a/tests/SerializationTest.cpp b/tests/SerializationTest.cpp
index 588c9a7..2f638ae 100644
--- a/tests/SerializationTest.cpp
+++ b/tests/SerializationTest.cpp
@@ -732,17 +732,17 @@
         // Valid case with non-empty array:
         {
             unsigned char data[kArraySize] = { 1, 2, 3 };
-	    SkBinaryWriteBuffer writer({});
-	    writer.writeByteArray(data, kArraySize);
-	    SkAutoMalloc buf(writer.bytesWritten());
-	    writer.writeToMemory(buf.get());
+    SkBinaryWriteBuffer writer({});
+    writer.writeByteArray(data, kArraySize);
+    SkAutoMalloc buf(writer.bytesWritten());
+    writer.writeToMemory(buf.get());
 
-	    SkReadBuffer reader(buf.get(), writer.bytesWritten());
-	    size_t len = ~0;
-	    const void* arr = reader.skipByteArray(&len);
-	    REPORTER_ASSERT(reporter, arr);
-	    REPORTER_ASSERT(reporter, len == kArraySize);
-	    REPORTER_ASSERT(reporter, memcmp(arr, data, len) == 0);
+    SkReadBuffer reader(buf.get(), writer.bytesWritten());
+    size_t len = ~0;
+    const void* arr = reader.skipByteArray(&len);
+    REPORTER_ASSERT(reporter, arr);
+    REPORTER_ASSERT(reporter, len == kArraySize);
+    REPORTER_ASSERT(reporter, memcmp(arr, data, len) == 0);
         }
 
         // Writing a zero length array (can be detected as valid by non-nullptr return):
diff --git a/tools/dump_record.cpp b/tools/dump_record.cpp
index 0b35691..a3f7252 100644
--- a/tools/dump_record.cpp
+++ b/tools/dump_record.cpp
@@ -8,19 +8,15 @@
 #include "include/core/SkBitmap.h"
 #include "include/core/SkPicture.h"
 #include "include/core/SkPictureRecorder.h"
-#include "include/core/SkSerialProcs.h"
 #include "include/core/SkStream.h"
-#include "include/encode/SkPngEncoder.h"
 #include "src/base/SkTime.h"
 #include "src/core/SkPicturePriv.h"
 #include "src/core/SkRecord.h"
 #include "src/core/SkRecordDraw.h"
 #include "src/core/SkRecordOpts.h"
 #include "src/core/SkRecorder.h"
-#include "src/image/SkImage_Base.h"
 #include "tools/flags/CommandLineFlags.h"
-
-#include <cstdio>
+#include <stdio.h>
 
 static DEFINE_string2(skps, r, "", ".SKPs to dump.");
 static DEFINE_string(match, "", "The usual filters on file names to dump.");
@@ -196,11 +192,7 @@
                          nullptr);
             sk_sp<SkPicture> dst(r.finishRecordingAsPicture());
             SkFILEWStream ostream(FLAGS_write[0]);
-            SkSerialProcs sProcs;
-            sProcs.fImageProc = [](SkImage* img, void*) -> sk_sp<SkData> {
-                return SkPngEncoder::Encode(nullptr, img, SkPngEncoder::Options{});
-            };
-            dst->serialize(&ostream, &sProcs);
+            dst->serialize(&ostream);
         }
     }
 
diff --git a/tools/fiddle/all_examples.cpp b/tools/fiddle/all_examples.cpp
index 79072cf..0d1acef 100644
--- a/tools/fiddle/all_examples.cpp
+++ b/tools/fiddle/all_examples.cpp
@@ -711,6 +711,7 @@
 #include "docs/examples/Path_transform_2.cpp"
 #include "docs/examples/Path_updateBoundsCache.cpp"
 #include "docs/examples/Path_writeToMemory.cpp"
+#include "docs/examples/Picture_008.cpp"
 #include "docs/examples/Picture_AbortCallback_abort.cpp"
 #include "docs/examples/Picture_MakeFromData.cpp"
 #include "docs/examples/Picture_MakeFromStream.cpp"
diff --git a/tools/viewer/Viewer.cpp b/tools/viewer/Viewer.cpp
index cb9584b..42dde2e 100644
--- a/tools/viewer/Viewer.cpp
+++ b/tools/viewer/Viewer.cpp
@@ -24,12 +24,10 @@
 #include "include/core/SkPictureRecorder.h"
 #include "include/core/SkRect.h"
 #include "include/core/SkSamplingOptions.h"
-#include "include/core/SkSerialProcs.h"
 #include "include/core/SkStream.h"
 #include "include/core/SkSurface.h"
 #include "include/core/SkSurfaceProps.h"
 #include "include/core/SkTextBlob.h"
-#include "include/encode/SkPngEncoder.h"
 #include "include/gpu/GrDirectContext.h"
 #include "include/private/base/SkDebug.h"
 #include "include/private/base/SkTPin.h"
@@ -48,7 +46,6 @@
 #include "src/core/SkStringUtils.h"
 #include "src/core/SkTaskGroup.h"
 #include "src/core/SkTextBlobPriv.h"
-#include "src/image/SkImage_Base.h"
 #include "src/sksl/SkSLCompiler.h"
 #include "src/sksl/SkSLString.h"
 #include "src/text/GlyphRun.h"
@@ -1594,14 +1591,6 @@
     Viewer::SkFontFields* fFontOverrides;
 };
 
-static SkSerialProcs serial_procs_using_png() {
-    SkSerialProcs sProcs;
-    sProcs.fImageProc = [](SkImage* img, void*) -> sk_sp<SkData> {
-        return SkPngEncoder::Encode(as_IB(img)->directContext(), img, SkPngEncoder::Options{});
-    };
-    return sProcs;
-}
-
 void Viewer::drawSlide(SkSurface* surface) {
     if (fCurrentSlide < 0) {
         return;
@@ -1628,8 +1617,7 @@
         fSlides[fCurrentSlide]->draw(recorderCanvas);
         sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
         SkFILEWStream stream("sample_app.skp");
-        SkSerialProcs sProcs = serial_procs_using_png();
-        picture->serialize(&stream, &sProcs);
+        picture->serialize(&stream);
         fSaveToSKP = false;
     }
 
@@ -1728,8 +1716,7 @@
 
     if (recorderRestoreCanvas) {
         sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
-        SkSerialProcs sProcs = serial_procs_using_png();
-        auto data = picture->serialize(&sProcs);
+        auto data = picture->serialize();
         slideCanvas = recorderRestoreCanvas;
         slideCanvas->drawPicture(SkPicture::MakeFromData(data.get()));
     }