| Index: third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp
|
| diff --git a/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp b/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp
|
| index 920c49ff13041efa68a4941ece6859a19e48f911..2d2dc265f7c7fad31c9c3875a6bdeabf92ffb592 100644
|
| --- a/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp
|
| +++ b/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp
|
| @@ -30,13 +30,16 @@
|
| #include "platform/TraceEvent.h"
|
| #include "platform/graphics/ImageFrameGenerator.h"
|
| #include "platform/image-decoders/ImageDecoder.h"
|
| +#include "platform/image-decoders/SegmentReader.h"
|
| #include "third_party/skia/include/core/SkData.h"
|
|
|
| namespace blink {
|
|
|
| -DecodingImageGenerator::DecodingImageGenerator(PassRefPtr<ImageFrameGenerator> frameGenerator, const SkImageInfo& info, size_t index)
|
| +DecodingImageGenerator::DecodingImageGenerator(PassRefPtr<ImageFrameGenerator> frameGenerator, const SkImageInfo& info, PassRefPtr<SegmentReader> data, bool allDataReceived, size_t index)
|
| : SkImageGenerator(info)
|
| , m_frameGenerator(frameGenerator)
|
| + , m_data(data)
|
| + , m_allDataReceived(allDataReceived)
|
| , m_frameIndex(index)
|
| , m_canYUVDecode(false)
|
| {
|
| @@ -50,7 +53,7 @@ SkData* DecodingImageGenerator::onRefEncodedData()
|
| {
|
| TRACE_EVENT0("blink", "DecodingImageGenerator::refEncodedData");
|
|
|
| - return m_frameGenerator->refEncodedData();
|
| + return m_allDataReceived ? m_data->getAsSkData().leakRef() : nullptr;
|
| }
|
|
|
| bool DecodingImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, SkPMColor table[], int* tableCount)
|
| @@ -68,7 +71,7 @@ bool DecodingImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels,
|
| }
|
|
|
| PlatformInstrumentation::willDecodeLazyPixelRef(uniqueID());
|
| - bool decoded = m_frameGenerator->decodeAndScale(m_frameIndex, getInfo(), pixels, rowBytes);
|
| + bool decoded = m_frameGenerator->decodeAndScale(m_data.get(), m_allDataReceived, m_frameIndex, getInfo(), pixels, rowBytes);
|
| PlatformInstrumentation::didDecodeLazyPixelRef();
|
|
|
| return decoded;
|
| @@ -76,7 +79,8 @@ bool DecodingImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels,
|
|
|
| bool DecodingImageGenerator::onQueryYUV8(SkYUVSizeInfo* sizeInfo, SkYUVColorSpace* colorSpace) const
|
| {
|
| - if (!m_canYUVDecode)
|
| + // YUV decoding does not currently support progressive decoding. See comment in ImageFrameGenerator.h.
|
| + if (!m_canYUVDecode || !m_allDataReceived)
|
| return false;
|
|
|
| TRACE_EVENT1("blink", "DecodingImageGenerator::queryYUV8", "sizes", static_cast<int>(m_frameIndex));
|
| @@ -84,17 +88,18 @@ bool DecodingImageGenerator::onQueryYUV8(SkYUVSizeInfo* sizeInfo, SkYUVColorSpac
|
| if (colorSpace)
|
| *colorSpace = kJPEG_SkYUVColorSpace;
|
|
|
| - return m_frameGenerator->getYUVComponentSizes(sizeInfo);
|
| + return m_frameGenerator->getYUVComponentSizes(m_data.get(), sizeInfo);
|
| }
|
|
|
| bool DecodingImageGenerator::onGetYUV8Planes(const SkYUVSizeInfo& sizeInfo, void* planes[3])
|
| {
|
| - ASSERT(m_canYUVDecode);
|
| + // YUV decoding does not currently support progressive decoding. See comment in ImageFrameGenerator.h.
|
| + ASSERT(m_canYUVDecode && m_allDataReceived);
|
|
|
| TRACE_EVENT1("blink", "DecodingImageGenerator::getYUV8Planes", "frame index", static_cast<int>(m_frameIndex));
|
|
|
| PlatformInstrumentation::willDecodeLazyPixelRef(uniqueID());
|
| - bool decoded = m_frameGenerator->decodeToYUV(m_frameIndex, sizeInfo.fSizes, planes, sizeInfo.fWidthBytes);
|
| + bool decoded = m_frameGenerator->decodeToYUV(m_data.get(), m_frameIndex, sizeInfo.fSizes, planes, sizeInfo.fWidthBytes);
|
| PlatformInstrumentation::didDecodeLazyPixelRef();
|
|
|
| return decoded;
|
| @@ -102,26 +107,26 @@ bool DecodingImageGenerator::onGetYUV8Planes(const SkYUVSizeInfo& sizeInfo, void
|
|
|
| SkImageGenerator* DecodingImageGenerator::create(SkData* data)
|
| {
|
| - RefPtr<SharedBuffer> buffer = SharedBuffer::create(data->bytes(), data->size());
|
| -
|
| // We just need the size of the image, so we have to temporarily create an ImageDecoder. Since
|
| // we only need the size, it doesn't really matter about premul or not, or gamma settings.
|
| - OwnPtr<ImageDecoder> decoder = ImageDecoder::create(*buffer.get(), ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied);
|
| + OwnPtr<ImageDecoder> decoder = ImageDecoder::create(static_cast<const char*>(data->data()), data->size(),
|
| + ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied);
|
| if (!decoder)
|
| return 0;
|
|
|
| - decoder->setData(buffer.get(), true);
|
| + RefPtr<SegmentReader> segmentReader = SegmentReader::createFromSkData(data);
|
| + decoder->setData(segmentReader.get(), true);
|
| if (!decoder->isSizeAvailable())
|
| return 0;
|
|
|
| const IntSize size = decoder->size();
|
| const SkImageInfo info = SkImageInfo::MakeN32Premul(size.width(), size.height());
|
|
|
| - RefPtr<ImageFrameGenerator> frame = ImageFrameGenerator::create(SkISize::Make(size.width(), size.height()), buffer, true, false);
|
| + RefPtr<ImageFrameGenerator> frame = ImageFrameGenerator::create(SkISize::Make(size.width(), size.height()), false);
|
| if (!frame)
|
| return 0;
|
|
|
| - return new DecodingImageGenerator(frame, info, 0);
|
| + return new DecodingImageGenerator(frame, info, segmentReader.release(), true, 0);
|
| }
|
|
|
| } // namespace blink
|
|
|