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; |
} |