summaryrefslogtreecommitdiffstats
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
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>
-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;