summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/graphics/qt/ImageDecoderQt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/graphics/qt/ImageDecoderQt.cpp')
-rw-r--r--WebCore/platform/graphics/qt/ImageDecoderQt.cpp258
1 files changed, 0 insertions, 258 deletions
diff --git a/WebCore/platform/graphics/qt/ImageDecoderQt.cpp b/WebCore/platform/graphics/qt/ImageDecoderQt.cpp
deleted file mode 100644
index 2bbb9ce..0000000
--- a/WebCore/platform/graphics/qt/ImageDecoderQt.cpp
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * Copyright (C) 2006 Friedemann Kleint <fkleint@trolltech.com>
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "ImageDecoderQt.h"
-
-#include <QtCore/QByteArray>
-#include <QtCore/QBuffer>
-
-#include <QtGui/QImageReader>
-#include <qdebug.h>
-
-namespace WebCore {
-
-ImageDecoder* ImageDecoder::create(const SharedBuffer& data, ImageSource::AlphaOption alphaOption, ImageSource::GammaAndColorProfileOption gammaAndColorProfileOption)
-{
- // We need at least 4 bytes to figure out what kind of image we're dealing with.
- if (data.size() < 4)
- return 0;
-
- return new ImageDecoderQt(alphaOption, gammaAndColorProfileOption);
-}
-
-ImageDecoderQt::ImageDecoderQt(ImageSource::AlphaOption alphaOption, ImageSource::GammaAndColorProfileOption gammaAndColorProfileOption)
- : ImageDecoder(alphaOption, gammaAndColorProfileOption)
- , m_repetitionCount(cAnimationNone)
-{
-}
-
-ImageDecoderQt::~ImageDecoderQt()
-{
-}
-
-void ImageDecoderQt::setData(SharedBuffer* data, bool allDataReceived)
-{
- if (failed())
- return;
-
- // 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);
-
- // Attempt to load the data
- QByteArray imageData = QByteArray::fromRawData(m_data->data(), m_data->size());
- m_buffer.set(new QBuffer);
- m_buffer->setData(imageData);
- m_buffer->open(QIODevice::ReadOnly | QIODevice::Unbuffered);
- m_reader.set(new QImageReader(m_buffer.get(), m_format));
-
- // This will force the JPEG decoder to use JDCT_IFAST
- m_reader->setQuality(49);
-
- // QImageReader only allows retrieving the format before reading the image
- m_format = m_reader->format();
-}
-
-bool ImageDecoderQt::isSizeAvailable()
-{
- if (!ImageDecoder::isSizeAvailable() && m_reader)
- internalDecodeSize();
-
- return ImageDecoder::isSizeAvailable();
-}
-
-size_t ImageDecoderQt::frameCount()
-{
- if (m_frameBufferCache.isEmpty() && m_reader) {
- if (m_reader->supportsAnimation()) {
- int imageCount = m_reader->imageCount();
-
- // Fixup for Qt decoders... imageCount() is wrong
- // and jumpToNextImage does not work either... so
- // we will have to parse everything...
- if (!imageCount)
- forceLoadEverything();
- else {
- m_frameBufferCache.resize(imageCount);
- for (size_t i = 0; i < m_frameBufferCache.size(); ++i)
- m_frameBufferCache[i].setPremultiplyAlpha(m_premultiplyAlpha);
- }
- } else {
- m_frameBufferCache.resize(1);
- m_frameBufferCache[0].setPremultiplyAlpha(m_premultiplyAlpha);
- }
- }
-
- return m_frameBufferCache.size();
-}
-
-int ImageDecoderQt::repetitionCount() const
-{
- if (m_reader && m_reader->supportsAnimation())
- m_repetitionCount = m_reader->loopCount();
- return m_repetitionCount;
-}
-
-String ImageDecoderQt::filenameExtension() const
-{
- return String(m_format.constData(), m_format.length());
-};
-
-RGBA32Buffer* ImageDecoderQt::frameBufferAtIndex(size_t index)
-{
- // 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.
- size_t count = m_frameBufferCache.size();
- if (!failed() && !count) {
- internalDecodeSize();
- count = frameCount();
- }
-
- if (index >= count)
- return 0;
-
- RGBA32Buffer& frame = m_frameBufferCache[index];
- if (frame.status() != RGBA32Buffer::FrameComplete && m_reader)
- internalReadImage(index);
- return &frame;
-}
-
-void ImageDecoderQt::clearFrameBufferCache(size_t /*index*/)
-{
-}
-
-void ImageDecoderQt::internalDecodeSize()
-{
- ASSERT(m_reader);
-
- // If we have a QSize() something failed
- QSize size = m_reader->size();
- if (size.isEmpty()) {
- setFailed();
- return clearPointers();
- }
-
- setSize(size.width(), size.height());
-}
-
-void ImageDecoderQt::internalReadImage(size_t frameIndex)
-{
- ASSERT(m_reader);
-
- if (m_reader->supportsAnimation())
- m_reader->jumpToImage(frameIndex);
- else if (frameIndex) {
- setFailed();
- return clearPointers();
- }
-
- if (!internalHandleCurrentImage(frameIndex))
- setFailed();
-
- // Attempt to return some memory
- for (int i = 0; i < m_frameBufferCache.size(); ++i) {
- if (m_frameBufferCache[i].status() != RGBA32Buffer::FrameComplete)
- return;
- }
-
- clearPointers();
-}
-
-bool ImageDecoderQt::internalHandleCurrentImage(size_t frameIndex)
-{
- QPixmap pixmap;
-
-#if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0)
- pixmap = QPixmap::fromImageReader(m_reader.get());
-#else
- QImage img;
- if (m_reader->read(&img))
- pixmap = QPixmap::fromImage(img);
-#endif
-
- if (pixmap.isNull()) {
- frameCount();
- repetitionCount();
- clearPointers();
- return false;
- }
-
- // now into the RGBA32Buffer - even if the image is not
- RGBA32Buffer* const buffer = &m_frameBufferCache[frameIndex];
- buffer->setRect(m_reader->currentImageRect());
- buffer->setStatus(RGBA32Buffer::FrameComplete);
- buffer->setDuration(m_reader->nextImageDelay());
- buffer->setPixmap(pixmap);
- return true;
-}
-
-// 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 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()
-{
- int imageCount = 0;
-
- do {
- m_frameBufferCache.resize(++imageCount);
- } while (internalHandleCurrentImage(imageCount - 1));
-
- // If we failed decoding the first image we actually
- // 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);
- for (size_t i = 0; i < m_frameBufferCache.size(); ++i)
- m_frameBufferCache[i].setPremultiplyAlpha(m_premultiplyAlpha);
- if (imageCount == 1)
- setFailed();
-}
-
-void ImageDecoderQt::clearPointers()
-{
- m_reader.clear();
- m_buffer.clear();
-}
-}
-
-// vim: ts=4 sw=4 et