summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorBogDan Vatra <bogdan@kde.org>2014-02-18 15:35:13 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-02-21 15:50:43 +0100
commit5e05c230af6b53d4323d3d8a445c5af1b1ba546a (patch)
tree7158c0c1903776a971672da3a3108864e5d69bd7 /src/plugins
parentef2527df6803f43519a84c15f6bf2ff9f69ef25c (diff)
Fix paint artifacts.
Android is using double buffering, so, we need to repaint the bounding rect of the repaint region, otherwise black holes will appear. Change-Id: I21f36a6f5f1a6c64b605c0fef3af10dfdc5ec6e2 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/platforms/android/qandroidplatformrasterwindow.cpp5
-rw-r--r--src/plugins/platforms/android/qandroidplatformscreen.cpp56
-rw-r--r--src/plugins/platforms/android/qandroidplatformscreen.h2
3 files changed, 31 insertions, 32 deletions
diff --git a/src/plugins/platforms/android/qandroidplatformrasterwindow.cpp b/src/plugins/platforms/android/qandroidplatformrasterwindow.cpp
index 68545c6562..334b9cdd23 100644
--- a/src/plugins/platforms/android/qandroidplatformrasterwindow.cpp
+++ b/src/plugins/platforms/android/qandroidplatformrasterwindow.cpp
@@ -54,6 +54,9 @@ QAndroidPlatformRasterWindow::QAndroidPlatformRasterWindow(QWindow *window)
void QAndroidPlatformRasterWindow::repaint(const QRegion &region)
{
+ if (QAndroidPlatformWindow::parent())
+ return;
+
QRect currentGeometry = geometry().translated(mapToGlobal(QPoint(0,0)));
QRect dirtyClient = region.boundingRect();
@@ -71,7 +74,7 @@ void QAndroidPlatformRasterWindow::repaint(const QRegion &region)
void QAndroidPlatformRasterWindow::setGeometry(const QRect &rect)
{
- m_oldGeometry = geometry();
+ m_oldGeometry = geometry().translated(mapToGlobal(QPoint(0,0)));;
QAndroidPlatformWindow::setGeometry(rect);
}
diff --git a/src/plugins/platforms/android/qandroidplatformscreen.cpp b/src/plugins/platforms/android/qandroidplatformscreen.cpp
index dd86a80d23..c6c2c13565 100644
--- a/src/plugins/platforms/android/qandroidplatformscreen.cpp
+++ b/src/plugins/platforms/android/qandroidplatformscreen.cpp
@@ -197,7 +197,7 @@ void QAndroidPlatformScreen::scheduleUpdate()
void QAndroidPlatformScreen::setDirty(const QRect &rect)
{
QRect intersection = rect.intersected(m_geometry);
- m_repaintRegion += intersection;
+ m_dirtyRect |= intersection;
scheduleUpdate();
}
@@ -241,11 +241,9 @@ void QAndroidPlatformScreen::doRedraw()
{
PROFILE_SCOPE;
- if (m_repaintRegion.isEmpty())
+ if (m_dirtyRect.isEmpty())
return;
- QVector<QRect> rects = m_repaintRegion.rects();
-
QMutexLocker lock(&m_surfaceMutex);
if (m_id == -1) {
m_id = QtAndroid::createSurface(this, m_geometry, true);
@@ -257,11 +255,10 @@ void QAndroidPlatformScreen::doRedraw()
ANativeWindow_Buffer nativeWindowBuffer;
ARect nativeWindowRect;
- QRect br = m_repaintRegion.boundingRect();
- nativeWindowRect.top = br.top();
- nativeWindowRect.left = br.left();
- nativeWindowRect.bottom = br.bottom() + 1; // for some reason that I don't understand the QRect bottom needs to +1 to be the same with ARect bottom
- nativeWindowRect.right = br.right() + 1; // same for the right
+ nativeWindowRect.top = m_dirtyRect.top();
+ nativeWindowRect.left = m_dirtyRect.left();
+ nativeWindowRect.bottom = m_dirtyRect.bottom() + 1; // for some reason that I don't understand the QRect bottom needs to +1 to be the same with ARect bottom
+ nativeWindowRect.right = m_dirtyRect.right() + 1; // same for the right
int ret;
if ((ret = ANativeWindow_lock(m_nativeSurface, &nativeWindowBuffer, &nativeWindowRect)) < 0) {
@@ -283,36 +280,35 @@ void QAndroidPlatformScreen::doRedraw()
QPainter compositePainter(&screenImage);
compositePainter.setCompositionMode(QPainter::CompositionMode_Source);
- for (int rectIndex = 0; rectIndex < rects.size(); rectIndex++) {
- QRegion visibleRegion = rects[rectIndex];
- foreach (QAndroidPlatformWindow *window, m_windowStack) {
- if (!window->window()->isVisible()
- || !window->isRaster())
- continue;
+ QRegion visibleRegion(m_dirtyRect);
+ foreach (QAndroidPlatformWindow *window, m_windowStack) {
+ if (!window->window()->isVisible()
+ || !window->isRaster())
+ continue;
- foreach (const QRect &rect, visibleRegion.rects()) {
- QRect targetRect = window->geometry();
- targetRect &= rect;
+ QVector<QRect> visibleRects = visibleRegion.rects();
+ foreach (const QRect &rect, visibleRects) {
+ QRect targetRect = window->geometry();
+ targetRect &= rect;
- if (targetRect.isNull())
- continue;
+ if (targetRect.isNull())
+ continue;
- visibleRegion -= targetRect;
- QRect windowRect = targetRect.translated(-window->geometry().topLeft());
- QAndroidPlatformBackingStore *backingStore = static_cast<QAndroidPlatformRasterWindow *>(window)->backingStore();
- if (backingStore)
- compositePainter.drawImage(targetRect.topLeft(), backingStore->image(), windowRect);
- }
+ visibleRegion -= targetRect;
+ QRect windowRect = targetRect.translated(-window->geometry().topLeft());
+ QAndroidPlatformBackingStore *backingStore = static_cast<QAndroidPlatformRasterWindow *>(window)->backingStore();
+ if (backingStore)
+ compositePainter.drawImage(targetRect.topLeft(), backingStore->image(), windowRect);
}
+ }
- foreach (const QRect &rect, visibleRegion.rects()) {
- compositePainter.fillRect(rect, QColor(Qt::transparent));
- }
+ foreach (const QRect &rect, visibleRegion.rects()) {
+ compositePainter.fillRect(rect, QColor(Qt::transparent));
}
ret = ANativeWindow_unlockAndPost(m_nativeSurface);
if (ret >= 0)
- m_repaintRegion = QRegion();
+ m_dirtyRect = QRect();
}
QDpi QAndroidPlatformScreen::logicalDpi() const
diff --git a/src/plugins/platforms/android/qandroidplatformscreen.h b/src/plugins/platforms/android/qandroidplatformscreen.h
index d3de937548..625e77840e 100644
--- a/src/plugins/platforms/android/qandroidplatformscreen.h
+++ b/src/plugins/platforms/android/qandroidplatformscreen.h
@@ -91,7 +91,7 @@ public slots:
protected:
typedef QList<QAndroidPlatformWindow *> WindowStackType;
WindowStackType m_windowStack;
- QRegion m_repaintRegion;
+ QRect m_dirtyRect;
QTimer m_redrawTimer;
QRect m_geometry;