| Index: third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp
|
| diff --git a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp
|
| index df4b86994d13c1d7ef177299c069132d5ffbdb52..7c32145a13293b0ed26f95f07cd21cd144b3c729 100644
|
| --- a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp
|
| +++ b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp
|
| @@ -57,14 +57,22 @@ public:
|
| uint32_t m_uniqueID;
|
| };
|
|
|
| -std::unique_ptr<DeferredImageDecoder> DeferredImageDecoder::create(ImageDecoder::SniffResult sniffResult, ImageDecoder::AlphaOption alphaOption, ImageDecoder::GammaAndColorProfileOption colorOptions)
|
| +std::unique_ptr<DeferredImageDecoder> DeferredImageDecoder::create(PassRefPtr<SharedBuffer> passData,
|
| + bool dataComplete, ImageDecoder::AlphaOption alphaOption, ImageDecoder::GammaAndColorProfileOption colorOptions)
|
| {
|
| - std::unique_ptr<ImageDecoder> actualDecoder = ImageDecoder::create(sniffResult, alphaOption, colorOptions);
|
| + RefPtr<SharedBuffer> data = passData;
|
| +
|
| + std::unique_ptr<ImageDecoder> actualDecoder = ImageDecoder::create(data, dataComplete, alphaOption, colorOptions);
|
|
|
| if (!actualDecoder)
|
| return nullptr;
|
|
|
| - return wrapUnique(new DeferredImageDecoder(std::move(actualDecoder)));
|
| + std::unique_ptr<DeferredImageDecoder> decoder(new DeferredImageDecoder(std::move(actualDecoder)));
|
| +
|
| + // Since we've just instantiated a fresh decoder, there's no need to reset its data.
|
| + decoder->setDataInternal(data.release(), dataComplete, false);
|
| +
|
| + return decoder;
|
| }
|
|
|
| std::unique_ptr<DeferredImageDecoder> DeferredImageDecoder::createForTesting(std::unique_ptr<ImageDecoder> actualDecoder)
|
| @@ -133,21 +141,28 @@ PassRefPtr<SharedBuffer> DeferredImageDecoder::data()
|
| return sharedBuffer.release();
|
| }
|
|
|
| -void DeferredImageDecoder::setData(SharedBuffer& data, bool allDataReceived)
|
| +void DeferredImageDecoder::setData(PassRefPtr<SharedBuffer> data, bool allDataReceived)
|
| +{
|
| + setDataInternal(data, allDataReceived, true);
|
| +}
|
| +
|
| +void DeferredImageDecoder::setDataInternal(PassRefPtr<SharedBuffer> passData, bool allDataReceived, bool pushDataToDecoder)
|
| {
|
| + RefPtr<SharedBuffer> data = passData;
|
| if (m_actualDecoder) {
|
| m_allDataReceived = allDataReceived;
|
| - m_actualDecoder->setData(&data, allDataReceived);
|
| + if (pushDataToDecoder)
|
| + m_actualDecoder->setData(data, allDataReceived);
|
| prepareLazyDecodedFrames();
|
| }
|
|
|
| if (m_frameGenerator) {
|
| if (!m_rwBuffer)
|
| - m_rwBuffer = wrapUnique(new SkRWBuffer(data.size()));
|
| + m_rwBuffer = wrapUnique(new SkRWBuffer(data->size()));
|
|
|
| const char* segment = 0;
|
| - for (size_t length = data.getSomeData(segment, m_rwBuffer->size());
|
| - length; length = data.getSomeData(segment, m_rwBuffer->size())) {
|
| + for (size_t length = data->getSomeData(segment, m_rwBuffer->size());
|
| + length; length = data->getSomeData(segment, m_rwBuffer->size())) {
|
| m_rwBuffer->append(segment, length);
|
| }
|
| }
|
|
|