[SCM] WebKit Debian packaging branch, webkit-1.1, updated. upstream/1.1.22-985-g3c00f00
pkasting at chromium.org
pkasting at chromium.org
Wed Mar 17 18:28:37 UTC 2010
The following commit has been merged in the webkit-1.1 branch:
commit 1d8d36e3bb9c0073e466f89bbfce6d7f3e9dacb8
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