summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/imageformats/webp/qwebphandler.cpp16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/plugins/imageformats/webp/qwebphandler.cpp b/src/plugins/imageformats/webp/qwebphandler.cpp
index f0b8caf..aab7aad 100644
--- a/src/plugins/imageformats/webp/qwebphandler.cpp
+++ b/src/plugins/imageformats/webp/qwebphandler.cpp
@@ -162,6 +162,7 @@ bool QWebpHandler::read(QImage *image)
if (!ensureScanned() || device()->isSequential() || !ensureDemuxer())
return false;
+ QRect prevFrameRect;
if (m_iter.frame_num == 0) {
// Read global meta-data chunks first
WebPChunkIterator metaDataIter;
@@ -177,6 +178,9 @@ bool QWebpHandler::read(QImage *image)
if (!WebPDemuxGetFrame(m_demuxer, 1, &m_iter))
return false;
} else {
+ if (m_iter.has_alpha && m_iter.dispose_method == WEBP_MUX_DISPOSE_BACKGROUND)
+ prevFrameRect = currentImageRect();
+
// Go to next frame
if (!WebPDemuxNextFrame(&m_iter))
return false;
@@ -208,8 +212,16 @@ bool QWebpHandler::read(QImage *image)
} else {
// Animation
QPainter painter(m_composited);
- if (m_features.has_alpha && m_iter.dispose_method == WEBP_MUX_DISPOSE_BACKGROUND)
- m_composited->fill(Qt::transparent);
+ if (!prevFrameRect.isEmpty()) {
+ painter.setCompositionMode(QPainter::CompositionMode_Clear);
+ painter.fillRect(prevFrameRect, Qt::black);
+ }
+ if (m_features.has_alpha) {
+ if (m_iter.blend_method == WEBP_MUX_NO_BLEND)
+ painter.setCompositionMode(QPainter::CompositionMode_Source);
+ else
+ painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
+ }
painter.drawImage(currentImageRect(), frame);
*image = *m_composited;