Windows: Store only full-size DC's obtained by BeginPaint.
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>
Thu, 7 Jun 2012 11:42:13 +0000 (13:42 +0200)
committerQt by Nokia <qt-info@nokia.com>
Thu, 7 Jun 2012 15:13:38 +0000 (17:13 +0200)
Avoid painting bugs in case the DC covers only a part of the
window and QBackingStore does a full flush.

Task-number: QTBUG-26039

Change-Id: Ic918d9898ac824690273ac59bcb1e7e546cc698a
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
src/plugins/platforms/windows/qwindowswindow.cpp
src/plugins/platforms/windows/qwindowswindow.h

index fe38e60..4e93d2b 100644 (file)
@@ -989,7 +989,7 @@ HDC QWindowsWindow::getDC()
 
 void QWindowsWindow::releaseDC()
 {
-    if (m_hdc && !testFlag(WithinWmPaint)) {
+    if (m_hdc && !testFlag(DCFromBeginPaint)) {
         ReleaseDC(handle(), m_hdc);
         m_hdc = 0;
     }
@@ -1013,17 +1013,22 @@ bool QWindowsWindow::handleWmPaint(HWND hwnd, UINT message,
                                                              QRegion(qrectFromRECT(ps.rcPaint)));
         EndPaint(hwnd, &ps);
     } else {
-        releaseDC();
-        m_hdc = BeginPaint(hwnd, &ps);
-        setFlag(WithinWmPaint);
-
+        const HDC dc = BeginPaint(hwnd, &ps);
         const QRect updateRect = qrectFromRECT(ps.rcPaint);
+        if (updateRect.size() == m_data.geometry.size()) {
+            // Store DC for access by the backing store if it has the full size.
+            releaseDC();
+            setFlag(DCFromBeginPaint);
+            m_hdc = dc;
+        }
         if (QWindowsContext::verboseIntegration)
             qDebug() << __FUNCTION__ << this << window() << updateRect;
 
         QWindowSystemInterface::handleSynchronousExposeEvent(window(), QRegion(updateRect));
-        clearFlag(WithinWmPaint);
-        m_hdc = 0;
+        if (testFlag(DCFromBeginPaint)) {
+            clearFlag(DCFromBeginPaint);
+            m_hdc = 0;
+        }
         EndPaint(hwnd, &ps);
     }
     return true;
index 045da7d..208c0d2 100644 (file)
@@ -116,7 +116,7 @@ public:
 
     enum Flags
     {
-        WithinWmPaint = 0x1,
+        DCFromBeginPaint = 0x1,
         WithinSetParent = 0x2,
         FrameDirty = 0x4,            //! Frame outdated by setStyle, recalculate in next query.
         OpenGLSurface = 0x10,