Make sure to clip in QXcbBackingStore::flush()
authorSamuel Rødal <samuel.rodal@nokia.com>
Mon, 19 Sep 2011 11:42:20 +0000 (13:42 +0200)
committerQt by Nokia <qt-info@nokia.com>
Mon, 19 Sep 2011 14:37:51 +0000 (16:37 +0200)
Clip to image and window dimensions to prevent X errors.

Change-Id: I7fa581217444e00d6eb83ac356c600f86ae03636
Reviewed-on: http://codereview.qt-project.org/5140
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Holger Ihrig <holger.ihrig@nokia.com>
src/plugins/platforms/xcb/qxcbbackingstore.cpp

index fadcb4d..df6cf31 100644 (file)
@@ -251,16 +251,25 @@ void QXcbBackingStore::endPaint(const QRegion &)
 
 void QXcbBackingStore::flush(QWindow *window, const QRegion &region, const QPoint &offset)
 {
-    QRect bounds = region.boundingRect();
-
     if (!m_image || m_image->size().isEmpty())
         return;
 
+    QSize imageSize = m_image->size();
+
+    QRegion clipped = region;
+    clipped &= QRect(0, 0, window->width(), window->height());
+    clipped &= QRect(0, 0, imageSize.width(), imageSize.height()).translated(-offset);
+
+    QRect bounds = clipped.boundingRect();
+
+    if (bounds.isNull())
+        return;
+
     Q_XCB_NOOP(connection());
 
     QXcbWindow *platformWindow = static_cast<QXcbWindow *>(window->handle());
 
-    QVector<QRect> rects = region.rects();
+    QVector<QRect> rects = clipped.rects();
     for (int i = 0; i < rects.size(); ++i)
         m_image->put(platformWindow->xcb_window(), rects.at(i).topLeft(), rects.at(i).translated(offset));