Index: src/core/SkPicture.cpp |
diff --git a/src/core/SkPicture.cpp b/src/core/SkPicture.cpp |
index 4e994559e62f3318b48821ad4c6dad4479e86ffb..fed149778e5e399ebc0847b17d16d233d3f7920e 100644 |
--- a/src/core/SkPicture.cpp |
+++ b/src/core/SkPicture.cpp |
@@ -23,6 +23,27 @@ static bool g_AllPictureIOSecurityPrecautionsEnabled = false; |
DECLARE_SKMESSAGEBUS_MESSAGE(SkPicture::DeletionMessage); |
+class DefaultImageDeserializer : public SkImageDeserializer { |
+public: |
+ sk_sp<SkImage> deserialize(sk_sp<SkData> encoded, const SkIRect* subset) override { |
+ return SkImage::MakeFromEncoded(std::move(encoded), subset); |
+ } |
+}; |
+ |
+class InstallProcImageDeserializer : public SkImageDeserializer { |
+ SkPicture::InstallPixelRefProc fProc; |
+public: |
+ InstallProcImageDeserializer(SkPicture::InstallPixelRefProc proc) : fProc(proc) {} |
+ |
+ sk_sp<SkImage> deserialize(sk_sp<SkData> encoded, const SkIRect* subset) override { |
+ SkBitmap bitmap; |
+ if (fProc(encoded->data(), encoded->size(), &bitmap)) { |
+ return SkImage::MakeFromBitmap(bitmap); |
f(malita)
2016/07/26 21:29:43
bitmap.setImmutable first to avoid a copy?
reed1
2016/07/29 13:12:04
Done.
|
+ } |
+ return nullptr; |
+ } |
+}; |
+ |
/* SkPicture impl. This handles generic responsibilities like unique IDs and serialization. */ |
SkPicture::SkPicture() : fUniqueID(0) {} |
@@ -141,28 +162,35 @@ sk_sp<SkPicture> SkPicture::Forwardport(const SkPictInfo& info, |
return r.finishRecordingAsPicture(); |
} |
+#ifdef SK_SUPPORT_LEGACY_PICTUREINSTALLPIXELREF |
static bool default_install(const void* src, size_t length, SkBitmap* dst) { |
sk_sp<SkData> encoded(SkData::MakeWithCopy(src, length)); |
return encoded && SkDEPRECATED_InstallDiscardablePixelRef( |
SkImageGenerator::NewFromEncoded(encoded.get()), dst); |
} |
+sk_sp<SkPicture> SkPicture::MakeFromStream(SkStream* stream, InstallPixelRefProc proc) { |
+ return MakeFromStream(stream, proc, nullptr); |
+} |
+#endif |
-sk_sp<SkPicture> SkPicture::MakeFromStream(SkStream* stream) { |
- return MakeFromStream(stream, &default_install, nullptr); |
+sk_sp<SkPicture> SkPicture::MakeFromStreamWithDeserializer(SkStream* stream, |
+ SkImageDeserializer* factory) { |
+ return MakeFromStream(stream, factory, nullptr); |
} |
-sk_sp<SkPicture> SkPicture::MakeFromStream(SkStream* stream, InstallPixelRefProc proc) { |
- return MakeFromStream(stream, proc, nullptr); |
+sk_sp<SkPicture> SkPicture::MakeFromStream(SkStream* stream) { |
+ DefaultImageDeserializer factory; |
+ return MakeFromStreamWithDeserializer(stream, &factory); |
} |
-sk_sp<SkPicture> SkPicture::MakeFromStream(SkStream* stream, InstallPixelRefProc proc, |
+sk_sp<SkPicture> SkPicture::MakeFromStream(SkStream* stream, SkImageDeserializer* factory, |
SkTypefacePlayback* typefaces) { |
SkPictInfo info; |
if (!InternalOnly_StreamIsSKP(stream, &info) || !stream->readBool()) { |
return nullptr; |
} |
SkAutoTDelete<SkPictureData> data( |
- SkPictureData::CreateFromStream(stream, info, proc, typefaces)); |
+ SkPictureData::CreateFromStream(stream, info, factory, typefaces)); |
return Forwardport(info, data, nullptr); |
} |