diff options
author | Laszlo Agocs <laszlo.agocs@digia.com> | 2014-08-13 10:05:52 +0200 |
---|---|---|
committer | Jørgen Lind <jorgen.lind@digia.com> | 2014-08-13 16:14:19 +0200 |
commit | 5621a7c5014ac337d41a00ca8f53f172bd17b792 (patch) | |
tree | 9dd679d1ea0319c989377a0e940b152e0a169350 /src/widgets/kernel | |
parent | 6c3c1a4cb8e4973b8e603edfbe608e1b1587f3f2 (diff) |
Fix composition for windows with alpha
While we will cover the entire surface with our textured quads, the clear
is still necessary in order to make top-levels with TranslucentBackground
render correctly: We don't want to blend transparent areas with undefined
content that is in the surface's framebuffer.
Blending is problematic for alpha values. We now prevent the blended alpha
from being written out. This ensures that in examples like qquickviewcomparison,
where the backingstore image contains an alpha of 0.5 while the QQuickWidget
texture 1.0, the result is still an alpha value of 1.0 in the final image.
Writing out an alpha of 0.5 would break on systems where windows get an alpha
buffer by default.
hellogl2 can now take a --transparent parameter which makes the QOpenGLWidget
being cleared to transparent in order to verify it works in combination
with Qt::WA_TranslucentBackground.
The swapped red and blue problem is also corrected. RGBA8888 does not need
swizzling. The only format that needs this is RGB32.
Task-number: QTBUG-40716
Change-Id: I54a9fd3a91a1b59575b38cdb908835315514e40f
Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
Diffstat (limited to 'src/widgets/kernel')
-rw-r--r-- | src/widgets/kernel/qopenglwidget.cpp | 16 | ||||
-rw-r--r-- | src/widgets/kernel/qwidgetbackingstore.cpp | 7 |
2 files changed, 17 insertions, 6 deletions
diff --git a/src/widgets/kernel/qopenglwidget.cpp b/src/widgets/kernel/qopenglwidget.cpp index 68e3082c14..d8f31bfcc8 100644 --- a/src/widgets/kernel/qopenglwidget.cpp +++ b/src/widgets/kernel/qopenglwidget.cpp @@ -365,6 +365,10 @@ QT_BEGIN_NAMESPACE where a semi-transparent QOpenGLWidget with other widgets visible underneath is required. + Note that this does not apply when there are no other widgets underneath and + the intention is to have a semi-transparent window. In that case the + traditional approach of setting Qt::WA_TranslucentBackground is sufficient. + \e{OpenGL is a trademark of Silicon Graphics, Inc. in the United States and other countries.} @@ -670,11 +674,13 @@ QOpenGLWidget::~QOpenGLWidget() OpenGL widgets, individual calls to this function can be replaced by one single call to QSurfaceFormat::setDefaultFormat() before creating the first widget. - \note Requesting an alpha buffer via this function will not lead to the desired results - and should be avoided. Instead, use Qt::WA_AlwaysStackOnTop to enable semi-transparent - QOpenGLWidget instances with other widgets visible underneath. Keep in mind however that - this breaks the stacking order, so it will no longer be possible to have other widgets - on top of the QOpenGLWidget. + \note Requesting an alpha buffer via this function, or by setting + Qt::WA_TranslucentBackground, will not lead to the desired results when the intention is + to make other widgets beneath visible. Instead, use Qt::WA_AlwaysStackOnTop to enable + semi-transparent QOpenGLWidget instances with other widgets visible underneath. Keep in + mind however that this breaks the stacking order, so it will no longer be possible to + have other widgets on top of the QOpenGLWidget. When the intention is to have a + semi-transparent top-level window, Qt::WA_TranslucentBackground is sufficient. \sa format(), Qt::WA_AlwaysStackOnTop, QSurfaceFormat::setDefaultFormat() */ diff --git a/src/widgets/kernel/qwidgetbackingstore.cpp b/src/widgets/kernel/qwidgetbackingstore.cpp index 6f635611f0..bb4518ec5e 100644 --- a/src/widgets/kernel/qwidgetbackingstore.cpp +++ b/src/widgets/kernel/qwidgetbackingstore.cpp @@ -113,7 +113,12 @@ void QWidgetBackingStore::qt_flush(QWidget *widget, const QRegion ®ion, QBack #ifndef QT_NO_OPENGL if (widgetTextures) { widget->window()->d_func()->sendComposeStatus(widget->window(), false); - backingStore->handle()->composeAndFlush(widget->windowHandle(), region, offset, widgetTextures, tlw->d_func()->shareContext()); + // A window may have alpha even when the app did not request + // WA_TranslucentBackground. Therefore the compositor needs to know whether the app intends + // to rely on translucency, in order to decide if it should clear to transparent or opaque. + const bool translucentBackground = widget->testAttribute(Qt::WA_TranslucentBackground); + backingStore->handle()->composeAndFlush(widget->windowHandle(), region, offset, widgetTextures, + widget->d_func()->shareContext(), translucentBackground); widget->window()->d_func()->sendComposeStatus(widget->window(), true); } else #endif |