Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(151)

Unified Diff: src/core/SkPicture.cpp

Issue 2187613002: Deserialize pictures with custom image-deserializer (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: rebase Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
}

Powered by Google App Engine
This is Rietveld 408576698