Chromium Code Reviews| 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); |
| } |