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

Unified Diff: third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp

Issue 1812273003: Eliminate copies of encoded image data (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 4 years, 8 months 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: 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 a9d882f4957d2017839c2bac992340c8df562b56..9ea87b7d94178db75d3f5bbe19579caeeb37f9b3 100644
--- a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp
+++ b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp
@@ -26,10 +26,12 @@
#include "platform/graphics/DeferredImageDecoder.h"
#include "platform/RuntimeEnabledFeatures.h"
+#include "platform/SharedBuffer.h"
#include "platform/graphics/DecodingImageGenerator.h"
#include "platform/graphics/FrameData.h"
#include "platform/graphics/ImageDecodingStore.h"
#include "platform/graphics/ImageFrameGenerator.h"
+#include "platform/image-decoders/SegmentReader.h"
#include "third_party/skia/include/core/SkImage.h"
#include "wtf/PassOwnPtr.h"
@@ -54,7 +56,6 @@ PassOwnPtr<DeferredImageDecoder> DeferredImageDecoder::createForTesting(PassOwnP
DeferredImageDecoder::DeferredImageDecoder(PassOwnPtr<ImageDecoder> actualDecoder)
: m_allDataReceived(false)
- , m_lastDataSize(0)
, m_actualDecoder(std::move(actualDecoder))
, m_repetitionCount(cAnimationNone)
, m_hasColorProfile(false)
@@ -114,15 +115,20 @@ PassRefPtr<SkImage> DeferredImageDecoder::createFrameAtIndex(size_t index)
void DeferredImageDecoder::setData(SharedBuffer& data, bool allDataReceived)
{
if (m_actualDecoder) {
- m_data = RefPtr<SharedBuffer>(data);
- m_lastDataSize = data.size();
m_allDataReceived = allDataReceived;
m_actualDecoder->setData(&data, allDataReceived);
prepareLazyDecodedFrames();
}
- if (m_frameGenerator)
- m_frameGenerator->setData(&data, allDataReceived);
+ if (m_frameGenerator) {
+ if (!m_rwBuffer)
+ m_rwBuffer = adoptPtr(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()))
+ m_rwBuffer->append(segment, length);
+ }
}
bool DeferredImageDecoder::isSizeAvailable()
@@ -230,7 +236,8 @@ void DeferredImageDecoder::activateLazyDecoding()
m_hasColorProfile = m_actualDecoder->hasColorProfile();
const bool isSingleFrame = m_actualDecoder->repetitionCount() == cAnimationNone || (m_allDataReceived && m_actualDecoder->frameCount() == 1u);
- m_frameGenerator = ImageFrameGenerator::create(SkISize::Make(m_actualDecoder->decodedSize().width(), m_actualDecoder->decodedSize().height()), m_data, m_allDataReceived, !isSingleFrame);
+ const SkISize decodedSize = SkISize::Make(m_actualDecoder->decodedSize().width(), m_actualDecoder->decodedSize().height());
+ m_frameGenerator = ImageFrameGenerator::create(decodedSize, !isSingleFrame);
}
void DeferredImageDecoder::prepareLazyDecodedFrames()
@@ -267,7 +274,7 @@ void DeferredImageDecoder::prepareLazyDecodedFrames()
if (m_allDataReceived) {
m_repetitionCount = m_actualDecoder->repetitionCount();
m_actualDecoder.clear();
- m_data = nullptr;
+ // Hold on to m_rwBuffer, which is still needed by createFrameAtIndex.
}
}
@@ -282,7 +289,9 @@ PassRefPtr<SkImage> DeferredImageDecoder::createFrameImageAtIndex(size_t index,
ASSERT(decodedSize.width() > 0);
ASSERT(decodedSize.height() > 0);
- DecodingImageGenerator* generator = new DecodingImageGenerator(m_frameGenerator, imageInfoFrom(decodedSize, knownToBeOpaque), index);
+ RefPtr<SkROBuffer> roBuffer = adoptRef(m_rwBuffer->newRBufferSnapshot());
+ RefPtr<SegmentReader> segmentReader = SegmentReader::createFromSkROBuffer(roBuffer.release());
+ DecodingImageGenerator* generator = new DecodingImageGenerator(m_frameGenerator, imageInfoFrom(decodedSize, knownToBeOpaque), segmentReader.release(), m_allDataReceived, index);
RefPtr<SkImage> image = adoptRef(SkImage::NewFromGenerator(generator)); // SkImage takes ownership of the generator.
if (!image)
return nullptr;

Powered by Google App Engine
This is Rietveld 408576698