| Index: Source/core/platform/graphics/DeferredImageDecoder.cpp
|
| diff --git a/Source/core/platform/graphics/DeferredImageDecoder.cpp b/Source/core/platform/graphics/DeferredImageDecoder.cpp
|
| index 0dab6c5264adc2dd65fe58a30867f815090c63ee..63eff811c59e3b6292ac9121915c66301e23e638 100644
|
| --- a/Source/core/platform/graphics/DeferredImageDecoder.cpp
|
| +++ b/Source/core/platform/graphics/DeferredImageDecoder.cpp
|
| @@ -26,8 +26,11 @@
|
| #include "config.h"
|
| #include "core/platform/graphics/DeferredImageDecoder.h"
|
|
|
| +#include "core/platform/graphics/DecodingImageGenerator.h"
|
| #include "core/platform/graphics/ImageFrameGenerator.h"
|
| #include "core/platform/graphics/LazyDecodingPixelRef.h"
|
| +#include "third_party/skia/include/core/SkImageInfo.h"
|
| +#include "third_party/skia/src/lazy/SkDiscardablePixelRef.h"
|
| #include "wtf/PassOwnPtr.h"
|
|
|
| namespace WebCore {
|
| @@ -40,6 +43,7 @@ const char labelLazyDecoded[] = "lazy";
|
| } // namespace
|
|
|
| bool DeferredImageDecoder::s_enabled = false;
|
| +bool DeferredImageDecoder::s_enabledSkiaDiscardableMemory = false;
|
|
|
| DeferredImageDecoder::DeferredImageDecoder(PassOwnPtr<ImageDecoder> actualDecoder)
|
| : m_allDataReceived(false)
|
| @@ -76,6 +80,11 @@ void DeferredImageDecoder::setEnabled(bool enabled)
|
| s_enabled = enabled;
|
| }
|
|
|
| +void DeferredImageDecoder::setEnabledSkiaDiscardableMemory(bool enabled)
|
| +{
|
| + s_enabledSkiaDiscardableMemory = enabled;
|
| +}
|
| +
|
| String DeferredImageDecoder::filenameExtension() const
|
| {
|
| return m_actualDecoder ? m_actualDecoder->filenameExtension() : m_filenameExtension;
|
| @@ -208,7 +217,7 @@ void DeferredImageDecoder::prepareLazyDecodedFrames()
|
| m_lazyDecodedFrames.resize(m_actualDecoder->frameCount());
|
| for (size_t i = previousSize; i < m_lazyDecodedFrames.size(); ++i) {
|
| OwnPtr<ImageFrame> frame(adoptPtr(new ImageFrame()));
|
| - frame->setSkBitmap(createLazyDecodingBitmap(i));
|
| + frame->setSkBitmap(createBitmap(i));
|
| frame->setDuration(m_actualDecoder->frameDurationAtIndex(i));
|
| frame->setStatus(m_actualDecoder->frameIsCompleteAtIndex(i) ? ImageFrame::FrameComplete : ImageFrame::FramePartial);
|
| m_lazyDecodedFrames[i] = frame.release();
|
| @@ -226,6 +235,35 @@ void DeferredImageDecoder::prepareLazyDecodedFrames()
|
| }
|
| }
|
|
|
| +// Creates either a SkBitmap backed by SkDiscardablePixelRef or a SkBitmap using the
|
| +// legacy LazyDecodingPixelRef.
|
| +SkBitmap DeferredImageDecoder::createBitmap(size_t index)
|
| +{
|
| + // This code is temporary until the transition to SkDiscardablePixelRef is complete.
|
| + if (s_enabledSkiaDiscardableMemory)
|
| + return createSkiaDiscardableBitmap(index);
|
| + return createLazyDecodingBitmap(index);
|
| +}
|
| +
|
| +// Creates a SkBitmap that is backed by SkDiscardablePixelRef.
|
| +SkBitmap DeferredImageDecoder::createSkiaDiscardableBitmap(size_t index)
|
| +{
|
| + IntSize decodedSize = m_actualDecoder->decodedSize();
|
| + ASSERT(decodedSize.width() > 0);
|
| + ASSERT(decodedSize.height() > 0);
|
| +
|
| + SkImageInfo info;
|
| + info.fWidth = decodedSize.width();
|
| + info.fHeight = decodedSize.height();
|
| + info.fColorType = kBGRA_8888_SkColorType;
|
| + info.fAlphaType = frameHasAlphaAtIndex(index) ? kPremul_SkAlphaType : kOpaque_SkAlphaType;
|
| +
|
| + SkBitmap bitmap;
|
| + bool installed = SkDiscardablePixelRef::Install(new DecodingImageGenerator(m_frameGenerator, info, index), &bitmap);
|
| + ASSERT_UNUSED(installed, installed);
|
| + return bitmap;
|
| +}
|
| +
|
| SkBitmap DeferredImageDecoder::createLazyDecodingBitmap(size_t index)
|
| {
|
| IntSize decodedSize = m_actualDecoder->decodedSize();
|
|
|