Title: [195204] releases/WebKitGTK/webkit-2.10/Source/WebCore
Revision
195204
Author
[email protected]
Date
2016-01-18 04:09:07 -0800 (Mon, 18 Jan 2016)

Log Message

Merge r194503 - APNG decoder: only decode the frames up to haltAtFrame
https://bugs.webkit.org/show_bug.cgi?id=146205

Patch by Max Stepin <[email protected]> on 2016-01-02
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):

Modified Paths

Diff

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();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to