Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1411)

Unified Diff: Source/core/platform/graphics/DeferredImageDecoder.cpp

Issue 105773003: Teach Skia to use discardable memory (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();

Powered by Google App Engine
This is Rietveld 408576698