Source/WebCore/ChangeLog

112012-05-30 Allan Sandfeld Jensen <allan.jensen@nokia.com>
22
 3 [Qt] ImageDecoderQt doesn't support some decoders.
 4 https://bugs.webkit.org/show_bug.cgi?id=87851
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 If forced to decode GIF and JPEG, ImageDecoderQt show several
 9 artifacts. This is caused by mismatched decoded image-formats.
 10
 11 Convert mismatched color spaces into ARGB color space, and perform
 12 manual mem-copy when the image has been decoded into a new buffer.
 13
 14 This patch also add support for down-scaling in the decoder.
 15
 16 * platform/graphics/qt/ImageDecoderQt.cpp:
 17 (WebCore::ImageDecoderQt::internalDecodeSize):
 18 (WebCore::ImageDecoderQt::internalHandleCurrentImage):
 19
 202012-05-30 Allan Sandfeld Jensen <allan.jensen@nokia.com>
 21
322 [Qt] Support IMAGE_DECODER_DOWN_SAMPLING flag.
423 https://bugs.webkit.org/show_bug.cgi?id=87840
524

Source/WebCore/platform/graphics/qt/ImageDecoderQt.cpp

@@void ImageDecoderQt::internalDecodeSize()
156156 }
157157
158158 setSize(size.width(), size.height());
 159
 160 // We don't need the tables set by prepareScaleDataIfNecessary,
 161 // but their dimensions are used by ImageDecoder::scaledSize().
 162 prepareScaleDataIfNecessary();
 163 if (m_scaled)
 164 m_reader->setScaledSize(scaledSize());
159165}
160166
161167void ImageDecoderQt::internalReadImage(size_t frameIndex)

@@void ImageDecoderQt::internalReadImage(size_t frameIndex)
184190bool ImageDecoderQt::internalHandleCurrentImage(size_t frameIndex)
185191{
186192 ImageFrame* const buffer = &m_frameBufferCache[frameIndex];
187  QSize imageSize = m_reader->size();
 193 QSize imageSize = m_reader->scaledSize();
 194 if (imageSize.isEmpty())
 195 imageSize = m_reader->size();
188196
189197 if (!buffer->setSize(imageSize.width(), imageSize.height()))
190198 return false;

@@bool ImageDecoderQt::internalHandleCurrentImage(size_t frameIndex)
194202 buffer->setDuration(m_reader->nextImageDelay());
195203 m_reader->read(&image);
196204
 205 // ImageFrame expects ARGB32.
 206 if (buffer->premultiplyAlpha()) {
 207 if (image.format() != QImage::Format_ARGB32_Premultiplied)
 208 image = image.convertToFormat(QImage::Format_ARGB32_Premultiplied);
 209 } else {
 210 if (image.format() != QImage::Format_ARGB32)
 211 image = image.convertToFormat(QImage::Format_ARGB32);
 212 }
 213
 214 if (reinterpret_cast<const uchar*>(image.constBits()) != reinterpret_cast<const uchar*>(buffer->getAddr(0, 0))) {
 215 // The in-buffer was replaced during decoding with another, so copy into it manually.
 216 memcpy(buffer->getAddr(0, 0), image.constBits(), image.byteCount());
 217 }
 218
197219 if (image.isNull()) {
198220 frameCount();
199221 repetitionCount();