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: fix build Created 4 years, 4 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..88b4e96da7d33a6c4cc86e64cdc538eee7b20f2a 100644
--- a/src/core/SkPicture.cpp
+++ b/src/core/SkPicture.cpp
@@ -6,6 +6,7 @@
*/
#include "SkAtomics.h"
+#include "SkImageDeserializer.h"
#include "SkImageGenerator.h"
#include "SkMessageBus.h"
#include "SkPicture.h"
@@ -23,6 +24,21 @@ static bool g_AllPictureIOSecurityPrecautionsEnabled = false;
DECLARE_SKMESSAGEBUS_MESSAGE(SkPicture::DeletionMessage);
+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)) {
+ bitmap.setImmutable();
+ return SkImage::MakeFromBitmap(bitmap);
+ }
+ return nullptr;
+ }
+};
+
/* SkPicture impl. This handles generic responsibilities like unique IDs and serialization. */
SkPicture::SkPicture() : fUniqueID(0) {}
@@ -141,28 +157,34 @@ 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::MakeFromStream(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) {
+ SkImageDeserializer factory;
+ return MakeFromStream(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