summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@theqtcompany.com>2016-04-08 17:27:14 +0200
committerLaszlo Agocs <laszlo.agocs@theqtcompany.com>2016-05-09 15:56:20 +0000
commit844ea8beea8d8edb68fea18017cdc57592b2808c (patch)
tree9022f103b0231239bcd07c73e88fb273d9407b80 /src
parent1e971f855546f1b94c7cdf7a31ad64ebe6c3e23d (diff)
linuxfb: Support transparency
Always clearing to opaque black makes it impossible to create semi-transparent overlays with linuxfb. Instead, behave like other platforms' backingstores: if the target image has an alpha channel, clear to transparent instead and set the correct composition mode. Task-number: QTBUG-52475 Change-Id: I2db4588e0112e200a3aa5eed49f806c37d7ca8b5 Reviewed-by: Louai Al-Khanji <louai.al-khanji@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/platformsupport/fbconvenience/qfbbackingstore.cpp11
-rw-r--r--src/platformsupport/fbconvenience/qfbscreen.cpp5
-rw-r--r--src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp7
3 files changed, 19 insertions, 4 deletions
diff --git a/src/platformsupport/fbconvenience/qfbbackingstore.cpp b/src/platformsupport/fbconvenience/qfbbackingstore.cpp
index 2800a81507..5eddf71145 100644
--- a/src/platformsupport/fbconvenience/qfbbackingstore.cpp
+++ b/src/platformsupport/fbconvenience/qfbbackingstore.cpp
@@ -37,6 +37,7 @@
#include <qpa/qplatformwindow.h>
#include <QtGui/qscreen.h>
+#include <QtGui/qpainter.h>
QT_BEGIN_NAMESPACE
@@ -84,9 +85,17 @@ void QFbBackingStore::unlock()
mImageMutex.unlock();
}
-void QFbBackingStore::beginPaint(const QRegion &)
+void QFbBackingStore::beginPaint(const QRegion &region)
{
lock();
+
+ if (mImage.hasAlphaChannel()) {
+ QPainter p(&mImage);
+ p.setCompositionMode(QPainter::CompositionMode_Source);
+ const QVector<QRect> rects = region.rects();
+ for (QVector<QRect>::const_iterator it = rects.begin(); it != rects.end(); ++it)
+ p.fillRect(*it, Qt::transparent);
+ }
}
void QFbBackingStore::endPaint()
diff --git a/src/platformsupport/fbconvenience/qfbscreen.cpp b/src/platformsupport/fbconvenience/qfbscreen.cpp
index d00954375d..ad4c62f4a6 100644
--- a/src/platformsupport/fbconvenience/qfbscreen.cpp
+++ b/src/platformsupport/fbconvenience/qfbscreen.cpp
@@ -233,6 +233,7 @@ QRegion QFbScreen::doRedraw()
if (!mCompositePainter)
mCompositePainter = new QPainter(mScreenImage);
+
for (int rectIndex = 0; rectIndex < mRepaintRegion.rectCount(); rectIndex++) {
QRegion rectRegion = rects[rectIndex];
@@ -250,7 +251,8 @@ QRegion QFbScreen::doRedraw()
foreach (const QRect &rect, intersect.rects()) {
bool firstLayer = true;
if (layer == -1) {
- mCompositePainter->fillRect(rect, Qt::black);
+ mCompositePainter->setCompositionMode(QPainter::CompositionMode_Source);
+ mCompositePainter->fillRect(rect, mScreenImage->hasAlphaChannel() ? Qt::transparent : Qt::black);
firstLayer = false;
layer = mWindowStack.size() - 1;
}
@@ -283,6 +285,7 @@ QRegion QFbScreen::doRedraw()
QRect cursorRect;
if (mCursor && (mCursor->isDirty() || mRepaintRegion.intersects(mCursor->lastPainted()))) {
+ mCompositePainter->setCompositionMode(QPainter::CompositionMode_SourceOver);
cursorRect = mCursor->drawCursor(*mCompositePainter);
touchedRegion += cursorRect;
}
diff --git a/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp b/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp
index 8c3e73fd80..13e06ef104 100644
--- a/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp
+++ b/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp
@@ -405,9 +405,12 @@ QRegion QLinuxFbScreen::doRedraw()
if (!mBlitter)
mBlitter = new QPainter(&mFbScreenImage);
- QVector<QRect> rects = touched.rects();
- for (int i = 0; i < rects.size(); i++)
+ const QVector<QRect> rects = touched.rects();
+ mBlitter->setCompositionMode(QPainter::CompositionMode_Source);
+
+ for (int i = 0; i < rects.size(); ++i)
mBlitter->drawImage(rects[i], *mScreenImage, rects[i]);
+
return touched;
}