[SCM] WebKit Debian packaging branch, webkit-1.2, updated. upstream/1.1.90-6072-g9a69373

pkasting at chromium.org pkasting at chromium.org
Thu Apr 8 02:14:43 UTC 2010


The following commit has been merged in the webkit-1.2 branch:
commit 1cb59824cfca428f0149f8662d73e4319c2e64fc
Author: pkasting at chromium.org <pkasting at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Mon Mar 8 23:44:31 2010 +0000

    Clean up usage of m_failed in open-source image decoders, part 1.
    https://bugs.webkit.org/show_bug.cgi?id=35411
    
    Reviewed by Adam Barth.
    
    Makes setFailed() virtual so subclasses can override it (none do yet) to
    do automatic cleanup on failure; makes it return a bool for easy
    tailcalling; makes failed() the only way to access m_failed so
    subclasses are assured setFailed() won't be bypassed.  Plus one or two
    other tiny cleanup bits.
    
    Overriding setFailed() is coming in a subsequent patch because it can be
    hairy and needs close review.
    
    No functional change, so no tests.
    
    * platform/graphics/qt/ImageDecoderQt.cpp:
    (WebCore::ImageDecoderQt::setData):
    (WebCore::ImageDecoderQt::frameBufferAtIndex):
    (WebCore::ImageDecoderQt::internalDecodeSize):
    (WebCore::ImageDecoderQt::internalReadImage):
    (WebCore::ImageDecoderQt::internalHandleCurrentImage):
    (WebCore::ImageDecoderQt::forceLoadEverything):
    (WebCore::ImageDecoderQt::clearPointers):
    * platform/graphics/qt/ImageDecoderQt.h:
    * platform/image-decoders/ImageDecoder.h:
    (WebCore::ImageDecoder::ImageDecoder):
    (WebCore::ImageDecoder::setData):
    (WebCore::ImageDecoder::setSize):
    (WebCore::ImageDecoder::setFailed):
    (WebCore::ImageDecoder::failed):
    * platform/image-decoders/bmp/BMPImageDecoder.cpp:
    (WebCore::BMPImageDecoder::isSizeAvailable):
    (WebCore::BMPImageDecoder::frameBufferAtIndex):
    (WebCore::BMPImageDecoder::processFileHeader):
    * platform/image-decoders/gif/GIFImageDecoder.cpp:
    (WebCore::GIFImageDecoder::setData):
    (WebCore::GIFImageDecoder::isSizeAvailable):
    (WebCore::GIFImageDecoder::frameBufferAtIndex):
    (WebCore::GIFImageDecoder::decode):
    (WebCore::GIFImageDecoder::initFrameBuffer):
    * platform/image-decoders/ico/ICOImageDecoder.cpp:
    (WebCore::ICOImageDecoder::decodeAtIndex):
    (WebCore::ICOImageDecoder::processDirectory):
    (WebCore::ICOImageDecoder::processDirectoryEntries):
    * platform/image-decoders/jpeg/JPEGImageDecoder.cpp:
    (WebCore::JPEGImageReader::decode):
    (WebCore::JPEGImageDecoder::setData):
    (WebCore::JPEGImageDecoder::isSizeAvailable):
    (WebCore::JPEGImageDecoder::frameBufferAtIndex):
    (WebCore::JPEGImageDecoder::outputScanlines):
    (WebCore::JPEGImageDecoder::decode):
    * platform/image-decoders/png/PNGImageDecoder.cpp:
    (WebCore::decodingFailed):
    (WebCore::PNGImageReader::decode):
    (WebCore::PNGImageDecoder::setData):
    (WebCore::PNGImageDecoder::isSizeAvailable):
    (WebCore::PNGImageDecoder::frameBufferAtIndex):
    (WebCore::PNGImageDecoder::headerAvailable):
    (WebCore::PNGImageDecoder::rowAvailable):
    (WebCore::PNGImageDecoder::decode):
    * platform/image-decoders/png/PNGImageDecoder.h:
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@55687 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 5b5ef8b..18c5378 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,68 @@
+2010-03-02  Peter Kasting  <pkasting at google.com>
+
+        Reviewed by Adam Barth.
+
+        Clean up usage of m_failed in open-source image decoders, part 1.
+        https://bugs.webkit.org/show_bug.cgi?id=35411
+        
+        Makes setFailed() virtual so subclasses can override it (none do yet) to
+        do automatic cleanup on failure; makes it return a bool for easy
+        tailcalling; makes failed() the only way to access m_failed so
+        subclasses are assured setFailed() won't be bypassed.  Plus one or two
+        other tiny cleanup bits.
+
+        Overriding setFailed() is coming in a subsequent patch because it can be
+        hairy and needs close review.
+
+        No functional change, so no tests.
+
+        * platform/graphics/qt/ImageDecoderQt.cpp:
+        (WebCore::ImageDecoderQt::setData):
+        (WebCore::ImageDecoderQt::frameBufferAtIndex):
+        (WebCore::ImageDecoderQt::internalDecodeSize):
+        (WebCore::ImageDecoderQt::internalReadImage):
+        (WebCore::ImageDecoderQt::internalHandleCurrentImage):
+        (WebCore::ImageDecoderQt::forceLoadEverything):
+        (WebCore::ImageDecoderQt::clearPointers):
+        * platform/graphics/qt/ImageDecoderQt.h:
+        * platform/image-decoders/ImageDecoder.h:
+        (WebCore::ImageDecoder::ImageDecoder):
+        (WebCore::ImageDecoder::setData):
+        (WebCore::ImageDecoder::setSize):
+        (WebCore::ImageDecoder::setFailed):
+        (WebCore::ImageDecoder::failed):
+        * platform/image-decoders/bmp/BMPImageDecoder.cpp:
+        (WebCore::BMPImageDecoder::isSizeAvailable):
+        (WebCore::BMPImageDecoder::frameBufferAtIndex):
+        (WebCore::BMPImageDecoder::processFileHeader):
+        * platform/image-decoders/gif/GIFImageDecoder.cpp:
+        (WebCore::GIFImageDecoder::setData):
+        (WebCore::GIFImageDecoder::isSizeAvailable):
+        (WebCore::GIFImageDecoder::frameBufferAtIndex):
+        (WebCore::GIFImageDecoder::decode):
+        (WebCore::GIFImageDecoder::initFrameBuffer):
+        * platform/image-decoders/ico/ICOImageDecoder.cpp:
+        (WebCore::ICOImageDecoder::decodeAtIndex):
+        (WebCore::ICOImageDecoder::processDirectory):
+        (WebCore::ICOImageDecoder::processDirectoryEntries):
+        * platform/image-decoders/jpeg/JPEGImageDecoder.cpp:
+        (WebCore::JPEGImageReader::decode):
+        (WebCore::JPEGImageDecoder::setData):
+        (WebCore::JPEGImageDecoder::isSizeAvailable):
+        (WebCore::JPEGImageDecoder::frameBufferAtIndex):
+        (WebCore::JPEGImageDecoder::outputScanlines):
+        (WebCore::JPEGImageDecoder::decode):
+        * platform/image-decoders/png/PNGImageDecoder.cpp:
+        (WebCore::decodingFailed):
+        (WebCore::PNGImageReader::decode):
+        (WebCore::PNGImageDecoder::setData):
+        (WebCore::PNGImageDecoder::isSizeAvailable):
+        (WebCore::PNGImageDecoder::frameBufferAtIndex):
+        (WebCore::PNGImageDecoder::headerAvailable):
+        (WebCore::PNGImageDecoder::rowAvailable):
+        (WebCore::PNGImageDecoder::decode):
+        * platform/image-decoders/png/PNGImageDecoder.h:
+
 2010-03-08  Chris Marrin  <cmarrin at apple.com>
 
         Reviewed by Darin Adler.
diff --git a/WebCore/platform/graphics/qt/ImageDecoderQt.cpp b/WebCore/platform/graphics/qt/ImageDecoderQt.cpp
index 18e7f08..c98b252 100644
--- a/WebCore/platform/graphics/qt/ImageDecoderQt.cpp
+++ b/WebCore/platform/graphics/qt/ImageDecoderQt.cpp
@@ -57,7 +57,7 @@ ImageDecoderQt::~ImageDecoderQt()
 
 void ImageDecoderQt::setData(SharedBuffer* data, bool allDataReceived)
 {
-    if (m_failed)
+    if (failed())
         return;
 
     // No progressive loading possible
@@ -106,9 +106,8 @@ size_t ImageDecoderQt::frameCount()
                 forceLoadEverything();
             else
                 m_frameBufferCache.resize(imageCount);
-        } else {
+        } else
             m_frameBufferCache.resize(1);
-        }
     }
 
     return m_frameBufferCache.size();
@@ -133,7 +132,7 @@ RGBA32Buffer* ImageDecoderQt::frameBufferAtIndex(size_t index)
     // yet how many images we are going to have and need to
     // find that out now.
     size_t count = m_frameBufferCache.size();
-    if (!m_failed && !count) {
+    if (!failed() && !count) {
         internalDecodeSize();
         count = frameCount();
     }
@@ -157,8 +156,10 @@ void ImageDecoderQt::internalDecodeSize()
 
     // If we have a QSize() something failed
     QSize size = m_reader->size();
-    if (size.isEmpty())
-        return failRead();
+    if (size.isEmpty()) {
+        setFailed();
+        return clearPointers();
+    }
 
     setSize(size.width(), size.height());
 }
@@ -169,26 +170,31 @@ void ImageDecoderQt::internalReadImage(size_t frameIndex)
 
     if (m_reader->supportsAnimation())
         m_reader->jumpToImage(frameIndex);
-    else if (frameIndex != 0)
-        return failRead();
+    else if (frameIndex) {
+        setFailed();
+        return clearPointers();
+    }
 
-    internalHandleCurrentImage(frameIndex);
+    if (!internalHandleCurrentImage(frameIndex))
+      setFailed();
 
     // Attempt to return some memory
-    for (int i = 0; i < m_frameBufferCache.size(); ++i)
+    for (int i = 0; i < m_frameBufferCache.size(); ++i) {
         if (m_frameBufferCache[i].status() != RGBA32Buffer::FrameComplete)
             return;
+    }
 
-    m_reader.clear();
-    m_buffer.clear();
+    clearPointers();
 }
 
-void ImageDecoderQt::internalHandleCurrentImage(size_t frameIndex)
+bool ImageDecoderQt::internalHandleCurrentImage(size_t frameIndex)
 {
     // Now get the QImage from Qt and place it in the RGBA32Buffer
     QImage img;
-    if (!m_reader->read(&img))
-        return failRead();
+    if (!m_reader->read(&img)) {
+        clearPointers();
+        return false;
+    }
 
     // now into the RGBA32Buffer - even if the image is not
     QSize imageSize = img.size();
@@ -197,6 +203,7 @@ void ImageDecoderQt::internalHandleCurrentImage(size_t frameIndex)
     buffer->setStatus(RGBA32Buffer::FrameComplete);
     buffer->setDuration(m_reader->nextImageDelay());
     buffer->setDecodedImage(img);
+    return true;
 }
 
 // The QImageIOHandler is not able to tell us how many frames
@@ -204,8 +211,8 @@ void ImageDecoderQt::internalHandleCurrentImage(size_t frameIndex)
 // increasing the m_frameBufferCache by one and try to parse
 // the image. We stop when QImage::read fails and then need
 // to resize the m_frameBufferCache to the final size and update
-// the m_failed. In case we failed to decode the first image
-// we want to keep m_failed set to true.
+// the failed bit. If we failed to decode the first image
+// then we truly failed to decode, otherwise we're OK.
 
 // TODO: Do not increment the m_frameBufferCache.size() by one but more than one
 void ImageDecoderQt::forceLoadEverything()
@@ -214,20 +221,19 @@ void ImageDecoderQt::forceLoadEverything()
 
     do {
         m_frameBufferCache.resize(++imageCount);
-        internalHandleCurrentImage(imageCount - 1);
-    } while (!m_failed);
+    } while (internalHandleCurrentImage(imageCount - 1));
 
     // If we failed decoding the first image we actually
-    // have no images and need to keep m_failed set to
-    // true otherwise we want to reset it and forget about
+    // have no images and need to set the failed bit.
+    // Otherwise, we want to forget about
     // the last attempt to decode a image.
     m_frameBufferCache.resize(imageCount - 1);
-    m_failed = imageCount == 1;
+    if (imageCount == 1)
+      setFailed();
 }
 
-void ImageDecoderQt::failRead()
+void ImageDecoderQt::clearPointers()
 {
-    setFailed();
     m_reader.clear();
     m_buffer.clear();
 }
diff --git a/WebCore/platform/graphics/qt/ImageDecoderQt.h b/WebCore/platform/graphics/qt/ImageDecoderQt.h
index be9a9b0..ceef884 100644
--- a/WebCore/platform/graphics/qt/ImageDecoderQt.h
+++ b/WebCore/platform/graphics/qt/ImageDecoderQt.h
@@ -61,9 +61,9 @@ private:
 private:
     void internalDecodeSize();
     void internalReadImage(size_t);
-    void internalHandleCurrentImage(size_t);
+    bool internalHandleCurrentImage(size_t);
     void forceLoadEverything();
-    void failRead();
+    void clearPointers();
 
 private:
     QByteArray m_format;
diff --git a/WebCore/platform/image-decoders/ImageDecoder.h b/WebCore/platform/image-decoders/ImageDecoder.h
index 87bb6a9..4a81d0b 100644
--- a/WebCore/platform/image-decoders/ImageDecoder.h
+++ b/WebCore/platform/image-decoders/ImageDecoder.h
@@ -204,10 +204,10 @@ namespace WebCore {
     public:
         ImageDecoder()
             : m_scaled(false)
-            , m_failed(false)
             , m_sizeAvailable(false)
             , m_isAllDataReceived(false)
             , m_maxNumPixels(-1)
+            , m_failed(false)
         {
         }
 
@@ -226,6 +226,8 @@ namespace WebCore {
 
         virtual void setData(SharedBuffer* data, bool allDataReceived)
         {
+            if (failed())
+                return;
             m_data = data;
             m_isAllDataReceived = allDataReceived;
         }
@@ -267,10 +269,8 @@ namespace WebCore {
         // be set and the caller should immediately stop decoding.
         virtual bool setSize(unsigned width, unsigned height)
         {
-            if (isOverSize(width, height)) {
-                m_failed = true;
-                return false;
-            }
+            if (isOverSize(width, height))
+                return setFailed();
             m_size = IntSize(width, height);
             m_sizeAvailable = true;
             return true;
@@ -293,8 +293,16 @@ namespace WebCore {
         // transparency.
         virtual bool supportsAlpha() const { return true; }
 
+        // Sets the "decode failure" flag.  For caller convenience (since so
+        // many callers want to return false after calling this), returns false
+        // to enable easy tailcalling.
+        virtual bool setFailed()
+        {
+            m_failed = true;
+            return false;
+        }
+
         bool failed() const { return m_failed; }
-        void setFailed() { m_failed = true; }
 
         // Wipe out frames in the frame buffer cache before |clearBeforeFrame|,
         // assuming this can be done without breaking decoding.  Different
@@ -321,7 +329,6 @@ namespace WebCore {
         Vector<int> m_scaledRows;
         bool m_scaled;
         Vector<RGBA32Buffer> m_frameBufferCache;
-        bool m_failed;
 
     private:
         // Some code paths compute the size of the image as "width * height * 4"
@@ -339,6 +346,7 @@ namespace WebCore {
         bool m_sizeAvailable;
         bool m_isAllDataReceived;
         int m_maxNumPixels;
+        bool m_failed;
     };
 
 } // namespace WebCore
diff --git a/WebCore/platform/image-decoders/bmp/BMPImageDecoder.cpp b/WebCore/platform/image-decoders/bmp/BMPImageDecoder.cpp
index fb9f9f2..a6d36ef 100644
--- a/WebCore/platform/image-decoders/bmp/BMPImageDecoder.cpp
+++ b/WebCore/platform/image-decoders/bmp/BMPImageDecoder.cpp
@@ -57,7 +57,7 @@ void BMPImageDecoder::setData(SharedBuffer* data, bool allDataReceived)
 
 bool BMPImageDecoder::isSizeAvailable()
 {
-    if (!ImageDecoder::isSizeAvailable() && !failed())
+    if (!ImageDecoder::isSizeAvailable())
         decode(true);
 
     return ImageDecoder::isSizeAvailable();
@@ -72,7 +72,7 @@ RGBA32Buffer* BMPImageDecoder::frameBufferAtIndex(size_t index)
         m_frameBufferCache.resize(1);
 
     RGBA32Buffer* buffer = &m_frameBufferCache.first();
-    if (buffer->status() != RGBA32Buffer::FrameComplete && !failed())
+    if (buffer->status() != RGBA32Buffer::FrameComplete)
         decode(false);
     return buffer;
 }
@@ -131,12 +131,7 @@ bool BMPImageDecoder::processFileHeader(size_t* imgDataOffset)
         BITMAPARRAY = 0x4241,  // "BA"
         */
     };
-    if (fileType != BMAP) {
-        setFailed();
-        return false;
-    }
-
-    return true;
+    return (fileType == BMAP) || setFailed();
 }
 
 } // namespace WebCore
diff --git a/WebCore/platform/image-decoders/gif/GIFImageDecoder.cpp b/WebCore/platform/image-decoders/gif/GIFImageDecoder.cpp
index 807d57c..f56b357 100644
--- a/WebCore/platform/image-decoders/gif/GIFImageDecoder.cpp
+++ b/WebCore/platform/image-decoders/gif/GIFImageDecoder.cpp
@@ -42,7 +42,7 @@ GIFImageDecoder::~GIFImageDecoder()
 
 void GIFImageDecoder::setData(SharedBuffer* data, bool allDataReceived)
 {
-    if (m_failed)
+    if (failed())
         return;
 
     ImageDecoder::setData(data, allDataReceived);
@@ -50,13 +50,13 @@ void GIFImageDecoder::setData(SharedBuffer* data, bool allDataReceived)
     // We need to rescan the frame count, as the new data may have changed it.
     m_alreadyScannedThisDataForFrameCount = false;
 
-    if (!m_reader && !m_failed)
+    if (!m_reader && !failed())
         m_reader.set(new GIFImageReader(this));
 }
 
 bool GIFImageDecoder::isSizeAvailable()
 {
-    if (!ImageDecoder::isSizeAvailable() && !failed() && m_reader)
+    if (!ImageDecoder::isSizeAvailable())
          decode(0, GIFSizeQuery);
 
     return ImageDecoder::isSizeAvailable();
@@ -108,7 +108,7 @@ RGBA32Buffer* GIFImageDecoder::frameBufferAtIndex(size_t index)
         return 0;
 
     RGBA32Buffer& frame = m_frameBufferCache[index];
-    if (frame.status() != RGBA32Buffer::FrameComplete && m_reader)
+    if (frame.status() != RGBA32Buffer::FrameComplete)
         decode(index + 1, GIFFullQuery); // Decode this frame.
     return &frame;
 }
@@ -291,12 +291,13 @@ void GIFImageDecoder::gifComplete()
 
 void GIFImageDecoder::decode(unsigned haltAtFrame, GIFQuery query)
 {
-    if (m_failed)
+    if (failed() || !m_reader)
         return;
 
-    m_failed = !m_reader->read((const unsigned char*)m_data->data() + m_readOffset, m_data->size() - m_readOffset, query, haltAtFrame);
+    if (!m_reader->read((const unsigned char*)m_data->data() + m_readOffset, m_data->size() - m_readOffset, query, haltAtFrame))
+        setFailed();
 
-    if (m_failed)
+    if (failed())
         m_reader.clear();
 }
 
@@ -321,10 +322,8 @@ bool GIFImageDecoder::initFrameBuffer(unsigned frameIndex)
     
     if (!frameIndex) {
         // This is the first frame, so we're not relying on any previous data.
-        if (!buffer->setSize(scaledSize().width(), scaledSize().height())) {
-            m_failed = true;
-            return false;
-        }
+        if (!buffer->setSize(scaledSize().width(), scaledSize().height()))
+            return setFailed();
     } else {
         // The starting state for this frame depends on the previous frame's
         // disposal method.
@@ -353,10 +352,8 @@ bool GIFImageDecoder::initFrameBuffer(unsigned frameIndex)
             if (!frameIndex || prevRect.contains(IntRect(IntPoint(), scaledSize()))) {
                 // Clearing the first frame, or a frame the size of the whole
                 // image, results in a completely empty image.
-                if (!buffer->setSize(bufferSize.width(), bufferSize.height())) {
-                    m_failed = true;
-                    return false;
-                }
+                if (!buffer->setSize(bufferSize.width(), bufferSize.height()))
+                    return setFailed();
             } else {
               // Copy the whole previous buffer, then clear just its frame.
               buffer->copyBitmapData(*prevBuffer);
diff --git a/WebCore/platform/image-decoders/ico/ICOImageDecoder.cpp b/WebCore/platform/image-decoders/ico/ICOImageDecoder.cpp
index 1a202bc..fe6a30b 100644
--- a/WebCore/platform/image-decoders/ico/ICOImageDecoder.cpp
+++ b/WebCore/platform/image-decoders/ico/ICOImageDecoder.cpp
@@ -193,15 +193,10 @@ bool ICOImageDecoder::decodeAtIndex(size_t index)
     }
     // Fail if the size the PNGImageDecoder calculated does not match the size
     // in the directory.
-    if (m_pngDecoders[index]->isSizeAvailable() && (m_pngDecoders[index]->size() != dirEntry.m_size)) {
-        setFailed();
-        return false;
-    }
+    if (m_pngDecoders[index]->isSizeAvailable() && (m_pngDecoders[index]->size() != dirEntry.m_size))
+        return setFailed();
     m_frameBufferCache[index] = *m_pngDecoders[index]->frameBufferAtIndex(0);
-    if (!m_pngDecoders[index]->failed())
-      return true;
-    setFailed();
-    return false;
+    return !m_pngDecoders[index]->failed() || setFailed();
 }
 
 bool ICOImageDecoder::processDirectory()
@@ -220,10 +215,8 @@ bool ICOImageDecoder::processDirectory()
         ICON = 1,
         CURSOR = 2,
     };
-    if (((fileType != ICON) && (fileType != CURSOR)) || (!idCount)) {
-        setFailed();
-        return false;
-    }
+    if (((fileType != ICON) && (fileType != CURSOR)) || (!idCount))
+        return setFailed();
 
     // Enlarge member vectors to hold all the entries.
     m_dirEntries.resize(idCount);
@@ -244,10 +237,8 @@ bool ICOImageDecoder::processDirectoryEntries()
     // Make sure the specified image offsets are past the end of the directory
     // entries.
     for (IconDirectoryEntries::iterator i(m_dirEntries.begin()); i != m_dirEntries.end(); ++i) {
-        if (i->m_imageOffset < m_decodedOffset) {
-            setFailed();
-            return false;
-        }
+        if (i->m_imageOffset < m_decodedOffset)
+            return setFailed();
     }
 
     // Arrange frames in decreasing quality order.
diff --git a/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp b/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp
index 9ed20b6..14d5e18 100644
--- a/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp
+++ b/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp
@@ -192,7 +192,6 @@ public:
                 m_info.out_color_space = JCS_CMYK;
                 break;
             default:
-                m_state = JPEG_ERROR;
                 return false;
             }
 
@@ -212,10 +211,8 @@ public:
             m_state = JPEG_START_DECOMPRESS;
 
             // We can fill in the size now that the header is available.
-            if (!m_decoder->setSize(m_info.image_width, m_info.image_height)) {
-                m_state = JPEG_ERROR;
+            if (!m_decoder->setSize(m_info.image_width, m_info.image_height))
                 return false;
-            }
 
             if (m_decodingSizeOnly) {
                 // We can stop here.  Reduce our buffer length and available
@@ -316,7 +313,8 @@ public:
             break;
 
         case JPEG_ERROR:
-            break;
+            // We can get here if the constructor failed.
+            return m_decoder->setFailed();
         }
 
         return true;
@@ -382,18 +380,18 @@ JPEGImageDecoder::~JPEGImageDecoder()
 
 void JPEGImageDecoder::setData(SharedBuffer* data, bool allDataReceived)
 {
-    if (m_failed)
+    if (failed())
         return;
 
     ImageDecoder::setData(data, allDataReceived);
 
-    if (!m_reader && !m_failed)
+    if (!m_reader && !failed())
         m_reader.set(new JPEGImageReader(this));
 }
 
 bool JPEGImageDecoder::isSizeAvailable()
 {
-    if (!ImageDecoder::isSizeAvailable() && !failed() && m_reader)
+    if (!ImageDecoder::isSizeAvailable())
          decode(true);
 
     return ImageDecoder::isSizeAvailable();
@@ -417,7 +415,7 @@ RGBA32Buffer* JPEGImageDecoder::frameBufferAtIndex(size_t index)
         m_frameBufferCache.resize(1);
 
     RGBA32Buffer& frame = m_frameBufferCache[0];
-    if (frame.status() != RGBA32Buffer::FrameComplete && m_reader)
+    if (frame.status() != RGBA32Buffer::FrameComplete)
         decode(false);
     return &frame;
 }
@@ -430,10 +428,8 @@ bool JPEGImageDecoder::outputScanlines()
     // Initialize the framebuffer if needed.
     RGBA32Buffer& buffer = m_frameBufferCache[0];
     if (buffer.status() == RGBA32Buffer::FrameEmpty) {
-        if (!buffer.setSize(scaledSize().width(), scaledSize().height())) {
-            m_failed = true;
-            return false;
-        }
+        if (!buffer.setSize(scaledSize().width(), scaledSize().height()))
+            return setFailed();
         buffer.setStatus(RGBA32Buffer::FramePartial);
         buffer.setHasAlpha(false);
 
@@ -474,8 +470,7 @@ bool JPEGImageDecoder::outputScanlines()
                 buffer.setRGBA(x, destY, jsample[0] * k / 255, jsample[1] * k / 255, jsample[2] * k / 255, 0xFF);
             } else {
                 ASSERT_NOT_REACHED();
-                m_failed = true;
-                return false;
+                return setFailed();
             }
         }
     }
@@ -495,12 +490,13 @@ void JPEGImageDecoder::jpegComplete()
 
 void JPEGImageDecoder::decode(bool onlySize)
 {
-    if (m_failed)
+    if (failed() || !m_reader)
         return;
 
-    m_failed = !m_reader->decode(m_data->buffer(), onlySize);
+    if (!m_reader->decode(m_data->buffer(), onlySize))
+        setFailed();
 
-    if (m_failed || (!m_frameBufferCache.isEmpty() && m_frameBufferCache[0].status() == RGBA32Buffer::FrameComplete))
+    if (failed() || (!m_frameBufferCache.isEmpty() && m_frameBufferCache[0].status() == RGBA32Buffer::FrameComplete))
         m_reader.clear();
 }
 
diff --git a/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp b/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp
index 961ff03..79fdab5 100644
--- a/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp
+++ b/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp
@@ -54,7 +54,6 @@ const unsigned long cMaxPNGSize = 1000000UL;
 // Called if the decoding of the image fails.
 static void PNGAPI decodingFailed(png_structp png, png_const_charp)
 {
-    static_cast<PNGImageDecoder*>(png_get_progressive_ptr(png))->decodingFailed();
     longjmp(png->jmpbuf, 1);
 }
 
@@ -127,14 +126,15 @@ public:
     void decode(const SharedBuffer& data, bool sizeOnly)
     {
         m_decodingSizeOnly = sizeOnly;
+        PNGImageDecoder* decoder = static_cast<PNGImageDecoder*>(png_get_progressive_ptr(m_png));
 
         // We need to do the setjmp here. Otherwise bad things will happen.
         if (setjmp(m_png->jmpbuf)) {
             close();
+            decoder->setFailed();
             return;
         }
 
-        PNGImageDecoder* decoder = static_cast<PNGImageDecoder*>(png_get_progressive_ptr(m_png));
         const char* segment;
         while (unsigned segmentLength = data.getSomeData(segment, m_readOffset)) {
             m_readOffset += segmentLength;
@@ -182,17 +182,17 @@ PNGImageDecoder::~PNGImageDecoder()
 
 void PNGImageDecoder::setData(SharedBuffer* data, bool allDataReceived)
 {
-    if (m_failed)
+    if (failed())
         return;
 
     ImageDecoder::setData(data, allDataReceived);
 
-    if (!m_reader && !m_failed)
+    if (!m_reader && !failed())
         m_reader.set(new PNGImageReader(this));
 }
 bool PNGImageDecoder::isSizeAvailable()
 {
-    if (!ImageDecoder::isSizeAvailable() && !failed() && m_reader)
+    if (!ImageDecoder::isSizeAvailable())
          decode(true);
 
     return ImageDecoder::isSizeAvailable();
@@ -207,17 +207,11 @@ RGBA32Buffer* PNGImageDecoder::frameBufferAtIndex(size_t index)
         m_frameBufferCache.resize(1);
 
     RGBA32Buffer& frame = m_frameBufferCache[0];
-    if (frame.status() != RGBA32Buffer::FrameComplete && m_reader)
-        // Decode this frame.
-        decode(false);
+    if (frame.status() != RGBA32Buffer::FrameComplete)
+        decode(false); // Decode this frame.
     return &frame;
 }
 
-void PNGImageDecoder::decodingFailed()
-{
-    m_failed = true;
-}
-
 void PNGImageDecoder::headerAvailable()
 {
     png_structp png = m_reader->pngPtr();
@@ -227,7 +221,6 @@ void PNGImageDecoder::headerAvailable()
     
     // Protect against large images.
     if (png->width > cMaxPNGSize || png->height > cMaxPNGSize) {
-        m_failed = true;
         longjmp(png->jmpbuf, 1);
         return;
     }
@@ -302,7 +295,6 @@ void PNGImageDecoder::rowAvailable(unsigned char* rowBuffer, unsigned rowIndex,
     RGBA32Buffer& buffer = m_frameBufferCache[0];
     if (buffer.status() == RGBA32Buffer::FrameEmpty) {
         if (!buffer.setSize(scaledSize().width(), scaledSize().height())) {
-            static_cast<PNGImageDecoder*>(png_get_progressive_ptr(m_reader->pngPtr()))->decodingFailed();
             longjmp(m_reader->pngPtr()->jmpbuf, 1);
             return;
         }
@@ -385,12 +377,12 @@ void PNGImageDecoder::pngComplete()
 
 void PNGImageDecoder::decode(bool onlySize)
 {
-    if (m_failed)
+    if (failed() || !m_reader)
         return;
 
     m_reader->decode(*m_data, onlySize);
     
-    if (m_failed || (!m_frameBufferCache.isEmpty() && m_frameBufferCache[0].status() == RGBA32Buffer::FrameComplete))
+    if (failed() || (!m_frameBufferCache.isEmpty() && m_frameBufferCache[0].status() == RGBA32Buffer::FrameComplete))
         m_reader.clear();
 }
 
diff --git a/WebCore/platform/image-decoders/png/PNGImageDecoder.h b/WebCore/platform/image-decoders/png/PNGImageDecoder.h
index ba0e19a..c3b33bd 100644
--- a/WebCore/platform/image-decoders/png/PNGImageDecoder.h
+++ b/WebCore/platform/image-decoders/png/PNGImageDecoder.h
@@ -46,7 +46,6 @@ namespace WebCore {
         virtual RGBA32Buffer* frameBufferAtIndex(size_t index);
 
         // Callbacks from libpng
-        void decodingFailed();
         void headerAvailable();
         void rowAvailable(unsigned char* rowBuffer, unsigned rowIndex, int interlacePass);
         void pngComplete();

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list