diff --git a/src/plugins/platforms/offscreen/qoffscreencommon.cpp b/src/plugins/platforms/offscreen/qoffscreencommon.cpp index 923fffb29c6..3fca2302068 100644 --- a/src/plugins/platforms/offscreen/qoffscreencommon.cpp +++ b/src/plugins/platforms/offscreen/qoffscreencommon.cpp @@ -148,7 +148,9 @@ void QOffscreenBackingStore::flush(QWindow *window, const QRegion ®ion, const void QOffscreenBackingStore::resize(const QSize &size, const QRegion &) { - QImage::Format format = QGuiApplication::primaryScreen()->handle()->format(); + QImage::Format format = window()->format().hasAlpha() + ? QImage::Format_ARGB32_Premultiplied + : QGuiApplication::primaryScreen()->handle()->format(); if (m_image.size() != size) m_image = QImage(size, format); clearHash(); @@ -167,6 +169,17 @@ bool QOffscreenBackingStore::scroll(const QRegion &area, int dx, int dy) return true; } +void QOffscreenBackingStore::beginPaint(const QRegion ®ion) +{ + if (QImage::toPixelFormat(m_image.format()).alphaUsage() == QPixelFormat::UsesAlpha) { + QPainter p(&m_image); + p.setCompositionMode(QPainter::CompositionMode_Source); + const QColor blank = Qt::transparent; + for (const QRect &r : region) + p.fillRect(r, blank); + } +} + QPixmap QOffscreenBackingStore::grabWindow(WId window, const QRect &rect) const { QRect area = m_windowAreaHash.value(window, QRect()); diff --git a/src/plugins/platforms/offscreen/qoffscreencommon.h b/src/plugins/platforms/offscreen/qoffscreencommon.h index a3d62271688..787af87cfff 100644 --- a/src/plugins/platforms/offscreen/qoffscreencommon.h +++ b/src/plugins/platforms/offscreen/qoffscreencommon.h @@ -68,6 +68,7 @@ public: void flush(QWindow *window, const QRegion ®ion, const QPoint &offset) override; void resize(const QSize &size, const QRegion &staticContents) override; bool scroll(const QRegion &area, int dx, int dy) override; + void beginPaint(const QRegion &) override; QPixmap grabWindow(WId window, const QRect &rect) const; QImage toImage() const override { return m_image; }