Index: third_party/WebKit/Source/platform/graphics/PictureSnapshot.cpp |
diff --git a/third_party/WebKit/Source/platform/graphics/PictureSnapshot.cpp b/third_party/WebKit/Source/platform/graphics/PictureSnapshot.cpp |
index f7be7c977446fab5a519fe9d9d098f8febe88f3c..5d1155f8913bd6e6a5e2d5ebc6d7255ae354e2c0 100644 |
--- a/third_party/WebKit/Source/platform/graphics/PictureSnapshot.cpp |
+++ b/third_party/WebKit/Source/platform/graphics/PictureSnapshot.cpp |
@@ -42,6 +42,7 @@ |
#include "platform/image-encoders/PNGImageEncoder.h" |
#include "third_party/skia/include/core/SkData.h" |
#include "third_party/skia/include/core/SkImage.h" |
+#include "third_party/skia/include/core/SkImageDeserializer.h" |
#include "third_party/skia/include/core/SkPictureRecorder.h" |
#include "third_party/skia/include/core/SkStream.h" |
#include "wtf/CurrentTime.h" |
@@ -58,22 +59,27 @@ PictureSnapshot::PictureSnapshot(PassRefPtr<const SkPicture> picture) |
{ |
} |
-static bool decodeBitmap(const void* data, size_t length, SkBitmap* result) |
-{ |
- std::unique_ptr<ImageDecoder> imageDecoder = ImageDecoder::create(ImageDecoder::determineImageType(static_cast<const char*>(data), length), |
- ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileIgnored); |
- if (!imageDecoder) |
- return false; |
- |
- // No need to copy the data; this decodes immediately. |
- RefPtr<SegmentReader> segmentReader = SegmentReader::createFromSkData(SkData::MakeWithoutCopy(data, length)); |
- imageDecoder->setData(segmentReader.release(), true); |
- ImageFrame* frame = imageDecoder->frameBufferAtIndex(0); |
- if (!frame) |
- return true; |
- *result = frame->bitmap(); |
- return true; |
-} |
+class SkiaImageDecoder : public SkImageDeserializer { |
+public: |
+ sk_sp<SkImage> makeFromMemory(const void* data, size_t length, const SkIRect* subset) override |
+ { |
+ std::unique_ptr<ImageDecoder> imageDecoder = ImageDecoder::create(ImageDecoder::determineImageType(static_cast<const char*>(data), length), |
+ ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileIgnored); |
+ if (!imageDecoder) |
+ return nullptr; |
+ |
+ RefPtr<SegmentReader> segmentReader = SegmentReader::createFromSkData(SkData::MakeWithoutCopy(data, length)); |
+ imageDecoder->setData(segmentReader.release(), true); |
+ ImageFrame* frame = imageDecoder->frameBufferAtIndex(0); |
+ if (!frame || imageDecoder->failed()) |
+ return nullptr; |
+ return frame->finalizePixelsAndGetImage(); |
Peter Kasting
2016/09/22 21:44:08
Nit: Shorter:
return (frame && !imageDeco
aleksandar.stojiljkovic
2016/09/27 18:08:28
Done.
|
+ } |
+ sk_sp<SkImage> makeFromData(SkData* data, const SkIRect* subset) override |
+ { |
+ return this->makeFromMemory(data->data(), data->size(), subset); |
+ } |
+}; |
PassRefPtr<PictureSnapshot> PictureSnapshot::load(const Vector<RefPtr<TilePictureStream>>& tiles) |
{ |
@@ -83,7 +89,8 @@ PassRefPtr<PictureSnapshot> PictureSnapshot::load(const Vector<RefPtr<TilePictur |
FloatRect unionRect; |
for (const auto& tileStream : tiles) { |
SkMemoryStream stream(tileStream->data.begin(), tileStream->data.size()); |
- sk_sp<SkPicture> picture = SkPicture::MakeFromStream(&stream, decodeBitmap); |
+ SkiaImageDecoder factory; |
+ sk_sp<SkPicture> picture = SkPicture::MakeFromStream(&stream, &factory); |
if (!picture) |
return nullptr; |
FloatRect cullRect(picture->cullRect()); |