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

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: Created 4 years, 9 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 1411c494248a4a21170f245dc5e8aaa5899035ae..34f75aac43c2dbd8015b5cc8ebfc84af79bb260c 100644
--- a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp
+++ b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp
@@ -26,10 +26,14 @@
#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/ROBufferSegmentReader.h"
+#include "platform/image-decoders/SharedBufferSegmentReader.h"
+#include "skia/ext/refptr.h"
#include "third_party/skia/include/core/SkImage.h"
#include "wtf/PassOwnPtr.h"
@@ -39,7 +43,10 @@ bool DeferredImageDecoder::s_enabled = true;
PassOwnPtr<DeferredImageDecoder> DeferredImageDecoder::create(const SharedBuffer& data, ImageDecoder::AlphaOption alphaOption, ImageDecoder::GammaAndColorProfileOption colorOptions)
{
- OwnPtr<ImageDecoder> actualDecoder = ImageDecoder::create(data, alphaOption, colorOptions);
+ // FIXME: This const_cast is necessary because the SharedBufferSegmentReader expects a non-const, but
+ // it does not modify it.
f(malita) 2016/03/23 16:41:57 Since SharedBufferSegmentReader only calls const S
scroggo_chromium 2016/03/24 13:59:44 I don't think so. ref() and deref() are not marked
+ RefPtr<SegmentReader> segmentReader = adoptRef(new SharedBufferSegmentReader(const_cast<SharedBuffer*>(&data)));
+ OwnPtr<ImageDecoder> actualDecoder = ImageDecoder::create(*segmentReader.get(), alphaOption, colorOptions);
if (!actualDecoder)
return nullptr;
@@ -54,7 +61,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)
@@ -111,15 +117,22 @@ 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();
+ RefPtr<SegmentReader> segmentReader = adoptRef(new SharedBufferSegmentReader(RefPtr<SharedBuffer>(data)));
Peter Kasting 2016/03/23 02:42:58 Nit: Move down one line
scroggo_chromium 2016/03/24 13:59:44 Done.
m_allDataReceived = allDataReceived;
- m_actualDecoder->setData(&data, allDataReceived);
+ m_actualDecoder->setData(segmentReader.get(), allDataReceived);
Peter Kasting 2016/03/23 02:42:58 This pattern (create a local SharedBufferSegmentRe
scroggo_chromium 2016/03/24 13:59:44 Agreed. Done.
prepareLazyDecodedFrames();
}
- if (m_frameGenerator)
- m_frameGenerator->setData(&data, allDataReceived);
+ if (m_frameGenerator) {
+ if (!m_rwBuffer) {
Peter Kasting 2016/03/23 02:42:58 Nit: No {} (anywhere we have a one-line body)
scroggo_chromium 2016/03/24 13:59:44 Done.
+ m_rwBuffer = adoptPtr(new SkRWBuffer(data.size()));
+ }
+
+ const char* segment = 0;
+ while (size_t length = data.getSomeData(segment, m_rwBuffer->size())) {
scroggo_chromium 2016/03/22 20:18:41 This copy is analogous to the code in ThreadSafeDa
+ m_rwBuffer->append(segment, length);
+ }
+ }
}
bool DeferredImageDecoder::isSizeAvailable()
@@ -227,7 +240,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);
+ m_frameGenerator = ImageFrameGenerator::create(SkISize::Make(m_actualDecoder->decodedSize().width(), m_actualDecoder->decodedSize().height()),
Peter Kasting 2016/03/23 02:42:58 Nit: Either put everything on one line, or linebre
scroggo_chromium 2016/03/24 13:59:44 I created a temporary variable, as is done with is
+ !isSingleFrame);
}
void DeferredImageDecoder::prepareLazyDecodedFrames()
@@ -264,7 +278,6 @@ void DeferredImageDecoder::prepareLazyDecodedFrames()
if (m_allDataReceived) {
m_repetitionCount = m_actualDecoder->repetitionCount();
m_actualDecoder.clear();
scroggo_chromium 2016/03/22 20:18:42 We hang on to the SkRWBuffer here, unlike the old
Peter Kasting 2016/03/23 02:42:58 Might want to write a comment about that.
scroggo_chromium 2016/03/24 13:59:45 Done.
- m_data = nullptr;
}
}
@@ -279,7 +292,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);
+ skia::RefPtr<SkROBuffer> roBuffer = skia::AdoptRef(m_rwBuffer->newRBufferSnapshot());
scroggo_chromium 2016/03/22 20:18:42 Some of the Blink code that uses a Skia object wra
Peter Kasting 2016/03/23 02:42:58 Use skia::RefPtr for now, I think.
f(malita) 2016/03/23 16:41:58 skia::RefPtr is only used in Chromium code AFAIK.
scroggo_chromium 2016/03/24 13:59:44 Yes, it does appear skia::RefPtr is only used in C
+ RefPtr<SegmentReader> segmentReader = adoptRef(new ROBufferSegmentReader(roBuffer));
+ DecodingImageGenerator* generator = new DecodingImageGenerator(m_frameGenerator, imageInfoFrom(decodedSize, knownToBeOpaque), segmentReader, 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