Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog (195203 => 195204)
--- releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog 2016-01-18 12:08:07 UTC (rev 195203)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog 2016-01-18 12:09:07 UTC (rev 195204)
@@ -1,3 +1,23 @@
+2016-01-02 Max Stepin <[email protected]>
+
+ APNG decoder: only decode the frames up to haltAtFrame
+ https://bugs.webkit.org/show_bug.cgi?id=146205
+
+ Reviewed by Michael Catanzaro.
+
+ No new tests, already covered by existing tests.
+
+ * platform/image-decoders/png/PNGImageDecoder.cpp:
+ (WebCore::PNGImageReader::close):
+ (WebCore::PNGImageReader::decode):
+ (WebCore::PNGImageDecoder::isSizeAvailable):
+ (WebCore::PNGImageDecoder::frameBufferAtIndex):
+ (WebCore::PNGImageDecoder::pngComplete):
+ (WebCore::PNGImageDecoder::decode):
+ * platform/image-decoders/png/PNGImageDecoder.h:
+ (WebCore::PNGImageDecoder::isComplete):
+ (WebCore::PNGImageDecoder::isCompleteAtIndex):
+
2015-12-31 Zalan Bujtas <[email protected]>
Simple line layout: Text with stroke width is not positioned correctly.
Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp (195203 => 195204)
--- releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp 2016-01-18 12:08:07 UTC (rev 195203)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp 2016-01-18 12:09:07 UTC (rev 195204)
@@ -161,7 +161,7 @@
m_readOffset = 0;
}
- bool decode(const SharedBuffer& data, bool sizeOnly)
+ bool decode(const SharedBuffer& data, bool sizeOnly, unsigned haltAtFrame)
{
m_decodingSizeOnly = sizeOnly;
PNGImageDecoder* decoder = static_cast<PNGImageDecoder*>(png_get_progressive_ptr(m_png));
@@ -178,7 +178,7 @@
// We explicitly specify the superclass isSizeAvailable() because we
// merely want to check if we've managed to set the size, not
// (recursively) trigger additional decoding if we haven't.
- if (sizeOnly ? decoder->ImageDecoder::isSizeAvailable() : decoder->isComplete())
+ if (sizeOnly ? decoder->ImageDecoder::isSizeAvailable() : decoder->isCompleteAtIndex(haltAtFrame))
return true;
}
return false;
@@ -274,7 +274,7 @@
bool PNGImageDecoder::isSizeAvailable()
{
if (!ImageDecoder::isSizeAvailable())
- decode(true);
+ decode(true, 0);
return ImageDecoder::isSizeAvailable();
}
@@ -308,7 +308,7 @@
ImageFrame& frame = m_frameBufferCache[index];
if (frame.status() != ImageFrame::FrameComplete)
- decode(false);
+ decode(false, index);
return &frame;
}
@@ -687,7 +687,7 @@
m_frameBufferCache.first().setStatus(ImageFrame::FrameComplete);
}
-void PNGImageDecoder::decode(bool onlySize)
+void PNGImageDecoder::decode(bool onlySize, unsigned haltAtFrame)
{
if (failed())
return;
@@ -697,7 +697,7 @@
// If we couldn't decode the image but we've received all the data, decoding
// has failed.
- if (!m_reader->decode(*m_data, onlySize) && isAllDataReceived())
+ if (!m_reader->decode(*m_data, onlySize, haltAtFrame) && isAllDataReceived())
setFailed();
// If we're done decoding the image, we don't need the PNGImageReader
// anymore. (If we failed, |m_reader| has already been cleared.)
@@ -771,6 +771,27 @@
return;
}
+ if (m_frameBufferCache.isEmpty()) {
+ m_frameBufferCache.resize(1);
+ m_frameBufferCache[0].setPremultiplyAlpha(m_premultiplyAlpha);
+ }
+
+ if (m_currentFrame < m_frameBufferCache.size()) {
+ ImageFrame& buffer = m_frameBufferCache[m_currentFrame];
+
+ if (!m_delayDenominator)
+ buffer.setDuration(m_delayNumerator * 10);
+ else
+ buffer.setDuration(m_delayNumerator * 1000 / m_delayDenominator);
+
+ if (m_dispose == 2)
+ buffer.setDisposalMethod(ImageFrame::DisposeOverwritePrevious);
+ else if (m_dispose == 1)
+ buffer.setDisposalMethod(ImageFrame::DisposeOverwriteBgcolor);
+ else
+ buffer.setDisposalMethod(ImageFrame::DisposeKeep);
+ }
+
m_frameInfo = true;
m_frameIsHidden = false;
@@ -927,18 +948,6 @@
ImageFrame& buffer = m_frameBufferCache[m_currentFrame];
buffer.setStatus(ImageFrame::FrameComplete);
- if (!m_delayDenominator)
- buffer.setDuration(m_delayNumerator * 10);
- else
- buffer.setDuration(m_delayNumerator * 1000 / m_delayDenominator);
-
- if (m_dispose == 2)
- buffer.setDisposalMethod(ImageFrame::DisposeOverwritePrevious);
- else if (m_dispose == 1)
- buffer.setDisposalMethod(ImageFrame::DisposeOverwriteBgcolor);
- else
- buffer.setDisposalMethod(ImageFrame::DisposeKeep);
-
png_bytep interlaceBuffer = m_reader->interlaceBuffer();
if (m_currentFrame && interlaceBuffer) {
Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/image-decoders/png/PNGImageDecoder.h (195203 => 195204)
--- releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/image-decoders/png/PNGImageDecoder.h 2016-01-18 12:08:07 UTC (rev 195203)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/image-decoders/png/PNGImageDecoder.h 2016-01-18 12:09:07 UTC (rev 195204)
@@ -80,11 +80,16 @@
return true;
}
+ bool isCompleteAtIndex(size_t index)
+ {
+ return (index < m_frameBufferCache.size() && m_frameBufferCache[index].status() == ImageFrame::FrameComplete);
+ }
+
private:
// Decodes the image. If |onlySize| is true, stops decoding after
// calculating the image size. If decoding fails but there is no more
// data coming, sets the "decode failure" flag.
- void decode(bool onlySize);
+ void decode(bool onlySize, unsigned haltAtFrame);
#if ENABLE(APNG)
void initFrameBuffer(size_t frameIndex);
void frameComplete();