diff --git a/bench/ETCBitmapBench.cpp b/bench/ETCBitmapBench.cpp
index 1b06112..305f492 100644
--- a/bench/ETCBitmapBench.cpp
+++ b/bench/ETCBitmapBench.cpp
@@ -73,6 +73,9 @@
     return newData;
 }
 
+// Defined in SkImageDecoder_ktx.cpp
+extern SkImageGenerator* decoder_image_generator(SkData*);
+
 // This is the base class for all of the benches in this file. In general
 // the ETC1 benches should all be working on the same data. Due to the
 // simplicity of the PKM file, that data is the 128x128 mandrill etc1
@@ -151,10 +154,10 @@
         }
 
         if (fDecompress) {
-            SkAutoTDelete<SkImageGenerator> gen(SkImageGenerator::NewFromEncoded(fPKMData));
+            SkAutoTDelete<SkImageGenerator> gen(decoder_image_generator(fPKMData));
             gen->generateBitmap(&fBitmap);
         } else {
-            fImage.reset(SkImage::NewFromEncoded(fPKMData));
+            fImage.reset(SkImage::NewFromGenerator(decoder_image_generator(fPKMData)));
         }
     }
 
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
index e5d18cd..366d8f8 100644
--- a/dm/DMSrcSink.cpp
+++ b/dm/DMSrcSink.cpp
@@ -40,11 +40,6 @@
             " into multiple pages");
 DEFINE_bool(RAW_threading, true, "Allow RAW decodes to run on multiple threads?");
 
-static bool lazy_decode_bitmap(const void* src, size_t size, SkBitmap* dst) {
-    SkAutoTUnref<SkData> encoded(SkData::NewWithCopy(src, size));
-    return encoded && SkDEPRECATED_InstallDiscardablePixelRef(encoded, dst);
-}
-
 namespace DM {
 
 GMSrc::GMSrc(skiagm::GMRegistry::Factory factory) : fFactory(factory) {}
@@ -805,7 +800,7 @@
     if (!stream) {
         return SkStringPrintf("Couldn't read %s.", fPath.c_str());
     }
-    SkAutoTUnref<SkPicture> pic(SkPicture::CreateFromStream(stream, &lazy_decode_bitmap));
+    SkAutoTUnref<SkPicture> pic(SkPicture::CreateFromStream(stream));
     if (!pic) {
         return SkStringPrintf("Couldn't decode %s as a picture.", fPath.c_str());
     }
@@ -1178,7 +1173,7 @@
     SkDynamicMemoryWStream wStream;
     pic->serialize(&wStream);
     SkAutoTDelete<SkStream> rStream(wStream.detachAsStream());
-    SkAutoTUnref<SkPicture> deserialized(SkPicture::CreateFromStream(rStream, &lazy_decode_bitmap));
+    SkAutoTUnref<SkPicture> deserialized(SkPicture::CreateFromStream(rStream));
 
     return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas) {
         canvas->drawPicture(deserialized);
diff --git a/gyp/codec.gyp b/gyp/codec.gyp
index d4904da..08750e2 100644
--- a/gyp/codec.gyp
+++ b/gyp/codec.gyp
@@ -57,6 +57,7 @@
         '../src/codec/SkWebpCodec.cpp',
 
         '../src/codec/SkCodecImageGenerator.cpp',
+        '../src/ports/SkImageGenerator_skia.cpp',
       ],
       'direct_dependent_settings': {
         'include_dirs': [
diff --git a/gyp/images.gyp b/gyp/images.gyp
index 8dbca85..8c5b0a7 100644
--- a/gyp/images.gyp
+++ b/gyp/images.gyp
@@ -75,8 +75,6 @@
         '../src/images/SkScaledBitmapSampler.cpp',
         '../src/images/SkScaledBitmapSampler.h',
 
-        '../src/ports/SkImageGenerator_skia.cpp',
-
         '../src/ports/SkImageDecoder_CG.cpp',
         '../src/ports/SkImageDecoder_WIC.cpp',
       ],
diff --git a/gyp/tools.gyp b/gyp/tools.gyp
index 4b89427..1e6eb52 100644
--- a/gyp/tools.gyp
+++ b/gyp/tools.gyp
@@ -83,7 +83,6 @@
          ],
          'dependencies': [
             'flags.gyp:flags',
-            'lazy_decode_bitmap',
             'skia_lib.gyp:skia_lib',
          ],
     },
@@ -267,20 +266,6 @@
       ],
     },
     {
-        'target_name': 'lazy_decode_bitmap',
-        'type': 'static_library',
-        'sources': [ '../tools/LazyDecodeBitmap.cpp' ],
-        'include_dirs': [
-            '../include/private',
-            '../src/core',
-            '../src/lazy',
-        ],
-        'dependencies': [
-            'flags.gyp:flags',
-            'skia_lib.gyp:skia_lib'
-        ],
-    },
-    {
         'target_name': 'get_images_from_skps',
         'type': 'executable',
         'sources': [
@@ -303,7 +288,6 @@
         '../src/images',
       ],
       'dependencies': [
-        'lazy_decode_bitmap',
         'flags.gyp:flags',
         'skia_lib.gyp:skia_lib',
       ],
@@ -345,7 +329,6 @@
         '../src/core/',
       ],
       'dependencies': [
-        'lazy_decode_bitmap',
         'effects.gyp:effects',
         'flags.gyp:flags',
         'images.gyp:images',
@@ -379,7 +362,6 @@
         '../tools/pinspect.cpp',
       ],
       'dependencies': [
-        'lazy_decode_bitmap',
         'flags.gyp:flags',
         'skia_lib.gyp:skia_lib',
       ],
diff --git a/include/core/SkPicture.h b/include/core/SkPicture.h
index 720747e..7c8c187 100644
--- a/include/core/SkPicture.h
+++ b/include/core/SkPicture.h
@@ -54,8 +54,19 @@
      *  @return A new SkPicture representing the serialized data, or NULL if the stream is
      *          invalid.
      */
-    static SkPicture* CreateFromStream(SkStream*,
-                                       InstallPixelRefProc proc = &SkImageDecoder::DecodeMemory);
+    static SkPicture* CreateFromStream(SkStream*, InstallPixelRefProc proc);
+
+    /**
+     *  Recreate a picture that was serialized into a stream.
+     *
+     *  Any serialized images in the stream will be passed to
+     *  SkImageGenerator::NewFromEncoded.
+     *
+     *  @param SkStream Serialized picture data. Ownership is unchanged by this call.
+     *  @return A new SkPicture representing the serialized data, or NULL if the stream is
+     *          invalid.
+     */
+    static SkPicture* CreateFromStream(SkStream*);
 
     /**
      *  Recreate a picture that was serialized into a buffer. If the creation requires bitmap
diff --git a/public.bzl b/public.bzl
index f687a42..6239254 100644
--- a/public.bzl
+++ b/public.bzl
@@ -373,8 +373,6 @@
         "tests/*.h",
         "tools/CrashHandler.cpp",
         "tools/CrashHandler.h",
-        "tools/LazyDecodeBitmap.cpp",
-        "tools/LazyDecodeBitmap.h",
         "tools/ProcStats.cpp",
         "tools/ProcStats.h",
         "tools/Resources.cpp",
diff --git a/src/core/SkPicture.cpp b/src/core/SkPicture.cpp
index 8247336..04f2f93 100644
--- a/src/core/SkPicture.cpp
+++ b/src/core/SkPicture.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "SkAtomics.h"
+#include "SkImageGenerator.h"
 #include "SkMessageBus.h"
 #include "SkPicture.h"
 #include "SkPictureData.h"
@@ -138,6 +139,16 @@
     return r.endRecording();
 }
 
+static bool default_install(const void* src, size_t length, SkBitmap* dst) {
+    SkAutoTUnref<SkData> encoded(SkData::NewWithCopy(src, length));
+    return encoded && SkDEPRECATED_InstallDiscardablePixelRef(
+            SkImageGenerator::NewFromEncoded(encoded), dst);
+}
+
+SkPicture* SkPicture::CreateFromStream(SkStream* stream) {
+    return CreateFromStream(stream, &default_install, nullptr);
+}
+
 SkPicture* SkPicture::CreateFromStream(SkStream* stream, InstallPixelRefProc proc) {
     return CreateFromStream(stream, proc, nullptr);
 }
diff --git a/src/images/SkImageDecoder_ktx.cpp b/src/images/SkImageDecoder_ktx.cpp
index a95ab6f..019fa97 100644
--- a/src/images/SkImageDecoder_ktx.cpp
+++ b/src/images/SkImageDecoder_ktx.cpp
@@ -7,6 +7,7 @@
 
 #include "SkColorPriv.h"
 #include "SkImageDecoder.h"
+#include "SkImageGenerator.h"
 #include "SkPixelRef.h"
 #include "SkScaledBitmapSampler.h"
 #include "SkStream.h"
@@ -328,3 +329,101 @@
 static SkImageDecoder_DecodeReg gReg(sk_libktx_dfactory);
 static SkImageDecoder_FormatReg gFormatReg(get_format_ktx);
 static SkImageEncoder_EncodeReg gEReg(sk_libktx_efactory);
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// Old implementation of SkImageGenerator::NewFromEncoded which uses SkImageDecoder.
+// Here because it is only needed by DM and tests for Ktx.
+class BareMemoryAllocator : public SkBitmap::Allocator {
+    const SkImageInfo   fInfo;
+    void* const         fMemory;
+    const size_t        fRowBytes;
+
+public:
+    BareMemoryAllocator(const SkImageInfo& info, void* memory, size_t rowBytes)
+        : fInfo(info), fMemory(memory), fRowBytes(rowBytes)
+    {}
+
+protected:
+    bool allocPixelRef(SkBitmap* bm, SkColorTable* ctable) override {
+        const SkImageInfo bmi = bm->info();
+        if (bmi.width() != fInfo.width() || bmi.height() != fInfo.height() ||
+            bmi.colorType() != fInfo.colorType())
+        {
+            return false;
+        }
+        return bm->installPixels(bmi, fMemory, fRowBytes, ctable, nullptr, nullptr);
+    }
+};
+
+class SkImageDecoderGenerator : public SkImageGenerator {
+    const SkImageInfo               fInfo;
+    SkAutoTDelete<SkImageDecoder>   fDecoder;
+    SkAutoTUnref<SkData>            fData;
+
+public:
+    SkImageDecoderGenerator(const SkImageInfo& info, SkImageDecoder* decoder, SkData* data)
+        : INHERITED(info), fInfo(info), fDecoder(decoder), fData(SkRef(data))
+    {}
+
+protected:
+    SkData* onRefEncodedData(SK_REFENCODEDDATA_CTXPARAM) override {
+        return SkRef(fData.get());
+    }
+    bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes,
+                     SkPMColor ctableEntries[], int* ctableCount) override {
+        SkMemoryStream stream(fData->data(), fData->size(), false);
+        SkAutoTUnref<BareMemoryAllocator> allocator(
+                new BareMemoryAllocator(info, pixels, rowBytes));
+        fDecoder->setAllocator(allocator);
+        fDecoder->setRequireUnpremultipliedColors(kUnpremul_SkAlphaType == info.alphaType());
+
+        SkBitmap bm;
+        const SkImageDecoder::Result result = fDecoder->decode(&stream, &bm, info.colorType(),
+                                                               SkImageDecoder::kDecodePixels_Mode);
+        if (SkImageDecoder::kFailure == result) {
+            return false;
+        }
+
+        SkASSERT(info.colorType() == bm.info().colorType());
+
+        if (kIndex_8_SkColorType == info.colorType()) {
+            SkASSERT(ctableEntries);
+
+            SkColorTable* ctable = bm.getColorTable();
+            if (nullptr == ctable) {
+                return false;
+            }
+            const int count = ctable->count();
+            memcpy(ctableEntries, ctable->readColors(), count * sizeof(SkPMColor));
+            *ctableCount = count;
+        }
+        return true;
+    }
+
+    bool onGetYUV8Planes(SkISize sizes[3], void* planes[3], size_t rowBytes[3],
+                         SkYUVColorSpace* colorSpace) override {
+        SkMemoryStream stream(fData->data(), fData->size(), false);
+        return fDecoder->decodeYUV8Planes(&stream, sizes, planes, rowBytes, colorSpace);
+    }
+
+private:
+    typedef SkImageGenerator INHERITED;
+};
+
+SkImageGenerator* decoder_image_generator(SkData* data) {
+    SkMemoryStream stream(data->data(), data->size(), false);
+    SkImageDecoder* decoder = SkImageDecoder::Factory(&stream);
+    if (nullptr == decoder) {
+        return nullptr;
+    }
+
+    SkBitmap bm;
+    stream.rewind();
+    if (!decoder->decode(&stream, &bm, kUnknown_SkColorType, SkImageDecoder::kDecodeBounds_Mode)) {
+        delete decoder;
+        return nullptr;
+    }
+
+    return new SkImageDecoderGenerator(bm.info(), decoder, data);
+}
+
diff --git a/src/ports/SkImageGenerator_skia.cpp b/src/ports/SkImageGenerator_skia.cpp
index 8dbad55..b6ddee9 100644
--- a/src/ports/SkImageGenerator_skia.cpp
+++ b/src/ports/SkImageGenerator_skia.cpp
@@ -6,100 +6,8 @@
  */
 
 #include "SkData.h"
-#include "SkImageDecoder.h"
-#include "SkImageGenerator.h"
-#include "SkStream.h"
-
-class BareMemoryAllocator : public SkBitmap::Allocator {
-    const SkImageInfo   fInfo;
-    void* const         fMemory;
-    const size_t        fRowBytes;
-
-public:
-    BareMemoryAllocator(const SkImageInfo& info, void* memory, size_t rowBytes)
-        : fInfo(info), fMemory(memory), fRowBytes(rowBytes)
-    {}
-
-protected:
-    bool allocPixelRef(SkBitmap* bm, SkColorTable* ctable) override {
-        const SkImageInfo bmi = bm->info();
-        if (bmi.width() != fInfo.width() || bmi.height() != fInfo.height() ||
-            bmi.colorType() != fInfo.colorType())
-        {
-            return false;
-        }
-        return bm->installPixels(bmi, fMemory, fRowBytes, ctable, nullptr, nullptr);
-    }
-};
-
-class SkImageDecoderGenerator : public SkImageGenerator {
-    const SkImageInfo               fInfo;
-    SkAutoTDelete<SkImageDecoder>   fDecoder;
-    SkAutoTUnref<SkData>            fData;
-
-public:
-    SkImageDecoderGenerator(const SkImageInfo& info, SkImageDecoder* decoder, SkData* data)
-        : INHERITED(info), fInfo(info), fDecoder(decoder), fData(SkRef(data))
-    {}
-
-protected:
-    SkData* onRefEncodedData(SK_REFENCODEDDATA_CTXPARAM) override {
-        return SkRef(fData.get());
-    }
-    bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes,
-                     SkPMColor ctableEntries[], int* ctableCount) override {
-        SkMemoryStream stream(fData->data(), fData->size(), false);
-        SkAutoTUnref<BareMemoryAllocator> allocator(
-                new BareMemoryAllocator(info, pixels, rowBytes));
-        fDecoder->setAllocator(allocator);
-        fDecoder->setRequireUnpremultipliedColors(kUnpremul_SkAlphaType == info.alphaType());
-
-        SkBitmap bm;
-        const SkImageDecoder::Result result = fDecoder->decode(&stream, &bm, info.colorType(),
-                                                               SkImageDecoder::kDecodePixels_Mode);
-        if (SkImageDecoder::kFailure == result) {
-            return false;
-        }
-
-        SkASSERT(info.colorType() == bm.info().colorType());
-
-        if (kIndex_8_SkColorType == info.colorType()) {
-            SkASSERT(ctableEntries);
-
-            SkColorTable* ctable = bm.getColorTable();
-            if (nullptr == ctable) {
-                return false;
-            }
-            const int count = ctable->count();
-            memcpy(ctableEntries, ctable->readColors(), count * sizeof(SkPMColor));
-            *ctableCount = count;
-        }
-        return true;
-    }
-
-    bool onGetYUV8Planes(SkISize sizes[3], void* planes[3], size_t rowBytes[3],
-                         SkYUVColorSpace* colorSpace) override {
-        SkMemoryStream stream(fData->data(), fData->size(), false);
-        return fDecoder->decodeYUV8Planes(&stream, sizes, planes, rowBytes, colorSpace);
-    }
-
-private:
-    typedef SkImageGenerator INHERITED;
-};
+#include "SkCodecImageGenerator.h"
 
 SkImageGenerator* SkImageGenerator::NewFromEncodedImpl(SkData* data) {
-    SkMemoryStream stream(data->data(), data->size(), false);
-    SkImageDecoder* decoder = SkImageDecoder::Factory(&stream);
-    if (nullptr == decoder) {
-        return nullptr;
-    }
-
-    SkBitmap bm;
-    stream.rewind();
-    if (!decoder->decode(&stream, &bm, kUnknown_SkColorType, SkImageDecoder::kDecodeBounds_Mode)) {
-        delete decoder;
-        return nullptr;
-    }
-
-    return new SkImageDecoderGenerator(bm.info(), decoder, data);
+    return SkCodecImageGenerator::NewFromEncodedCodec(data);
 }
diff --git a/tests/KtxTest.cpp b/tests/KtxTest.cpp
index 84d162c..99bae83 100644
--- a/tests/KtxTest.cpp
+++ b/tests/KtxTest.cpp
@@ -143,6 +143,9 @@
     }
 }
 
+// For KtxReexportPKM, below. Defined in SkImageDecoder_ktx.cpp
+extern SkImageGenerator* decoder_image_generator(SkData*);
+
 /**
  * Finally, make sure that if we get ETC1 data from a PKM file that we can then
  * accurately write it out into a KTX file (i.e. transferring the ETC1 data from
@@ -160,7 +163,7 @@
     }
 
     bool installDiscardablePixelRefSuccess =
-        SkDEPRECATED_InstallDiscardablePixelRef(fileData, &etcBitmap);
+        SkDEPRECATED_InstallDiscardablePixelRef(decoder_image_generator(fileData), &etcBitmap);
     if (!installDiscardablePixelRefSuccess) {
         ERRORF(reporter, "failed to create discardable pixelRef from KTX file");
         return;
diff --git a/tests/PictureTest.cpp b/tests/PictureTest.cpp
index 3d05a82..448e079 100644
--- a/tests/PictureTest.cpp
+++ b/tests/PictureTest.cpp
@@ -17,6 +17,7 @@
 #include "SkImageEncoder.h"
 #include "SkImageGenerator.h"
 #include "SkLayerInfo.h"
+#include "SkMD5.h"
 #include "SkPaint.h"
 #include "SkPicture.h"
 #include "SkPictureRecorder.h"
@@ -871,7 +872,18 @@
                             SkGetLastErrorString());
 }
 
-static void test_bitmap_with_encoded_data(skiatest::Reporter* reporter) {
+static void md5(const SkBitmap& bm, SkMD5::Digest* digest) {
+    SkAutoLockPixels autoLockPixels(bm);
+    SkASSERT(bm.getPixels());
+    SkMD5 md5;
+    size_t rowLen = bm.info().bytesPerPixel() * bm.width();
+    for (int y = 0; y < bm.height(); ++y) {
+        md5.update(static_cast<uint8_t*>(bm.getAddr(0, y)), rowLen);
+    }
+    md5.finish(*digest);
+}
+
+DEF_TEST(Picture_EncodedData, reporter) {
     // Create a bitmap that will be encoded.
     SkBitmap original;
     make_bm(&original, 100, 100, SK_ColorBLUE, true);
@@ -891,6 +903,7 @@
     SkAutoDataUnref picture1(serialized_picture_from_bitmap(original));
     SkAutoDataUnref picture2(serialized_picture_from_bitmap(bm));
     REPORTER_ASSERT(reporter, picture1->equals(picture2));
+
     // Now test that a parse error was generated when trying to create a new SkPicture without
     // providing a function to decode the bitmap.
     ErrorContext context;
@@ -903,6 +916,24 @@
     REPORTER_ASSERT(reporter, pictureFromStream.get() != nullptr);
     SkClearLastError();
     SkSetErrorCallback(nullptr, nullptr);
+
+    // Test that using the version of CreateFromStream that just takes a stream also decodes the
+    // bitmap. Drawing this picture should look exactly like the original bitmap.
+    SkMD5::Digest referenceDigest;
+    md5(original, &referenceDigest);
+
+    SkBitmap dst;
+    dst.allocPixels(original.info());
+    dst.eraseColor(SK_ColorRED);
+    SkCanvas canvas(dst);
+
+    pictureStream.rewind();
+    pictureFromStream.reset(SkPicture::CreateFromStream(&pictureStream));
+    canvas.drawPicture(pictureFromStream.get());
+
+    SkMD5::Digest digest2;
+    md5(dst, &digest2);
+    REPORTER_ASSERT(reporter, referenceDigest == digest2);
 }
 
 static void test_clip_bound_opt(skiatest::Reporter* reporter) {
@@ -1174,7 +1205,6 @@
     test_has_text(reporter);
     test_images_are_found_by_willPlayBackBitmaps(reporter);
     test_analysis(reporter);
-    test_bitmap_with_encoded_data(reporter);
     test_clip_bound_opt(reporter);
     test_clip_expansion(reporter);
     test_hierarchical(reporter);
diff --git a/tools/LazyDecodeBitmap.cpp b/tools/LazyDecodeBitmap.cpp
deleted file mode 100644
index d41889b..0000000
--- a/tools/LazyDecodeBitmap.cpp
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2013 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "LazyDecodeBitmap.h"
-
-#include "SkData.h"
-#include "SkDiscardableMemoryPool.h"
-#include "SkImageGeneratorPriv.h"
-#include "SkForceLinking.h"
-
-#include "SkCommandLineFlags.h"
-
-__SK_FORCE_IMAGE_DECODER_LINKING;
-
-DEFINE_bool(useVolatileCache, false, "Use a volatile cache for deferred image decoding pixels. "
-            "Only meaningful if --deferImageDecoding is set to true and the platform has an "
-            "implementation.");
-
-//  Fits SkPicture::InstallPixelRefProc call signature.
-//  Used in SkPictureData::CreateFromStream
-bool sk_tools::LazyDecodeBitmap(const void* src, size_t length, SkBitmap* dst) {
-    SkAutoDataUnref data(SkData::NewWithCopy(src, length));
-    if (nullptr == data.get()) {
-        return false;
-    }
-
-    SkAutoTDelete<SkImageGenerator> gen(SkImageGenerator::NewFromEncoded(data));
-    if (nullptr == gen.get()) {
-        return false;
-    }
-    const SkImageInfo info = gen->getInfo();
-    SkDiscardableMemory::Factory* pool = nullptr;
-    if ((!FLAGS_useVolatileCache) || (info.width() * info.height() < 32 * 1024)) {
-        // how to do switching with SkDiscardableMemory.
-        pool = SkGetGlobalDiscardableMemoryPool();
-        // Only meaningful if platform has a default discardable
-        // memory implementation that differs from the global DM pool.
-    }
-    return SkDEPRECATED_InstallDiscardablePixelRef(gen.detach(), nullptr, dst, pool);
-}
diff --git a/tools/LazyDecodeBitmap.h b/tools/LazyDecodeBitmap.h
deleted file mode 100644
index ecceb94..0000000
--- a/tools/LazyDecodeBitmap.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2013 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef LazyDecodeBitmap_DEFINED
-#define LazyDecodeBitmap_DEFINED
-
-#include "SkTypes.h"
-
-class SkBitmap;
-
-namespace sk_tools {
-
-/**
- * Decode the image with DecodeMemoryToTarget but defer the process until it is needed.
- */
-bool LazyDecodeBitmap(const void* buffer, size_t size, SkBitmap* bitmap);
-
-}
-
-#endif  // LazyDecodeBitmap_DEFINED
diff --git a/tools/dump_record.cpp b/tools/dump_record.cpp
index 029638e..96b8937 100644
--- a/tools/dump_record.cpp
+++ b/tools/dump_record.cpp
@@ -6,7 +6,6 @@
  */
 
 #include "DumpRecord.h"
-#include "LazyDecodeBitmap.h"
 #include "SkCommandLineFlags.h"
 #include "SkPicture.h"
 #include "SkPictureRecorder.h"
@@ -50,8 +49,7 @@
             SkDebugf("Could not read %s.\n", FLAGS_skps[i]);
             return 1;
         }
-        SkAutoTUnref<SkPicture> src(
-                SkPicture::CreateFromStream(stream, sk_tools::LazyDecodeBitmap));
+        SkAutoTUnref<SkPicture> src(SkPicture::CreateFromStream(stream));
         if (!src) {
             SkDebugf("Could not read %s as an SkPicture.\n", FLAGS_skps[i]);
             return 1;
diff --git a/tools/gpuveto.cpp b/tools/gpuveto.cpp
index 204f449..f2e103e 100644
--- a/tools/gpuveto.cpp
+++ b/tools/gpuveto.cpp
@@ -5,7 +5,6 @@
  * found in the LICENSE file.
  */
 
-#include "LazyDecodeBitmap.h"
 #include "SkCommandLineFlags.h"
 #include "SkPicture.h"
 #include "SkPictureRecorder.h"
@@ -42,9 +41,7 @@
         return kError;
     }
 
-    SkPicture::InstallPixelRefProc proc = &sk_tools::LazyDecodeBitmap;
-
-    SkAutoTUnref<SkPicture> picture(SkPicture::CreateFromStream(&inputStream, proc));
+    SkAutoTUnref<SkPicture> picture(SkPicture::CreateFromStream(&inputStream));
     if (nullptr == picture.get()) {
         if (!FLAGS_quiet) {
             SkDebugf("Could not read the SkPicture\n");
diff --git a/tools/lua/lua_pictures.cpp b/tools/lua/lua_pictures.cpp
index 6fa5813..57b0dcc 100644
--- a/tools/lua/lua_pictures.cpp
+++ b/tools/lua/lua_pictures.cpp
@@ -5,7 +5,6 @@
  * found in the LICENSE file.
  */
 
-#include "LazyDecodeBitmap.h"
 #include "SkLua.h"
 #include "SkLuaCanvas.h"
 #include "SkPicture.h"
@@ -44,7 +43,7 @@
     SkAutoTDelete<SkStream> stream(SkStream::NewFromFile(path));
     SkPicture* pic = nullptr;
     if (stream.get()) {
-        pic = SkPicture::CreateFromStream(stream.get(), &sk_tools::LazyDecodeBitmap);
+        pic = SkPicture::CreateFromStream(stream.get());
     }
     return pic;
 }
diff --git a/tools/pinspect.cpp b/tools/pinspect.cpp
index 5c04608..b8deba7 100644
--- a/tools/pinspect.cpp
+++ b/tools/pinspect.cpp
@@ -5,7 +5,6 @@
  * found in the LICENSE file.
  */
 
-#include "LazyDecodeBitmap.h"
 #include "SkBitmap.h"
 #include "SkCanvas.h"
 #include "SkGraphics.h"
@@ -35,7 +34,7 @@
     }
 
     stream.rewind();
-    SkPicture* pic = SkPicture::CreateFromStream(&stream, &sk_tools::LazyDecodeBitmap);
+    SkPicture* pic = SkPicture::CreateFromStream(&stream);
     if (nullptr == pic) {
         SkDebugf("Could not create SkPicture: %s\n", path);
         return nullptr;
