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