summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/graphics/qt/ImageDecoderQt.cpp
diff options
context:
space:
mode:
authorSteve Block <steveblock@google.com>2009-11-05 09:23:40 +0000
committerSteve Block <steveblock@google.com>2009-11-10 22:41:12 +0000
commitcac0f67c402d107cdb10971b95719e2ff9c7c76b (patch)
treed182c7f87211c6f201a5f038e332336493ebdbe7 /WebCore/platform/graphics/qt/ImageDecoderQt.cpp
parent4b2ef0f288e7c6c4602f621b7a0e9feed304b70e (diff)
downloadexternal_webkit-cac0f67c402d107cdb10971b95719e2ff9c7c76b.zip
external_webkit-cac0f67c402d107cdb10971b95719e2ff9c7c76b.tar.gz
external_webkit-cac0f67c402d107cdb10971b95719e2ff9c7c76b.tar.bz2
Merge webkit.org at r50258 : Initial merge by git.
Change-Id: I1a9e1dc4ed654b69174ad52a4f031a07240f37b0
Diffstat (limited to 'WebCore/platform/graphics/qt/ImageDecoderQt.cpp')
-rw-r--r--WebCore/platform/graphics/qt/ImageDecoderQt.cpp62
1 files changed, 33 insertions, 29 deletions
diff --git a/WebCore/platform/graphics/qt/ImageDecoderQt.cpp b/WebCore/platform/graphics/qt/ImageDecoderQt.cpp
index 3a27fe3..f8403b7 100644
--- a/WebCore/platform/graphics/qt/ImageDecoderQt.cpp
+++ b/WebCore/platform/graphics/qt/ImageDecoderQt.cpp
@@ -43,22 +43,13 @@ ImageDecoder* ImageDecoder::create(const SharedBuffer& data)
if (data.size() < 4)
return 0;
- QByteArray bytes = QByteArray::fromRawData(data.data(), data.size());
- QBuffer buffer(&bytes);
- if (!buffer.open(QBuffer::ReadOnly))
- return 0;
-
- QByteArray imageFormat = QImageReader::imageFormat(&buffer);
- if (imageFormat.isEmpty())
- return 0; // Image format not supported
-
- return new ImageDecoderQt(imageFormat);
+ return new ImageDecoderQt;
}
-ImageDecoderQt::ImageDecoderQt(const QByteArray& imageFormat)
- : m_buffer(0)
+ImageDecoderQt::ImageDecoderQt()
+ : m_buffer(0)
, m_reader(0)
- , m_repetitionCount(-1)
+ , m_repetitionCount(cAnimationNone)
{
}
@@ -73,13 +64,13 @@ void ImageDecoderQt::setData(SharedBuffer* data, bool allDataReceived)
if (m_failed)
return;
- // Cache our own new data.
- ImageDecoder::setData(data, allDataReceived);
-
// No progressive loading possible
if (!allDataReceived)
return;
+ // Cache our own new data.
+ ImageDecoder::setData(data, allDataReceived);
+
// We expect to be only called once with allDataReceived
ASSERT(!m_buffer);
ASSERT(!m_reader);
@@ -89,15 +80,12 @@ void ImageDecoderQt::setData(SharedBuffer* data, bool allDataReceived)
m_buffer = new QBuffer;
m_buffer->setData(imageData);
m_buffer->open(QBuffer::ReadOnly);
- m_reader = new QImageReader(m_buffer);
-
- if (!m_reader->canRead())
- failRead();
+ m_reader = new QImageReader(m_buffer, m_format);
}
bool ImageDecoderQt::isSizeAvailable()
{
- if (!m_failed && !ImageDecoder::isSizeAvailable() && m_reader)
+ if (!ImageDecoder::isSizeAvailable() && m_reader)
internalDecodeSize();
return ImageDecoder::isSizeAvailable();
@@ -134,14 +122,16 @@ int ImageDecoderQt::repetitionCount() const
String ImageDecoderQt::filenameExtension() const
{
- return m_format;
+ return String(m_format.constData(), m_format.length());
};
RGBA32Buffer* ImageDecoderQt::frameBufferAtIndex(size_t index)
{
- // this information might not have been set
+ // In case the ImageDecoderQt got recreated we don't know
+ // yet how many images we are going to have and need to
+ // find that out now.
int count = m_frameBufferCache.size();
- if (count == 0) {
+ if (!m_failed && count == 0) {
internalDecodeSize();
count = frameCount();
}
@@ -171,7 +161,12 @@ void ImageDecoderQt::internalDecodeSize()
{
ASSERT(m_reader);
+ // If we have a QSize() something failed
QSize size = m_reader->size();
+ if (size.isEmpty())
+ return failRead();
+
+ m_format = m_reader->format();
setSize(size.width(), size.height());
}
@@ -213,9 +208,15 @@ void ImageDecoderQt::internalHandleCurrentImage(size_t frameIndex)
buffer->setDecodedImage(img);
}
-// We will parse everything and we have no idea how
-// many images we have... We will have to find out the
-// hard way.
+// The QImageIOHandler is not able to tell us how many frames
+// we have and we need to parse every image. We do this by
+// 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.
+
+// TODO: Do not increment the m_frameBufferCache.size() by one but more than one
void ImageDecoderQt::forceLoadEverything()
{
int imageCount = 0;
@@ -225,9 +226,12 @@ void ImageDecoderQt::forceLoadEverything()
internalHandleCurrentImage(imageCount - 1);
} while(!m_failed);
- // reset the failed state and resize the vector...
+ // 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
+ // the last attempt to decode a image.
m_frameBufferCache.resize(imageCount - 1);
- m_failed = false;
+ m_failed = imageCount == 1;
}
void ImageDecoderQt::failRead()