| Index: src/images/SkImageEncoder.cpp
 | 
| diff --git a/src/images/SkImageEncoder.cpp b/src/images/SkImageEncoder.cpp
 | 
| index cc1b73baa52150de72f20c1543634503d83770f9..22bbc57c2f593a083734311f0c2dadb5f4994947 100644
 | 
| --- a/src/images/SkImageEncoder.cpp
 | 
| +++ b/src/images/SkImageEncoder.cpp
 | 
| @@ -7,6 +7,8 @@
 | 
|  
 | 
|  #include "SkImageEncoder.h"
 | 
|  #include "SkBitmap.h"
 | 
| +#include "SkPixelSerializer.h"
 | 
| +#include "SkPixmap.h"
 | 
|  #include "SkStream.h"
 | 
|  #include "SkTemplates.h"
 | 
|  
 | 
| @@ -57,6 +59,30 @@ SkData* SkImageEncoder::EncodeData(const SkImageInfo& info, const void* pixels,
 | 
|      if (!bm.installPixels(info, const_cast<void*>(pixels), rowBytes)) {
 | 
|          return nullptr;
 | 
|      }
 | 
| -    SkAutoTDelete<SkImageEncoder> enc(SkImageEncoder::Create(t));
 | 
| -    return enc.get() ? enc.get()->encodeData(bm, quality) : nullptr;
 | 
| +    bm.setImmutable();
 | 
| +    return SkImageEncoder::EncodeData(bm, t, quality);
 | 
| +}
 | 
| +
 | 
| +SkData* SkImageEncoder::EncodeData(const SkPixmap& pixmap,
 | 
| +                                   Type t, int quality) {
 | 
| +    SkBitmap bm;
 | 
| +    if (!bm.installPixels(pixmap)) {
 | 
| +        return nullptr;
 | 
| +    }
 | 
| +    bm.setImmutable();
 | 
| +    return SkImageEncoder::EncodeData(bm, t, quality);
 | 
| +}
 | 
| +
 | 
| +namespace {
 | 
| +class ImageEncoderPixelSerializer final : public SkPixelSerializer {
 | 
| +protected:
 | 
| +    bool onUseEncodedData(const void*, size_t) override { return true; }
 | 
| +    SkData* onEncode(const SkPixmap& pmap) override {
 | 
| +        return SkImageEncoder::EncodeData(pmap, SkImageEncoder::kPNG_Type, 100);
 | 
| +    }
 | 
| +};
 | 
| +} // namespace
 | 
| +
 | 
| +SkPixelSerializer* SkImageEncoder::CreatePixelSerializer() {
 | 
| +    return new ImageEncoderPixelSerializer;
 | 
|  }
 | 
| 
 |