Index: src/images/SkImageEncoder.cpp |
diff --git a/src/images/SkImageEncoder.cpp b/src/images/SkImageEncoder.cpp |
index cc1b73baa52150de72f20c1543634503d83770f9..7f59a2746e0233a795dd2c7313ac029bdb85cbb5 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,39 @@ 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(); |
reed1
2015/12/07 15:01:28
why is this needed?
hal.canary
2015/12/07 15:15:36
I think it's a good idea to call setImmutable() to
reed1
2015/12/07 15:28:29
I don't disagree, but I think its extraneous, sinc
|
+ return SkImageEncoder::EncodeData(bm, t, quality); |
+} |
+ |
+SkData* SkImageEncoder::EncodeData(const SkPixmap& pixmap, |
+ Type t, int quality) { |
+ SkBitmap bm; |
+ if (!bm.installPixels(pixmap.info(), |
+ const_cast<void*>(pixmap.addr()), |
+ pixmap.rowBytes(), |
+ pixmap.ctable(), nullptr, nullptr)) { |
+ 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& pixmap) override { |
+ return SkImageEncoder::EncodeData(pixmap, SkImageEncoder::kPNG_Type, 100); |
+ } |
+ SkData* onEncodePixels(const SkImageInfo& info, |
+ const void* pixels, |
+ size_t rowBytes) override { |
+ return SkImageEncoder::EncodeData(info, pixels, rowBytes, |
+ SkImageEncoder::kPNG_Type, 100); |
+ } |
+}; |
+} // namespace |
+ |
+SkPixelSerializer* SkImageEncoder::CreatePixelSerializer() { |
+ return new ImageEncoderPixelSerializer; |
} |