diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/imageformats/webp/qwebphandler.cpp | 16 |
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; |